//-----------------------------------------------------------------------
// 
//     Copyright (c) Microsoft Corporation.
// 
//-----------------------------------------------------------------------
namespace Microsoft.Isam.Esent.Interop
{
    using System.Globalization;
    /// 
    /// A class that encapsulates a JET_SESID in a disposable object.
    /// 
    public class Session : EsentResource
    {
        /// 
        /// The underlying JET_SESID.
        /// 
        private JET_SESID sesid;
        /// 
        /// Initializes a new instance of the Session class. A new
        /// JET_SESSION is allocated from the given instance.
        /// 
        /// The instance to start the session in.
        public Session(JET_INSTANCE instance)
        {
            Api.JetBeginSession(instance, out this.sesid, null, null);
            this.ResourceWasAllocated();
        }
        /// 
        /// Gets the JET_SESID that this session contains.
        /// 
        public JET_SESID JetSesid
        {
            get
            {
                this.CheckObjectIsNotDisposed();
                return this.sesid;
            }
        }
        /// 
        /// Implicit conversion operator from a Session to a JET_SESID. This
        /// allows a Session to be used with APIs which expect a JET_SESID.
        /// 
        /// The session to convert.
        /// The JET_SESID of the session.
        public static implicit operator JET_SESID(Session session)
        {
            return session.JetSesid;
        }
        /// 
        /// Returns a  that represents the current .
        /// 
        /// 
        /// A  that represents the current .
        /// 
        public override string ToString()
        {
            return string.Format(CultureInfo.InvariantCulture, "Session (0x{0:x})", this.sesid.Value);
        }
        /// 
        /// Terminate the session.
        /// 
        public void End()
        {
            this.CheckObjectIsNotDisposed();
            this.ReleaseResource();
        }
        /// 
        /// Free the underlying JET_SESID.
        /// 
        protected override void ReleaseResource()
        {
            if (!this.sesid.IsInvalid)
            {
                Api.JetEndSession(this.JetSesid, EndSessionGrbit.None);
            }
            this.sesid = JET_SESID.Nil;
            this.ResourceWasReleased();
        }
    }
}