using System; using System.Data; using SDA.DataProvider; namespace Kreta.Framework { /// /// Adatbázis ügylet kontextus. /// public class TransactionContext : IDisposable { private static object SyncObject = new object(); private SDAConnection dbConnection; private SDATransaction dbTransaction; private bool IsTransactional { get; set; } private bool IsLocked { get; set; } protected string IntezmenyAzonosito { get; set; } /// /// Az osztály alapértelmezett konstruktora. /// public TransactionContext(string intezmenyAzonosito) : this(intezmenyAzonosito, true) { } /// /// Az osztály konstruktora. /// /// Tranzakciós legyen-e a kontextus, vagy sem. public TransactionContext(string intezmenyAzonosito, bool isTransactional) { IsTransactional = isTransactional; IntezmenyAzonosito = intezmenyAzonosito; } #region Belső dolgok internal virtual SDAConnection CreateConnection() { if (!string.IsNullOrWhiteSpace(IntezmenyAzonosito)) { var connectionString = SDAServer.Instance.GetIntezmenyConnectionString(IntezmenyAzonosito); return SDAServer.Instance.CreateConnection(connectionString); } return SDAServer.Instance.CreateConnection(); } private void Prepare() { DoPrepareConnection(); DoPrepareTransaction(); } private void DoPrepareConnection() { if (dbConnection == null) { dbConnection = CreateConnection(); dbConnection.Open(); } else { if (dbConnection.State == ConnectionState.Closed) { // Ide nem kéne bejönnie... dbConnection.Open(); } } } private void DoPrepareTransaction() { if (IsTransactional && dbTransaction == null) { dbTransaction = dbConnection.BeginTransaction(); } } private void DisposeTransaction() { if (dbTransaction != null) { try { dbTransaction.Dispose(); } finally { dbTransaction = null; } } } private void CloseLocked() { } private void CloseNotLocked() { DisposeTransaction(); if (dbConnection != null) { try { dbConnection.Dispose(); } finally { dbConnection = null; } } } #endregion #region Nyilvános felület /// /// Zárolja a munkamenet ügyletét, így a munkamenet passziválásakor nem fog elveszni. /// public bool Lock() { lock (SyncObject) { if (IsLocked) { return false; } IsLocked = true; return true; } } /// /// Feloldja a munkamenet ügyletének zárolását. /// public void Unlock() { lock (SyncObject) { IsLocked = false; } } /// /// A munkamenethez tartozó adatbáziskapcsolat. /// public SDAConnection DBConnection { get { Prepare(); return dbConnection; } } /// /// A munkamenethez tartozó ügylet. /// public SDATransaction DBTransaction { get { Prepare(); return dbTransaction; } } /// /// Jóváhagyja az ügyletet. /// public void Commit() { if (IsTransactional && !IsLocked && dbTransaction != null) { dbTransaction.Commit(); DisposeTransaction(); } } /// /// Visszagörgeti az ügyletet. /// public void Rollback() { if (IsTransactional && dbTransaction != null) { dbTransaction.Rollback(); DisposeTransaction(); DoPrepareTransaction(); } } /// /// Lezárja a kontextust. /// public void Close() { if (dbConnection == null && dbTransaction == null) { return; } if (IsLocked) { CloseLocked(); } else { CloseNotLocked(); } } /// /// Lezárja a kontextust. /// public void Dispose() { Close(); GC.SuppressFinalize(this); } #endregion } }