Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 5636 was 5636, checked in by cneumuel, 13 years ago

#1233

  • updated jobstates documentation
  • enhanced ganttChart
  • fixed setting of jobstates
  • added option to force lifecycle-trigger (mainly for testing purposes)
File size: 23.9 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.Linq.Expressions;
26
27namespace HeuristicLab.Services.Hive.DataAccess {
28  using HeuristicLab.Services.Hive.Common.DataTransfer;
29  using HeuristicLab.Services.Hive.DataAccess.Properties;
30  using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
31
32  public class HiveDao : IHiveDao {
33    public static HiveDataContext CreateContext() {
34      return new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
35    }
36
37    public HiveDao() {
38    }
39
40    #region Job Methods
41    public DT.Job GetJob(Guid id) {
42      using (var db = CreateContext()) {
43        return Convert.ToDto(db.Jobs.SingleOrDefault(x => x.JobId == id));
44      }
45    }
46
47    public IEnumerable<DT.Job> GetJobs(Expression<Func<Job, bool>> predicate) {
48      using (var db = CreateContext()) {
49        return db.Jobs.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
50      }
51    }
52
53    public Guid AddJob(DT.Job dto) {
54      using (var db = CreateContext()) {
55        var entity = Convert.ToEntity(dto);
56        db.Jobs.InsertOnSubmit(entity);
57        db.SubmitChanges();
58        foreach (Guid pluginId in dto.PluginsNeededIds) {
59          db.RequiredPlugins.InsertOnSubmit(new RequiredPlugin() { JobId = entity.JobId, PluginId = pluginId });
60        }
61        db.SubmitChanges();
62        return entity.JobId;
63      }
64    }
65
66    public void UpdateJob(DT.Job dto) {
67      using (var db = CreateContext()) {
68        var entity = db.Jobs.FirstOrDefault(x => x.JobId == dto.Id);
69        if (entity == null) db.Jobs.InsertOnSubmit(Convert.ToEntity(dto));
70        else Convert.ToEntity(dto, entity);
71        // todo: update required plugins
72        db.SubmitChanges();
73      }
74    }
75
76    public void DeleteJob(Guid id) {
77      using (var db = CreateContext()) {
78        var entity = db.Jobs.FirstOrDefault(x => x.JobId == id);
79        if (entity != null) db.Jobs.DeleteOnSubmit(entity);
80        db.SubmitChanges(); // JobData and child jobs are deleted by db-trigger
81      }
82    }
83
84    /// <summary>
85    /// returns all parent jobs which are waiting for their child jobs to finish
86    /// </summary>
87    /// <param name="resourceIds">list of resourceids which for which the jobs should be valid</param>
88    /// <param name="count">maximum number of jobs to return</param>
89    /// <param name="finished">if true, all parent jobs which have FinishWhenChildJobsFinished=true are returned, otherwise only FinishWhenChildJobsFinished=false are returned</param>
90    /// <returns></returns>
91    public IEnumerable<DT.Job> GetParentJobs(IEnumerable<Guid> resourceIds, int count, bool finished) {
92      using (var db = CreateContext()) {
93        var query = from ar in db.AssignedResources
94                    where resourceIds.Contains(ar.ResourceId)
95                       && ar.Job.State == JobState.Waiting
96                       && ar.Job.IsParentJob
97                       && (finished ? ar.Job.FinishWhenChildJobsFinished : !ar.Job.FinishWhenChildJobsFinished)
98                       && (from child in db.Jobs
99                           where child.ParentJobId == ar.Job.JobId
100                           select child.State == JobState.Finished).All(x => x)
101                       && (from child in db.Jobs // avoid returning WaitForChildJobs jobs where no child-jobs exist (yet)
102                           where child.ParentJobId == ar.Job.JobId
103                           select child).Count() > 0
104                    orderby ar.Job.Priority descending
105                    select Convert.ToDto(ar.Job);
106        return count == 0 ? query.ToArray() : query.Take(count).ToArray();
107      }
108    }
109
110    public IEnumerable<DT.Job> GetWaitingJobs(DT.Slave slave, int count) {
111      using (var db = CreateContext()) {
112        var resourceIds = GetParentResources(slave.Id).Select(r => r.Id);
113        var waitingParentJobs = GetParentJobs(resourceIds, count, false);
114        if (count > 0 && waitingParentJobs.Count() >= count) return waitingParentJobs.Take(count).ToArray();
115
116        var query = from ar in db.AssignedResources
117                    where resourceIds.Contains(ar.ResourceId)
118                       && !(ar.Job.IsParentJob && ar.Job.FinishWhenChildJobsFinished)
119                       && ar.Job.State == JobState.Waiting
120                       && ar.Job.CoresNeeded <= slave.FreeCores
121                       && ar.Job.MemoryNeeded <= slave.FreeMemory
122                    orderby ar.Job.Priority descending
123                    select Convert.ToDto(ar.Job);
124        var waitingJobs = (count == 0 ? query : query.Take(count)).ToArray();
125        return waitingJobs.Union(waitingParentJobs).OrderByDescending(x => x.Priority);
126      }
127    }
128
129    public DT.Job UpdateJobState(Guid jobId, JobState jobState, Guid? slaveId, Guid? userId, string exception) {
130      using (var db = CreateContext()) {
131        var job = db.Jobs.SingleOrDefault(x => x.JobId == jobId);
132        job.State = jobState;
133        db.StateLogs.InsertOnSubmit(new StateLog {
134          JobId = jobId,
135          State = jobState,
136          SlaveId = slaveId,
137          UserId = userId,
138          Exception = exception,
139          DateTime = DateTime.Now
140        });
141        db.SubmitChanges();
142        job = db.Jobs.SingleOrDefault(x => x.JobId == jobId);
143        return Convert.ToDto(job);
144      }
145    }
146    #endregion
147
148    #region JobData Methods
149
150    public DT.JobData GetJobData(Guid id) {
151      using (var db = CreateContext()) {
152        return Convert.ToDto(db.JobDatas.SingleOrDefault(x => x.JobId == id));
153      }
154    }
155
156    public IEnumerable<DT.JobData> GetJobDatas(Expression<Func<JobData, bool>> predicate) {
157      using (var db = CreateContext()) {
158        return db.JobDatas.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
159      }
160    }
161
162    public Guid AddJobData(DT.JobData dto) {
163      using (var db = CreateContext()) {
164        var entity = Convert.ToEntity(dto);
165        db.JobDatas.InsertOnSubmit(entity);
166        db.SubmitChanges();
167        return entity.JobId;
168      }
169    }
170
171    public void UpdateJobData(DT.JobData dto) {
172      using (var db = CreateContext()) {
173        var entity = db.JobDatas.FirstOrDefault(x => x.JobId == dto.JobId);
174        if (entity == null) db.JobDatas.InsertOnSubmit(Convert.ToEntity(dto));
175        else Convert.ToEntity(dto, entity);
176        db.SubmitChanges();
177      }
178    }
179
180    public void DeleteJobData(Guid id) {
181      using (var db = CreateContext()) {
182        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
183        if (entity != null) db.JobDatas.DeleteOnSubmit(entity);
184        db.SubmitChanges();
185      }
186    }
187    #endregion
188
189    #region StateLog Methods
190
191    public DT.StateLog GetStateLog(Guid id) {
192      using (var db = CreateContext()) {
193        return Convert.ToDto(db.StateLogs.SingleOrDefault(x => x.StateLogId == id));
194      }
195    }
196
197    public IEnumerable<DT.StateLog> GetStateLogs(Expression<Func<StateLog, bool>> predicate) {
198      using (var db = CreateContext()) {
199        return db.StateLogs.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
200      }
201    }
202
203    public Guid AddStateLog(DT.StateLog dto) {
204      using (var db = CreateContext()) {
205        var entity = Convert.ToEntity(dto);
206        db.StateLogs.InsertOnSubmit(entity);
207        db.SubmitChanges();
208        return entity.StateLogId;
209      }
210    }
211
212    public void UpdateStateLog(DT.StateLog dto) {
213      using (var db = CreateContext()) {
214        var entity = db.StateLogs.FirstOrDefault(x => x.StateLogId == dto.Id);
215        if (entity == null) db.StateLogs.InsertOnSubmit(Convert.ToEntity(dto));
216        else Convert.ToEntity(dto, entity);
217        db.SubmitChanges();
218      }
219    }
220
221    public void DeleteStateLog(Guid id) {
222      using (var db = CreateContext()) {
223        var entity = db.StateLogs.FirstOrDefault(x => x.StateLogId == id);
224        if (entity != null) db.StateLogs.DeleteOnSubmit(entity);
225        db.SubmitChanges();
226      }
227    }
228    #endregion
229
230    #region HiveExperiment Methods
231    public DT.HiveExperiment GetHiveExperiment(Guid id) {
232      using (var db = CreateContext()) {
233        return Convert.ToDto(db.HiveExperiments.SingleOrDefault(x => x.HiveExperimentId == id));
234      }
235    }
236
237    public IEnumerable<DT.HiveExperiment> GetHiveExperiments(Expression<Func<HiveExperiment, bool>> predicate) {
238      using (var db = CreateContext()) {
239        return db.HiveExperiments.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
240      }
241    }
242
243    public Guid AddHiveExperiment(DT.HiveExperiment dto) {
244      using (var db = CreateContext()) {
245        var entity = Convert.ToEntity(dto);
246        db.HiveExperiments.InsertOnSubmit(entity);
247        db.SubmitChanges();
248        return entity.HiveExperimentId;
249      }
250    }
251
252    public void UpdateHiveExperiment(DT.HiveExperiment dto) {
253      using (var db = CreateContext()) {
254        var entity = db.HiveExperiments.FirstOrDefault(x => x.HiveExperimentId == dto.Id);
255        if (entity == null) db.HiveExperiments.InsertOnSubmit(Convert.ToEntity(dto));
256        else Convert.ToEntity(dto, entity);
257        db.SubmitChanges();
258      }
259    }
260
261    public void DeleteHiveExperiment(Guid id) {
262      using (var db = CreateContext()) {
263        var entity = db.HiveExperiments.FirstOrDefault(x => x.HiveExperimentId == id);
264        if (entity != null) db.HiveExperiments.DeleteOnSubmit(entity);
265        db.SubmitChanges();
266      }
267    }
268    #endregion
269
270    #region HiveExperimentPermission Methods
271
272    public DT.HiveExperimentPermission GetHiveExperimentPermission(Guid hiveExperimentId, Guid grantedUserId) {
273      using (var db = CreateContext()) {
274        return Convert.ToDto(db.HiveExperimentPermissions.SingleOrDefault(x => x.HiveExperimentId == hiveExperimentId && x.GrantedUserId == grantedUserId));
275      }
276    }
277
278    public IEnumerable<DT.HiveExperimentPermission> GetHiveExperimentPermissions(Expression<Func<HiveExperimentPermission, bool>> predicate) {
279      using (var db = CreateContext()) {
280        return db.HiveExperimentPermissions.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
281      }
282    }
283
284    public void AddHiveExperimentPermission(DT.HiveExperimentPermission dto) {
285      using (var db = CreateContext()) {
286        var entity = Convert.ToEntity(dto);
287        db.HiveExperimentPermissions.InsertOnSubmit(entity);
288        db.SubmitChanges();
289      }
290    }
291
292    public void UpdateHiveExperimentPermission(DT.HiveExperimentPermission dto) {
293      using (var db = CreateContext()) {
294        var entity = db.HiveExperimentPermissions.FirstOrDefault(x => x.HiveExperimentId == dto.HiveExperimentId && x.GrantedUserId == dto.GrantedUserId);
295        if (entity == null) db.HiveExperimentPermissions.InsertOnSubmit(Convert.ToEntity(dto));
296        else Convert.ToEntity(dto, entity);
297        db.SubmitChanges();
298      }
299    }
300
301    public void DeleteHiveExperimentPermission(Guid hiveExperimentId, Guid grantedUserId) {
302      using (var db = CreateContext()) {
303        var entity = db.HiveExperimentPermissions.FirstOrDefault(x => x.HiveExperimentId == hiveExperimentId && x.GrantedUserId == grantedUserId);
304        if (entity != null) db.HiveExperimentPermissions.DeleteOnSubmit(entity);
305        db.SubmitChanges();
306      }
307    }
308
309    #endregion
310
311    #region Plugin Methods
312    public DT.Plugin GetPlugin(Guid id) {
313      using (var db = CreateContext()) {
314        return Convert.ToDto(db.Plugins.SingleOrDefault(x => x.PluginId == id));
315      }
316    }
317
318    public IEnumerable<DT.Plugin> GetPlugins(Expression<Func<Plugin, bool>> predicate) {
319      using (var db = CreateContext()) {
320        return db.Plugins.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
321      }
322    }
323
324    public Guid AddPlugin(DT.Plugin dto) {
325      using (var db = CreateContext()) {
326        var entity = Convert.ToEntity(dto);
327        db.Plugins.InsertOnSubmit(entity);
328        db.SubmitChanges();
329        return entity.PluginId;
330      }
331    }
332
333    public void UpdatePlugin(DT.Plugin dto) {
334      using (var db = CreateContext()) {
335        var entity = db.Plugins.FirstOrDefault(x => x.PluginId == dto.Id);
336        if (entity == null) db.Plugins.InsertOnSubmit(Convert.ToEntity(dto));
337        else Convert.ToEntity(dto, entity);
338        db.SubmitChanges();
339      }
340    }
341
342    public void DeletePlugin(Guid id) {
343      using (var db = CreateContext()) {
344        var entity = db.Plugins.FirstOrDefault(x => x.PluginId == id);
345        if (entity != null) db.Plugins.DeleteOnSubmit(entity);
346        db.SubmitChanges();
347      }
348    }
349    #endregion
350
351    #region PluginData Methods
352
353    public DT.PluginData GetPluginData(Guid id) {
354      using (var db = CreateContext()) {
355        return Convert.ToDto(db.PluginDatas.SingleOrDefault(x => x.PluginDataId == id));
356      }
357    }
358
359    public IEnumerable<DT.PluginData> GetPluginDatas(Expression<Func<PluginData, bool>> predicate) {
360      using (var db = CreateContext()) {
361        return db.PluginDatas.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
362      }
363    }
364
365    public Guid AddPluginData(DT.PluginData dto) {
366      using (var db = CreateContext()) {
367        var entity = Convert.ToEntity(dto);
368        db.PluginDatas.InsertOnSubmit(entity);
369        db.SubmitChanges();
370        return entity.PluginDataId;
371      }
372    }
373
374    public void UpdatePluginData(DT.PluginData dto) {
375      using (var db = CreateContext()) {
376        var entity = db.PluginDatas.FirstOrDefault(x => x.PluginId == dto.PluginId);
377        if (entity == null) db.PluginDatas.InsertOnSubmit(Convert.ToEntity(dto));
378        else Convert.ToEntity(dto, entity);
379        db.SubmitChanges();
380      }
381    }
382
383    public void DeletePluginData(Guid id) {
384      using (var db = CreateContext()) {
385        var entity = db.PluginDatas.FirstOrDefault(x => x.PluginDataId == id); // todo: check if all the byte[] is loaded into memory here. otherwise work around to delete without loading it
386        if (entity != null) db.PluginDatas.DeleteOnSubmit(entity);
387        db.SubmitChanges();
388      }
389    }
390    #endregion
391
392    #region Slave Methods
393    public DT.Slave GetSlave(Guid id) {
394      using (var db = CreateContext()) {
395        return Convert.ToDto(db.Resources.OfType<Slave>().SingleOrDefault(x => x.ResourceId == id));
396      }
397    }
398
399    public IEnumerable<DT.Slave> GetSlaves(Expression<Func<Slave, bool>> predicate) {
400      using (var db = CreateContext()) {
401        return db.Resources.OfType<Slave>().Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
402      }
403    }
404
405    public Guid AddSlave(DT.Slave dto) {
406      using (var db = CreateContext()) {
407        var entity = Convert.ToEntity(dto);
408        db.Resources.InsertOnSubmit(entity);
409        db.SubmitChanges();
410        return entity.ResourceId;
411      }
412    }
413
414    public void UpdateSlave(DT.Slave dto) {
415      using (var db = CreateContext()) {
416        var entity = db.Resources.OfType<Slave>().FirstOrDefault(x => x.ResourceId == dto.Id);
417        if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
418        else Convert.ToEntity(dto, entity);
419        db.SubmitChanges();
420      }
421    }
422
423    public void DeleteSlave(Guid id) {
424      using (var db = CreateContext()) {
425        var entity = db.Resources.OfType<Slave>().FirstOrDefault(x => x.ResourceId == id);
426        if (entity != null) db.Resources.DeleteOnSubmit(entity);
427        db.SubmitChanges();
428      }
429    }
430    #endregion
431
432    #region SlaveGroup Methods
433    public DT.SlaveGroup GetSlaveGroup(Guid id) {
434      using (var db = CreateContext()) {
435        return Convert.ToDto(db.Resources.OfType<SlaveGroup>().SingleOrDefault(x => x.ResourceId == id));
436      }
437    }
438
439    public IEnumerable<DT.SlaveGroup> GetSlaveGroups(Expression<Func<SlaveGroup, bool>> predicate) {
440      using (var db = CreateContext()) {
441        return db.Resources.OfType<SlaveGroup>().Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
442      }
443    }
444
445    public Guid AddSlaveGroup(DT.SlaveGroup dto) {
446      using (var db = CreateContext()) {
447        if (dto.Id == Guid.Empty)
448          dto.Id = Guid.NewGuid();
449        var entity = Convert.ToEntity(dto);
450        db.Resources.InsertOnSubmit(entity);
451        db.SubmitChanges();
452        return entity.ResourceId;
453      }
454    }
455
456    public void UpdateSlaveGroup(DT.SlaveGroup dto) {
457      using (var db = CreateContext()) {
458        var entity = db.Resources.OfType<SlaveGroup>().FirstOrDefault(x => x.ResourceId == dto.Id);
459        if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
460        else Convert.ToEntity(dto, entity);
461        db.SubmitChanges();
462      }
463    }
464
465    public void DeleteSlaveGroup(Guid id) {
466      using (var db = CreateContext()) {
467        var entity = db.Resources.OfType<SlaveGroup>().FirstOrDefault(x => x.ResourceId == id);
468        if (entity != null) {
469          if (db.Resources.Where(r => r.ParentResourceId == id).Count() > 0) {
470            throw new DaoException("Cannot delete SlaveGroup as long as there are Slaves in the group");
471          }
472          db.Resources.DeleteOnSubmit(entity);
473        }
474        db.SubmitChanges();
475      }
476    }
477    #endregion
478
479    #region Resource Methods
480    public DT.Resource GetResource(Guid id) {
481      using (var db = CreateContext()) {
482        return Convert.ToDto(db.Resources.SingleOrDefault(x => x.ResourceId == id));
483      }
484    }
485
486    public IEnumerable<DT.Resource> GetResources(Expression<Func<Resource, bool>> predicate) {
487      using (var db = CreateContext()) {
488        return db.Resources.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
489      }
490    }
491
492    public Guid AddResource(DT.Resource dto) {
493      using (var db = CreateContext()) {
494        var entity = Convert.ToEntity(dto);
495        db.Resources.InsertOnSubmit(entity);
496        db.SubmitChanges();
497        return entity.ResourceId;
498      }
499    }
500
501    public void UpdateResource(DT.Resource dto) {
502      using (var db = CreateContext()) {
503        var entity = db.Resources.FirstOrDefault(x => x.ResourceId == dto.Id);
504        if (entity == null) db.Resources.InsertOnSubmit(Convert.ToEntity(dto));
505        else Convert.ToEntity(dto, entity);
506        db.SubmitChanges();
507      }
508    }
509
510    public void DeleteResource(Guid id) {
511      using (var db = CreateContext()) {
512        var entity = db.Resources.FirstOrDefault(x => x.ResourceId == id);
513        if (entity != null) db.Resources.DeleteOnSubmit(entity);
514        db.SubmitChanges();
515      }
516    }
517
518    public void AssignJobToResource(Guid jobId, Guid resourceId) {
519      using (var db = CreateContext()) {
520        var job = db.Jobs.Where(x => x.JobId == jobId).Single();
521        job.AssignedResources.Add(new AssignedResource() { JobId = jobId, ResourceId = resourceId });
522        db.SubmitChanges();
523      }
524    }
525
526    public IEnumerable<DT.Resource> GetAssignedResources(Guid jobId) {
527      using (var db = CreateContext()) {
528        var job = db.Jobs.Where(x => x.JobId == jobId).Single();
529        return job.AssignedResources.Select(x => Convert.ToDto(x.Resource)).ToArray();
530      }
531    }
532
533    /// <summary>
534    /// Returns all parent resources of a resource (the given resource is also added)
535    /// </summary>
536    private IEnumerable<DT.Resource> GetParentResources(Guid resourceId) {
537      using (var db = CreateContext()) {
538        var resources = new List<Resource>();
539        CollectParentResources(resources, db.Resources.Where(r => r.ResourceId == resourceId).Single());
540        return resources.Select(r => Convert.ToDto(r)).ToArray();
541      }
542    }
543
544    private void CollectParentResources(List<Resource> resources, Resource resource) {
545      if (resource == null) return;
546      resources.Add(resource);
547      CollectParentResources(resources, resource.ParentResource);
548    }
549    #endregion
550
551    #region Authorization Methods
552    public Permission GetPermissionForJob(Guid jobId, Guid userId) {
553      using (var db = CreateContext()) {
554        return GetPermissionForExperiment(GetExperimentForJob(jobId), userId);
555      }
556    }
557
558    public Permission GetPermissionForExperiment(Guid experimentId, Guid userId) {
559      using (var db = CreateContext()) {
560        HiveExperimentPermission permission = db.HiveExperimentPermissions.SingleOrDefault(p => p.HiveExperimentId == experimentId && p.GrantedUserId == userId);
561        return permission != null ? permission.Permission : Permission.NotAllowed;
562      }
563    }
564
565    public Guid GetExperimentForJob(Guid jobId) {
566      using (var db = CreateContext()) {
567        var job = db.Jobs.SingleOrDefault(j => j.JobId == jobId);
568        if (job.ParentJobId.HasValue) {
569          return GetExperimentForJob(job.ParentJobId.Value);
570        } else {
571          return db.HiveExperiments.SingleOrDefault(he => he.RootJobId == jobId).HiveExperimentId;
572        }
573      }
574    }
575
576    #endregion
577
578    #region Lifecycle Methods
579    public DateTime GetLastCleanup() {
580      using (var db = CreateContext()) {
581        var entity = db.Lifecycles.SingleOrDefault();
582        return entity != null ? entity.LastCleanup : DateTime.MinValue;
583      }
584    }
585
586    public void SetLastCleanup(DateTime datetime) {
587      using (var db = CreateContext()) {
588        var entity = db.Lifecycles.SingleOrDefault();
589        if (entity != null) {
590          entity.LastCleanup = datetime;
591        } else {
592          entity = new Lifecycle();
593          entity.LifecycleId = 0; // always only one entry with ID:0
594          entity.LastCleanup = datetime;
595          db.Lifecycles.InsertOnSubmit(entity);
596        }
597        db.SubmitChanges();
598      }
599    }
600    #endregion
601
602    #region AppointmentMethods
603    public Appointment GetAppointment(Guid id) {
604      using (var db = CreateContext()) {
605        return Convert.ToDto(db.UptimeCalendars.SingleOrDefault(x => x.UptimeCalendarId == id));
606      }
607    }
608
609    public IEnumerable<Appointment> GetAppointments(Expression<Func<UptimeCalendar, bool>> predicate) {
610      using (var db = CreateContext()) {
611        return db.UptimeCalendars.Where(predicate).Select(x => Convert.ToDto(x)).ToArray();
612      }
613    }
614
615    public Guid AddAppointment(Appointment dto) {
616      using (var db = CreateContext()) {
617        var entity = Convert.ToEntity(dto);
618        db.UptimeCalendars.InsertOnSubmit(entity);
619        db.SubmitChanges();
620        return entity.UptimeCalendarId;
621      }
622    }
623
624    public void UpdateAppointment(Appointment dto) {
625      using (var db = CreateContext()) {
626        var entity = db.UptimeCalendars.FirstOrDefault(x => x.UptimeCalendarId == dto.Id);
627        if (entity == null) db.UptimeCalendars.InsertOnSubmit(Convert.ToEntity(dto));
628        else Convert.ToEntity(dto, entity);
629        db.SubmitChanges();
630      }
631    }
632
633    public void DeleteAppointment(Guid id) {
634      using (var db = CreateContext()) {
635        var entity = db.UptimeCalendars.FirstOrDefault(x => x.UptimeCalendarId == id);
636        if (entity != null) db.UptimeCalendars.DeleteOnSubmit(entity);
637        db.SubmitChanges();
638      }
639    }
640    #endregion
641  }
642}
Note: See TracBrowser for help on using the repository browser.