SharedConnectionInfo.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / RunTime / Hosting / SharedConnectionInfo.cs / 1305376 / SharedConnectionInfo.cs

                            //------------------------------------------------------------------------------ 
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

#region Using directives 
 
using System;
using System.Diagnostics; 
using System.Transactions;
using System.Data.Common;
using System.Threading;
 
#endregion
 
namespace System.Workflow.Runtime.Hosting 
{
    ///  
    /// This class keeps the following associated with a Transaction
    /// - a connection that participates in the transaction.
    /// - an optional local transaction (DbTransaction) generated from the single-phase-committed Transaction.
    /// The connection and the local transaction are passed around to different host components to 
    /// do transacted DB work using the shared connection.
    ///  
    internal sealed class SharedConnectionInfo : IDisposable 
    {
        readonly DbConnection connection; 
        readonly DbTransaction localTransaction;
        private bool disposed;
        private ManualResetEvent handle;
 
        #region Constructor
 
        ///  
        /// Instantiate an opened connection enlisted to the Transaction
        /// if promotable is false, the Transaction wraps a local 
        /// transaction inside and can never be promoted
        /// 
        /// 
        ///  
        /// 
        internal SharedConnectionInfo( 
            DbResourceAllocator dbResourceAllocator, 
            Transaction transaction,
            bool wantPromotable, 
            ManualResetEvent handle)
        {
            Debug.Assert((transaction != null), "Null Transaction!");
 
            if (null == handle)
                throw new ArgumentNullException("handle"); 
 
            this.handle = handle;
 
            if (wantPromotable)
            {
                // Enlist a newly opened connection to this regular Transaction
                this.connection = dbResourceAllocator.OpenNewConnection(); 
                this.connection.EnlistTransaction(transaction);
            } 
            else 
            {
                // Make this transaction no longer promotable by attaching our 
                // IPromotableSinglePhaseNotification implementation (LocalTranscaction)
                // and track the DbConnection and DbTransaction associated with the LocalTranscaction
                LocalTransaction localTransaction = new LocalTransaction(dbResourceAllocator,handle);
                transaction.EnlistPromotableSinglePhase(localTransaction); 
                this.connection = localTransaction.Connection;
                this.localTransaction = localTransaction.Transaction; 
            } 
        }
 
        #endregion Constructor

        #region Accessors
 
        internal DbConnection DBConnection
        { 
            get { return this.connection; } 
        }
 
        internal DbTransaction DBTransaction
        {
            get { return this.localTransaction; }
        } 

        #endregion Accessors 
 
        #region IDisposable Members
 
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this); 
        }
 
        private void Dispose(bool disposing) 
        {
            if (!this.disposed) 
            {
                //
                // If we're using a LocalTransaction it will close the connection
                // in it's IPromotableSinglePhaseNotification methods 
                if ((this.localTransaction == null)&&(null != connection))
                    this.connection.Dispose(); 
            } 
            this.disposed = true;
        } 

        #endregion
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

#region Using directives 
 
using System;
using System.Diagnostics; 
using System.Transactions;
using System.Data.Common;
using System.Threading;
 
#endregion
 
namespace System.Workflow.Runtime.Hosting 
{
    ///  
    /// This class keeps the following associated with a Transaction
    /// - a connection that participates in the transaction.
    /// - an optional local transaction (DbTransaction) generated from the single-phase-committed Transaction.
    /// The connection and the local transaction are passed around to different host components to 
    /// do transacted DB work using the shared connection.
    ///  
    internal sealed class SharedConnectionInfo : IDisposable 
    {
        readonly DbConnection connection; 
        readonly DbTransaction localTransaction;
        private bool disposed;
        private ManualResetEvent handle;
 
        #region Constructor
 
        ///  
        /// Instantiate an opened connection enlisted to the Transaction
        /// if promotable is false, the Transaction wraps a local 
        /// transaction inside and can never be promoted
        /// 
        /// 
        ///  
        /// 
        internal SharedConnectionInfo( 
            DbResourceAllocator dbResourceAllocator, 
            Transaction transaction,
            bool wantPromotable, 
            ManualResetEvent handle)
        {
            Debug.Assert((transaction != null), "Null Transaction!");
 
            if (null == handle)
                throw new ArgumentNullException("handle"); 
 
            this.handle = handle;
 
            if (wantPromotable)
            {
                // Enlist a newly opened connection to this regular Transaction
                this.connection = dbResourceAllocator.OpenNewConnection(); 
                this.connection.EnlistTransaction(transaction);
            } 
            else 
            {
                // Make this transaction no longer promotable by attaching our 
                // IPromotableSinglePhaseNotification implementation (LocalTranscaction)
                // and track the DbConnection and DbTransaction associated with the LocalTranscaction
                LocalTransaction localTransaction = new LocalTransaction(dbResourceAllocator,handle);
                transaction.EnlistPromotableSinglePhase(localTransaction); 
                this.connection = localTransaction.Connection;
                this.localTransaction = localTransaction.Transaction; 
            } 
        }
 
        #endregion Constructor

        #region Accessors
 
        internal DbConnection DBConnection
        { 
            get { return this.connection; } 
        }
 
        internal DbTransaction DBTransaction
        {
            get { return this.localTransaction; }
        } 

        #endregion Accessors 
 
        #region IDisposable Members
 
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this); 
        }
 
        private void Dispose(bool disposing) 
        {
            if (!this.disposed) 
            {
                //
                // If we're using a LocalTransaction it will close the connection
                // in it's IPromotableSinglePhaseNotification methods 
                if ((this.localTransaction == null)&&(null != connection))
                    this.connection.Dispose(); 
            } 
            this.disposed = true;
        } 

        #endregion
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK