#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.DataAccess.Interfaces; using HeuristicLab.PluginInfrastructure; using System.Data.Common; using System.Threading; namespace HeuristicLab.DataAccess.ADOHelper { public class Session: ISession { private static DiscoveryService discoveryService = new DiscoveryService(); private SessionFactory factory; private Transaction transaction; private DbConnection connection; private Thread ownerThread; private int usageCounter = 0; private IDictionary adapters = new Dictionary(); public Session(SessionFactory factory) { this.factory = factory; this.ownerThread = Thread.CurrentThread; this.usageCounter = 0; } public void CheckThread() { if (!Thread.CurrentThread.Equals(ownerThread)) { throw new Exception("Session is owned by another thread"); } } public DbConnection Connection { get { if (connection == null) { connection = factory.CreateConnection(); } return connection; } } public void DetachTrasaction() { this.transaction = null; } public void IncrementUsageCounter() { this.usageCounter++; } #region ISession Members public ISessionFactory Factory { get { return this.factory; } } public ITransaction BeginTransaction(TransactionIsolationLevel isolationLevel) { CheckThread(); if (transaction == null) { transaction = new Transaction(this, isolationLevel); transaction.Connection = Connection; } transaction.IncrementUsageCounter(); return transaction; } public ITransaction BeginTransaction() { return BeginTransaction(TransactionIsolationLevel.Default); } public ITransaction GetCurrentTransaction() { CheckThread(); return transaction; } public IDataAdapter GetDataAdapter() where ObjT : IPersistableObject { CheckThread(); Guid adapterId = typeof(IDataAdapter).GUID; if (!adapters.ContainsKey(adapterId)) { IDataAdapter adapter = discoveryService.GetInstances>()[0]; adapter.Session = this; adapters.Add(adapterId, adapter); } return adapters[adapterId] as IDataAdapter; } public T GetDataAdapter() where ObjT : IPersistableObject where T : class, IDataAdapter { CheckThread(); Guid adapterId = typeof(T).GUID; if (!adapters.ContainsKey(adapterId)) { T adapter = discoveryService.GetInstances()[0]; adapter.Session = this; adapters.Add(adapterId, adapter); } return adapters[adapterId] as T; } public void EndSession() { this.usageCounter--; if (usageCounter <= 0) { CheckThread(); if (transaction != null) { transaction.Rollback(); transaction = null; } if (connection.State == System.Data.ConnectionState.Open) { connection.Close(); connection = null; } factory.EndSession(this); } } #endregion } }