Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HiveProjectManagement/HeuristicLab.Services.Hive.DataAccess/3.3/Manager/PersistenceManager.cs @ 15497

Last change on this file since 15497 was 15497, checked in by jzenisek, 6 years ago

#2839 worked on permission check at AddTask

File size: 9.2 KB
RevLine 
[12468]1#region License Information
2/* HeuristicLab
[14185]3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[12468]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.Data.Linq;
[12761]24using System.Linq;
[12468]25using System.Transactions;
26using HeuristicLab.Services.Hive.DataAccess.Daos;
27using HeuristicLab.Services.Hive.DataAccess.Daos.HiveStatistics;
[12761]28using HeuristicLab.Services.Hive.DataAccess.Data;
[12468]29using HeuristicLab.Services.Hive.DataAccess.Interfaces;
30
31namespace HeuristicLab.Services.Hive.DataAccess.Manager {
32  public class PersistenceManager : IPersistenceManager {
33    private readonly DataContext dataContext;
34    public DataContext DataContext {
35      get { return dataContext; }
36    }
37
38    #region Hive daos
[12691]39
[15411]40    private AssignedTaskResourceDao assignedTaskResourceDao;
41    public AssignedTaskResourceDao AssignedTaskResourceDao {
42      get { return assignedTaskResourceDao ?? (assignedTaskResourceDao = new AssignedTaskResourceDao(dataContext)); }
[12468]43    }
44
[15411]45    private AssignedProjectResourceDao assignedProjectResourceDao;
46    public AssignedProjectResourceDao AssignedProjectResourceDao {
47      get { return assignedProjectResourceDao ?? (assignedProjectResourceDao = new AssignedProjectResourceDao(dataContext)); }
48    }
49
[12691]50    private DowntimeDao downtimeDao;
[12468]51    public DowntimeDao DowntimeDao {
[12691]52      get { return downtimeDao ?? (downtimeDao = new DowntimeDao(dataContext)); }
[12468]53    }
54
[12691]55    private JobDao jobDao;
[12468]56    public JobDao JobDao {
[12691]57      get { return jobDao ?? (jobDao = new JobDao(dataContext)); }
[12468]58    }
59
[12691]60    private JobPermissionDao jobPermissionDao;
[12468]61    public JobPermissionDao JobPermissionDao {
[12691]62      get { return jobPermissionDao ?? (jobPermissionDao = new JobPermissionDao(dataContext)); }
[12468]63    }
64
[12691]65    private LifecycleDao lifecycleDao;
[12468]66    public LifecycleDao LifecycleDao {
[12691]67      get { return lifecycleDao ?? (lifecycleDao = new LifecycleDao(dataContext)); }
[12468]68    }
69
[12691]70    private PluginDao pluginDao;
[12468]71    public PluginDao PluginDao {
[12691]72      get { return pluginDao ?? (pluginDao = new PluginDao(dataContext)); }
[12468]73    }
74
[12691]75    private PluginDataDao pluginDataDao;
[12468]76    public PluginDataDao PluginDataDao {
[12691]77      get { return pluginDataDao ?? (pluginDataDao = new PluginDataDao(dataContext)); }
[12468]78    }
79
[15379]80    private ProjectDao projectDao;
81    public ProjectDao ProjectDao {
82      get { return projectDao ?? (projectDao = new ProjectDao(dataContext)); }
83    }
84
[15497]85    private ProjectPermissionDao projectPermissionDao;
[15379]86    public ProjectPermissionDao ProjectPermissionDao {
[15497]87      get { return projectPermissionDao ?? (projectPermissionDao = new ProjectPermissionDao(dataContext)); }
[15379]88    }
89
[12691]90    private RequiredPluginDao requiredPluginDao;
[12468]91    public RequiredPluginDao RequiredPluginDao {
[12691]92      get { return requiredPluginDao ?? (requiredPluginDao = new RequiredPluginDao(dataContext)); }
[12468]93    }
94
[12691]95    private ResourceDao resourceDao;
[12468]96    public ResourceDao ResourceDao {
[12691]97      get { return resourceDao ?? (resourceDao = new ResourceDao(dataContext)); }
[12468]98    }
99
[15497]100    private ResourcePermissionDao resourcePermissionDao;
101    public ResourcePermissionDao ResourcePermissionDao {
102      get { return resourcePermissionDao ?? (resourcePermissionDao = new ResourcePermissionDao(dataContext)); }
103    }
104
[12691]105    private SlaveDao slaveDao;
[12468]106    public SlaveDao SlaveDao {
[12691]107      get { return slaveDao ?? (slaveDao = new SlaveDao(dataContext)); }
[12468]108    }
109
[12691]110    private SlaveGroupDao slaveGroupDao;
[12468]111    public SlaveGroupDao SlaveGroupDao {
[12691]112      get { return slaveGroupDao ?? (slaveGroupDao = new SlaveGroupDao(dataContext)); }
[12468]113    }
114
[12691]115    private StateLogDao stateLogDao;
[12468]116    public StateLogDao StateLogDao {
[12691]117      get { return stateLogDao ?? (stateLogDao = new StateLogDao(dataContext)); }
[12468]118    }
119
[12691]120    private TaskDao taskDao;
[12468]121    public TaskDao TaskDao {
[12691]122      get { return taskDao ?? (taskDao = new TaskDao(dataContext)); }
[12468]123    }
124
[12691]125    private TaskDataDao taskDataDao;
[12468]126    public TaskDataDao TaskDataDao {
[12691]127      get { return taskDataDao ?? (taskDataDao = new TaskDataDao(dataContext)); }
[12468]128    }
129
[12691]130    private UserPriorityDao userPriorityDao;
[12468]131    public UserPriorityDao UserPriorityDao {
[12691]132      get { return userPriorityDao ?? (userPriorityDao = new UserPriorityDao(dataContext)); }
[12468]133    }
134    #endregion
135
136    #region HiveStatistics daos
[12691]137
138    private DimClientDao dimClientDao;
[12468]139    public DimClientDao DimClientDao {
[12691]140      get { return dimClientDao ?? (dimClientDao = new DimClientDao(dataContext)); }
[12468]141    }
142
[12691]143    private DimJobDao dimJobDao;
[12468]144    public DimJobDao DimJobDao {
[12691]145      get { return dimJobDao ?? (dimJobDao = new DimJobDao(dataContext)); }
[12468]146    }
147
[12691]148    private DimTimeDao dimTimeDao;
[12468]149    public DimTimeDao DimTimeDao {
[12691]150      get { return dimTimeDao ?? (dimTimeDao = new DimTimeDao(dataContext)); }
[12468]151    }
152
[12691]153    private DimUserDao dimUserDao;
[12468]154    public DimUserDao DimUserDao {
[12691]155      get { return dimUserDao ?? (dimUserDao = new DimUserDao(dataContext)); }
[12468]156    }
157
[12691]158    private FactClientInfoDao factClientInfoDao;
[12468]159    public FactClientInfoDao FactClientInfoDao {
[12691]160      get { return factClientInfoDao ?? (factClientInfoDao = new FactClientInfoDao(dataContext)); }
[12468]161    }
162
[12691]163    private FactTaskDao factTaskDao;
[12468]164    public FactTaskDao FactTaskDao {
[12691]165      get { return factTaskDao ?? (factTaskDao = new FactTaskDao(dataContext)); }
[12468]166    }
167    #endregion
168
169    public PersistenceManager(bool longRunning = false) {
170      var context = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
171      if (longRunning) context.CommandTimeout = (int)Settings.Default.LongRunningDatabaseCommandTimeout.TotalSeconds;
172      dataContext = context;
173    }
174
[12691]175    public PersistenceManager(DataContext dataContext) {
176      this.dataContext = dataContext;
177    }
178
[12468]179    #region Transaction management
180    public void UseTransaction(Action call, bool repeatableRead = false, bool longRunning = false) {
181      UseTransaction<object>(() => {
182        call();
183        return null;
184      });
185    }
186
187    public T UseTransaction<T>(Func<T> call, bool repeatableRead = false, bool longRunning = false) {
188      int n = 10;
189      while (n > 0) {
190        TransactionScope transaction = CreateTransaction(repeatableRead, longRunning);
191        try {
192          T result = call();
193          transaction.Complete();
194          return result;
195        }
196        catch (System.Data.SqlClient.SqlException e) {
197          n--; // probably deadlock situation, let it roll back and repeat the transaction n times
198          LogFactory.GetLogger(typeof(TransactionManager).Namespace).Log(string.Format("Exception occured, repeating transaction {0} more times. Details: {1}", n, e.ToString()));
199          if (n <= 0) throw;
200        }
201        finally {
202          transaction.Dispose();
203        }
204      }
205      throw new Exception("Transaction couldn't be completed.");
206    }
207
208    private static TransactionScope CreateTransaction(bool repeatableRead, bool longRunning) {
209      var options = new TransactionOptions {
210        IsolationLevel = repeatableRead ? IsolationLevel.RepeatableRead : IsolationLevel.ReadUncommitted
211      };
212      if (longRunning) {
213        options.Timeout = Settings.Default.LongRunningDatabaseCommandTimeout;
214      }
215      return new TransactionScope(TransactionScopeOption.Required, options);
216    }
217    #endregion
218
[12761]219    public TableInformation GetTableInformation(string table) {
[12883]220      string query = string.Format("sp_spaceused '{0}'", table);
[12761]221      var result = dataContext.ExecuteQuery<SqlServerTableInformation>(query).FirstOrDefault();
222      if (result == null) return null;
223      return new TableInformation {
224        Name = result.Name,
225        Rows = int.Parse(result.Rows.Remove(result.Rows.IndexOf(' '))),
226        Reserved = int.Parse(result.Reserved.Remove(result.Reserved.IndexOf(' '))),
227        Data = int.Parse(result.Data.Remove(result.Data.IndexOf(' '))),
228        IndexSize = int.Parse(result.Index_Size.Remove(result.Index_Size.IndexOf(' '))),
229        Unused = int.Parse(result.Unused.Remove(result.Unused.IndexOf(' ')))
230      };
231    }
232
[12468]233    public void SubmitChanges() {
234      if (dataContext != null) {
235        dataContext.SubmitChanges();
236      }
237    }
238
239    public void Dispose() {
[12853]240      if (dataContext != null) {
241        dataContext.Dispose();
242      }
[12468]243    }
[12761]244
245    private class SqlServerTableInformation {
246      public string Name { get; set; }
247      public string Rows { get; set; }
248      public string Reserved { get; set; }
249      public string Data { get; set; }
250      public string Index_Size { get; set; } // naming of sp_spaceused...
251      public string Unused { get; set; }
252    }
[12468]253  }
254}
Note: See TracBrowser for help on using the repository browser.