#region License Information /* HeuristicLab * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Linq; using System.Text; using HeuristicLab.Hive.Server.DataAccess; using HeuristicLab.Hive.Contracts.BusinessObjects; using System.Linq.Expressions; using HeuristicLab.DataAccess.ADOHelper; using HeuristicLab.Hive.Server.ADODataAccess.dsHiveServerTableAdapters; using System.Data.Common; using System.Data.SqlClient; using HeuristicLab.Hive.Server.ADODataAccess.TableAdapterWrapper; using System.IO; namespace HeuristicLab.Hive.Server.ADODataAccess { class JobAdapter : DataAdapterBase, IJobAdapter { #region Fields private ManyToManyRelationHelper< dsHiveServerTableAdapters.RequiredPluginsTableAdapter, dsHiveServer.RequiredPluginsRow> pluginsManyToManyRelationHelper = null; private ManyToManyRelationHelper< dsHiveServerTableAdapters.RequiredPluginsTableAdapter, dsHiveServer.RequiredPluginsRow> PluginsManyToManyRelationHelper { get { if (pluginsManyToManyRelationHelper == null) { pluginsManyToManyRelationHelper = new ManyToManyRelationHelper(new RequiredPluginsAdapterWrapper(), 1); } pluginsManyToManyRelationHelper.Session = Session as Session; return pluginsManyToManyRelationHelper; } } private ManyToManyRelationHelper< dsHiveServerTableAdapters.AssignedResourcesTableAdapter, dsHiveServer.AssignedResourcesRow> assignedManyToManyRelationHelper = null; private ManyToManyRelationHelper< dsHiveServerTableAdapters.AssignedResourcesTableAdapter, dsHiveServer.AssignedResourcesRow> AssignedManyToManyRelationHelper { get { if (assignedManyToManyRelationHelper == null) { assignedManyToManyRelationHelper = new ManyToManyRelationHelper(new AssignedResourcesAdapterWrapper(), 0); } assignedManyToManyRelationHelper.Session = Session as Session; return assignedManyToManyRelationHelper; } } private IClientAdapter clientAdapter = null; private IClientAdapter ClientAdapter { get { if (clientAdapter == null) clientAdapter = this.Session.GetDataAdapter(); return clientAdapter; } } private IJobResultsAdapter resultsAdapter = null; private IJobResultsAdapter ResultsAdapter { get { if (resultsAdapter == null) { resultsAdapter = this.Session.GetDataAdapter(); } return resultsAdapter; } } private IPluginInfoAdapter pluginInfoAdapter = null; private IPluginInfoAdapter PluginInfoAdapter { get { if (pluginInfoAdapter == null) { pluginInfoAdapter = this.Session.GetDataAdapter(); } return pluginInfoAdapter; } } private IProjectAdapter projectAdapter = null; private IProjectAdapter ProjectAdapter { get { if (projectAdapter == null) { projectAdapter = this.Session.GetDataAdapter(); } return projectAdapter; } } #endregion public JobAdapter(): base(new JobAdapterWrapper()) { } #region Overrides protected override Job ConvertRow(dsHiveServer.JobRow row, Job job) { if (row != null && job != null) { job.Id = row.JobId; if (!row.IsParentJobIdNull()) job.ParentJob = GetById(row.ParentJobId); else job.ParentJob = null; if (!row.IsResourceIdNull()) job.Client = ClientAdapter.GetById(row.ResourceId); else job.Client = null; if (!row.IsUserIdNull()) job.UserId = Guid.Empty; else job.UserId = Guid.Empty; if (!row.IsJobStateNull()) job.State = (State)Enum.Parse(job.State.GetType(), row.JobState); else job.State = State.nullState; if (!row.IsPercentageNull()) job.Percentage = row.Percentage; else job.Percentage = 0.0; if (!row.IsDateCreatedNull()) job.DateCreated = row.DateCreated; else job.DateCreated = DateTime.MinValue; if (!row.IsDateCalculatedNull()) job.DateCalculated = row.DateCalculated; else job.DateCalculated = DateTime.MinValue; if (!row.IsPriorityNull()) job.Priority = row.Priority; else job.Priority = default(int); if (!row.IsCoresNeededNull()) job.CoresNeeded = row.CoresNeeded; else job.CoresNeeded = default(int); if (!row.IsMemoryNeededNull()) job.MemoryNeeded = row.MemoryNeeded; else job.MemoryNeeded = default(int); if (!row.IsProjectIdNull()) job.Project = ProjectAdapter.GetById( row.ProjectId); else job.Project = null; ICollection requiredPlugins = PluginsManyToManyRelationHelper.GetRelationships(job.Id); job.PluginsNeeded.Clear(); foreach (Guid requiredPlugin in requiredPlugins) { HivePluginInfo pluginInfo = PluginInfoAdapter.GetById(requiredPlugin); job.PluginsNeeded.Add(pluginInfo); } job.AssignedResourceIds = new List( AssignedManyToManyRelationHelper.GetRelationships(job.Id)); return job; } else return null; } protected override dsHiveServer.JobRow ConvertObj(Job job, dsHiveServer.JobRow row) { if (job != null && row != null) { row.JobId = job.Id; if (job.Client != null) { if (row.IsResourceIdNull()) { row.ResourceId = job.Client.Id; } } else row.SetResourceIdNull(); if (job.ParentJob != null) { if (row.IsParentJobIdNull()) { row.ParentJobId = job.ParentJob.Id; } } else row.SetParentJobIdNull(); if (job.UserId != Guid.Empty) { if (row.IsUserIdNull() || row.UserId != Guid.Empty) { row.UserId = Guid.Empty; } } else row.SetUserIdNull(); if (job.State != State.nullState) row.JobState = job.State.ToString(); else row.SetJobStateNull(); row.Percentage = job.Percentage; if (job.DateCreated != DateTime.MinValue) row.DateCreated = job.DateCreated; else row.SetDateCreatedNull(); if (job.DateCalculated != DateTime.MinValue) row.DateCalculated = job.DateCalculated; else row.SetDateCalculatedNull(); row.Priority = job.Priority; row.CoresNeeded = job.CoresNeeded; row.MemoryNeeded = job.MemoryNeeded; if (job.Project != null) row.ProjectId = job.Project.Id; else row.SetProjectIdNull(); } return row; } #endregion #region IJobAdapter Members public ICollection GetAllSubjobs(Job job) { if (job != null) { return base.FindMultiple( delegate() { return Adapter.GetDataByParentJob(job.Id); }); } return null; } public ICollection GetJobsByState(State state) { return base.FindMultiple( delegate() { return Adapter.GetDataByState(state.ToString()); }); } public ICollection GetJobsOf(ClientInfo client) { if (client != null) { return base.FindMultiple( delegate() { return Adapter.GetDataByClient(client.Id); }); } return null; } public ICollection GetActiveJobsOf(ClientInfo client) { if (client != null) { return base.FindMultiple( delegate() { return Adapter.GetDataByCalculatingClient(client.Id); }); } return null; } public ICollection GetJobsOf(Guid userId) { return base.FindMultiple( delegate() { return Adapter.GetDataByUser(userId); }); } public ICollection FindJobs(State state, int cores, int memory, Guid resourceId) { return base.FindMultiple( delegate() { return Adapter.GetDataByStateCoresMemoryResource( state.ToString(), cores, memory, resourceId); }); } public ICollection GetJobsByProject(Guid projectId) { return base.FindMultiple( delegate() { return Adapter.GetDataByProjectId(projectId); }); } protected override void doUpdate(Job obj) { if (obj != null) { ProjectAdapter.Update(obj.Project); ClientAdapter.Update(obj.Client); Update(obj.ParentJob); base.doUpdate(obj); //update relationships List relationships = new List(); foreach (HivePluginInfo pluginInfo in obj.PluginsNeeded) { //first check if pluginInfo already exists in the db HivePluginInfo found = PluginInfoAdapter.GetByNameVersionBuilddate( pluginInfo.Name, pluginInfo.Version, pluginInfo.BuildDate); if (found != null) { pluginInfo.Id = found.Id; } PluginInfoAdapter.Update(pluginInfo); relationships.Add(pluginInfo.Id); } PluginsManyToManyRelationHelper.UpdateRelationships( obj.Id, relationships); AssignedManyToManyRelationHelper.UpdateRelationships( obj.Id, obj.AssignedResourceIds); } } protected override bool doDelete(Job job) { if (job != null) { dsHiveServer.JobRow row = GetRowById(job.Id); if (row != null) { //Referential integrity with job results ICollection results = ResultsAdapter.GetResultsOf(job.Id); foreach (JobResult result in results) { ResultsAdapter.Delete(result); } //delete all relationships PluginsManyToManyRelationHelper.UpdateRelationships(job.Id, new List()); //delete orphaned pluginInfos ICollection orphanedPluginInfos = PluginInfoAdapter.GetOrphanedPluginInfos(); foreach(HivePluginInfo orphanedPlugin in orphanedPluginInfos) { PluginInfoAdapter.Delete(orphanedPlugin); } return base.doDelete(job); } } return false; } /// /// Gets the computable job with the secified jobId /// /// /// public SerializedJob GetSerializedJob(Guid jobId) { return (SerializedJob)base.doInTransaction( delegate() { SerializedJob job = new SerializedJob(); job.JobInfo = GetById(jobId); if (job.JobInfo != null) { job.SerializedJobData = base.Adapter.GetSerializedJobById(jobId); return job; } else { return null; } }); } public Stream GetSerializedJobStream(Guid jobId, bool useExistingConnection) { return ((JobAdapterWrapper)base.DataAdapterWrapper). GetSerializedJobStream(jobId, useExistingConnection); } /// /// Saves or update the computable job /// /// public void UpdateSerializedJob(SerializedJob job) { if(job != null && job.JobInfo != null) { base.doInTransaction( delegate() { Update(job.JobInfo); return base.Adapter.UpdateSerializedJob( job.SerializedJobData, job.JobInfo.Id); }); } } #endregion } }