Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.DataAccess/3.4/HiveDao.cs @ 5053

Last change on this file since 5053 was 4905, checked in by cneumuel, 14 years ago

#1233

  • added plugin management features
  • took over client-GUI from old branch
  • merged with bugfixes from old branch
  • added hive-web (for IIS)
File size: 13.3 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Linq.Expressions;
6
7namespace HeuristicLab.Services.Hive.DataAccess {
8  using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
9  using HeuristicLab.Services.Hive.Common.DataTransfer;
10  using HeuristicLab.Services.Hive.DataAccess.Properties;
11
12  public class HiveDao : IHiveDao {
13    public static HiveDataContext CreateContext() {
14      return new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
15    }
16
17    public HiveDao() {
18    }
19
20    #region Job Methods
21    public DT.Job GetJob(Guid id) {
22      using (var db = CreateContext()) {
23        return Convert.ToDto(db.Jobs.SingleOrDefault(x => x.JobId == id));
24      }
25    }
26
27    public IEnumerable<DT.Job> GetJobs(Expression<Func<Job, bool>> predicate) {
28      using (var db = CreateContext()) {
29        return db.Jobs.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
30      }
31    }
32
33    public Guid AddJob(DT.Job dto) {
34      using (var db = CreateContext()) {
35        var entity = Convert.ToEntity(dto);
36        db.Jobs.InsertOnSubmit(entity);
37        db.SubmitChanges();
38        return entity.JobId;
39      }
40    }
41
42    public void UpdateJob(DT.Job dto) {
43      using (var db = CreateContext()) {
44        var entity = db.Jobs.FirstOrDefault(x => x.JobId == dto.Id);
45        if (entity == null) db.Jobs.InsertOnSubmit(Convert.ToEntity(dto));
46        else Convert.ToEntity(dto, entity);
47        db.SubmitChanges();
48      }
49    }
50
51    public void DeleteJob(Guid id) {
52      using (var db = CreateContext()) {
53        var entity = db.Jobs.FirstOrDefault(x => x.JobId == id);
54        if (entity != null) db.Jobs.DeleteOnSubmit(entity);
55        db.SubmitChanges();
56      }
57    }
58
59    public IEnumerable<DT.Job> GetAvailableParentJobs(Guid slaveId) {
60      using (var db = CreateContext()) {
61        // todo: slaveId is unused!
62        var query = from ar in db.AssignedResources
63                    where ar.Job.JobState == JobState.WaitingForChildJobs &&
64                      (from child in db.Jobs
65                       where child.ParentJobId == ar.Job.JobId
66                       select child.JobState == JobState.Finished).All(x => x) &&
67                      (from child in db.Jobs // avoid returning WaitForChildJobs jobs where no child-jobs exist (yet)
68                       where child.ParentJobId == ar.Job.JobId
69                       select child).Count() > 0
70                    orderby ar.Job.Priority descending
71                    select Convert.ToDto(ar.Job);
72        return query;
73      }
74    }
75
76    public IEnumerable<DT.Job> GetWaitingJobs(DT.Slave slave) {
77      using (var db = CreateContext()) {
78        var query = from j in db.Jobs
79                    where j.JobState == JobState.Waiting && j.CoresNeeded <= slave.FreeCores && j.MemoryNeeded <= slave.FreeMemory
80                    orderby j.Priority descending
81                    select Convert.ToDto(j);
82        return query.Union(GetAvailableParentJobs(slave.Id)).OrderByDescending(x => x.Priority).ToArray();
83      }
84    }
85    #endregion
86
87    #region JobData Methods
88
89    public DT.JobData GetJobData(Guid id) {
90      using (var db = CreateContext()) {
91        return Convert.ToDto(db.JobDatas.SingleOrDefault(x => x.JobId == id));
92      }
93    }
94
95    public IEnumerable<DT.JobData> GetJobDatas(Expression<Func<JobData, bool>> predicate) {
96      using (var db = CreateContext()) {
97        return db.JobDatas.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
98      }
99    }
100
101    public Guid AddJobData(DT.JobData dto) {
102      using (var db = CreateContext()) {
103        var entity = Convert.ToEntity(dto);
104        db.JobDatas.InsertOnSubmit(entity);
105        db.SubmitChanges();
106        return entity.JobId;
107      }
108    }
109
110    public void UpdateJobData(DT.JobData dto) {
111      using (var db = CreateContext()) {
112        var entity = db.JobDatas.FirstOrDefault(x => x.JobId == dto.JobId);
113        if (entity == null) db.JobDatas.InsertOnSubmit(Convert.ToEntity(dto));
114        else Convert.ToEntity(dto, entity);
115        db.SubmitChanges();
116      }
117    }
118
119    public void DeleteJobData(Guid id) {
120      using (var db = CreateContext()) {
121        var entity = db.JobDatas.FirstOrDefault(x => x.JobId == id); // check if all the byte[] is loaded into memory here. otherwise work around to delete without loading it
122        if (entity != null) db.JobDatas.DeleteOnSubmit(entity);
123        db.SubmitChanges();
124      }
125    }
126    #endregion
127
128    #region HiveExperiment Methods
129    public DT.HiveExperiment GetHiveExperiment(Guid id) {
130      using (var db = CreateContext()) {
131        return Convert.ToDto(db.HiveExperiments.SingleOrDefault(x => x.HiveExperimentId == id));
132      }
133    }
134
135    public IEnumerable<DT.HiveExperiment> GetHiveExperiments(Expression<Func<HiveExperiment, bool>> predicate) {
136      using (var db = CreateContext()) {
137        return db.HiveExperiments.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
138      }
139    }
140
141    public Guid AddHiveExperiment(DT.HiveExperiment dto) {
142      using (var db = CreateContext()) {
143        var entity = Convert.ToEntity(dto);
144        db.HiveExperiments.InsertOnSubmit(entity);
145        db.SubmitChanges();
146        return entity.HiveExperimentId;
147      }
148    }
149
150    public void UpdateHiveExperiment(DT.HiveExperiment dto) {
151      using (var db = CreateContext()) {
152        var entity = db.HiveExperiments.FirstOrDefault(x => x.HiveExperimentId == dto.Id);
153        if (entity == null) db.HiveExperiments.InsertOnSubmit(Convert.ToEntity(dto));
154        else Convert.ToEntity(dto, entity);
155        db.SubmitChanges();
156      }
157    }
158
159    public void DeleteHiveExperiment(Guid id) {
160      using (var db = CreateContext()) {
161        var entity = db.HiveExperiments.FirstOrDefault(x => x.HiveExperimentId == id);
162        if (entity != null) db.HiveExperiments.DeleteOnSubmit(entity);
163        db.SubmitChanges();
164      }
165    }
166    #endregion
167
168    #region Plugin Methods
169    public DT.Plugin GetPlugin(Guid id) {
170      using (var db = CreateContext()) {
171        return Convert.ToDto(db.Plugins.SingleOrDefault(x => x.PluginId == id));
172      }
173    }
174
175    public IEnumerable<DT.Plugin> GetPlugins(Expression<Func<Plugin, bool>> predicate) {
176      using (var db = CreateContext()) {
177        return db.Plugins.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
178      }
179    }
180
181    public Guid AddPlugin(DT.Plugin dto) {
182      using (var db = CreateContext()) {
183        var entity = Convert.ToEntity(dto);
184        db.Plugins.InsertOnSubmit(entity);
185        db.SubmitChanges();
186        return entity.PluginId;
187      }
188    }
189
190    public void UpdatePlugin(DT.Plugin dto) {
191      using (var db = CreateContext()) {
192        var entity = db.Plugins.FirstOrDefault(x => x.PluginId == dto.Id);
193        if (entity == null) db.Plugins.InsertOnSubmit(Convert.ToEntity(dto));
194        else Convert.ToEntity(dto, entity);
195        db.SubmitChanges();
196      }
197    }
198
199    public void DeletePlugin(Guid id) {
200      using (var db = CreateContext()) {
201        var entity = db.Plugins.FirstOrDefault(x => x.PluginId == id);
202        if (entity != null) db.Plugins.DeleteOnSubmit(entity);
203        db.SubmitChanges();
204      }
205    }
206    #endregion
207
208    #region PluginData Methods
209
210    public DT.PluginData GetPluginData(Guid id) {
211      using (var db = CreateContext()) {
212        return Convert.ToDto(db.PluginDatas.SingleOrDefault(x => x.PluginId == id));
213      }
214    }
215
216    public IEnumerable<DT.PluginData> GetPluginDatas(Expression<Func<PluginData, bool>> predicate) {
217      using (var db = CreateContext()) {
218        return db.PluginDatas.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
219      }
220    }
221
222    public Guid AddPluginData(DT.PluginData dto) {
223      using (var db = CreateContext()) {
224        var entity = Convert.ToEntity(dto);
225        db.PluginDatas.InsertOnSubmit(entity);
226        db.SubmitChanges();
227        return entity.PluginId;
228      }
229    }
230
231    public void UpdatePluginData(DT.PluginData dto) {
232      using (var db = CreateContext()) {
233        var entity = db.PluginDatas.FirstOrDefault(x => x.PluginId == dto.PluginId);
234        if (entity == null) db.PluginDatas.InsertOnSubmit(Convert.ToEntity(dto));
235        else Convert.ToEntity(dto, entity);
236        db.SubmitChanges();
237      }
238    }
239
240    public void DeletePluginData(Guid id) {
241      using (var db = CreateContext()) {
242        var entity = db.PluginDatas.FirstOrDefault(x => x.PluginId == id); // check if all the byte[] is loaded into memory here. otherwise work around to delete without loading it
243        if (entity != null) db.PluginDatas.DeleteOnSubmit(entity);
244        db.SubmitChanges();
245      }
246    }
247    #endregion
248
249    #region Slave Methods
250    public DT.Slave GetSlave(Guid id) {
251      using (var db = CreateContext()) {
252        return Convert.ToDto(db.Resources.OfType<Slave>().SingleOrDefault(x => x.ResourceId == id));
253      }
254    }
255
256    public IEnumerable<DT.Slave> GetSlaves(Expression<Func<Slave, bool>> predicate) {
257      using (var db = CreateContext()) {
258        return db.Resources.OfType<Slave>().Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
259      }
260    }
261
262    public Guid AddSlave(DT.Slave dto) {
263      using (var db = CreateContext()) {
264        var entity = Convert.ToEntity(dto);
265        db.Resources.InsertOnSubmit(entity);
266        db.SubmitChanges();
267        return entity.ResourceId;
268      }
269    }
270
271    public void UpdateSlave(DT.Slave dto) {
272      using (var db = CreateContext()) {
273        var entity = db.Resources.OfType<Slave>().FirstOrDefault(x => x.ResourceId == dto.Id);
274        if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
275        else Convert.ToEntity(dto, entity);
276        db.SubmitChanges();
277      }
278    }
279
280    public void DeleteSlave(Guid id) {
281      using (var db = CreateContext()) {
282        var entity = db.Resources.OfType<Slave>().FirstOrDefault(x => x.ResourceId == id);
283        if (entity != null) db.Resources.DeleteOnSubmit(entity);
284        db.SubmitChanges();
285      }
286    }
287    #endregion
288
289    #region SlaveGroup Methods
290    public DT.SlaveGroup GetSlaveGroup(Guid id) {
291      using (var db = CreateContext()) {
292        return Convert.ToDto(db.Resources.OfType<SlaveGroup>().SingleOrDefault(x => x.ResourceId == id));
293      }
294    }
295
296    public IEnumerable<DT.SlaveGroup> GetSlaveGroups(Expression<Func<SlaveGroup, bool>> predicate) {
297      using (var db = CreateContext()) {
298        return db.Resources.OfType<SlaveGroup>().Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
299      }
300    }
301
302    public Guid AddSlaveGroup(DT.SlaveGroup dto) {
303      using (var db = CreateContext()) {
304        var entity = Convert.ToEntity(dto);
305        db.Resources.InsertOnSubmit(entity);
306        db.SubmitChanges();
307        return entity.ResourceId;
308      }
309    }
310
311    public void UpdateSlaveGroup(DT.SlaveGroup dto) {
312      using (var db = CreateContext()) {
313        var entity = db.Resources.OfType<SlaveGroup>().FirstOrDefault(x => x.ResourceId == dto.Id);
314        if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
315        else Convert.ToEntity(dto, entity);
316        db.SubmitChanges();
317      }
318    }
319
320    public void DeleteSlaveGroup(Guid id) {
321      using (var db = CreateContext()) {
322        var entity = db.Resources.OfType<SlaveGroup>().FirstOrDefault(x => x.ResourceId == id);
323        if (entity != null) db.Resources.DeleteOnSubmit(entity);
324        db.SubmitChanges();
325      }
326    }
327    #endregion
328
329    #region Resource Methods
330    public DT.Resource GetResource(Guid id) {
331      using (var db = CreateContext()) {
332        return Convert.ToDto(db.Resources.SingleOrDefault(x => x.ResourceId == id));
333      }
334    }
335
336    public IEnumerable<DT.Resource> GetResources(Expression<Func<Resource, bool>> predicate) {
337      using (var db = CreateContext()) {
338        return db.Resources.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
339      }
340    }
341
342    public Guid AddResource(DT.Resource dto) {
343      using (var db = CreateContext()) {
344        var entity = Convert.ToEntity(dto);
345        db.Resources.InsertOnSubmit(entity);
346        db.SubmitChanges();
347        return entity.ResourceId;
348      }
349    }
350
351    public void UpdateResource(DT.Resource dto) {
352      using (var db = CreateContext()) {
353        var entity = db.Resources.FirstOrDefault(x => x.ResourceId == dto.Id);
354        if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
355        else Convert.ToEntity(dto, entity);
356        db.SubmitChanges();
357      }
358    }
359
360    public void DeleteResource(Guid id) {
361      using (var db = CreateContext()) {
362        var entity = db.Resources.FirstOrDefault(x => x.ResourceId == id);
363        if (entity != null) db.Resources.DeleteOnSubmit(entity);
364        db.SubmitChanges();
365      }
366    }
367    #endregion
368
369    #region Authorization Methods
370    public bool IsUserAuthorizedForJobs(Guid userId, params Guid[] jobIds) {
371      using (var db = CreateContext()) {
372        var userIds = from job in db.Jobs // this needs to be fast!
373                      where jobIds.Contains(job.JobId)
374                      select job.UserId;
375        return userIds.All(x => x == userId);
376      }
377    }
378    #endregion
379  }
380}
Note: See TracBrowser for help on using the repository browser.