public LightningTransaction(LightningEnvironment environment, LightningTransaction parent, TransactionBeginFlags flags)
        {
            if (environment == null)
                throw new ArgumentNullException("environment");

            this.Environment = environment;
            this.ParentTransaction = parent;
            this.IsReadOnly = flags == TransactionBeginFlags.ReadOnly;
            
            var parentHandle = parent != null
                ? parent._handle
                : IntPtr.Zero;

            IntPtr handle = default(IntPtr);
            Native.Execute(() => Native.mdb_txn_begin(environment._handle, parentHandle, flags, out handle));

            _handle = handle;

            this.State = LightningTransacrionState.Active;

            if (parent == null)
                this.Environment.Closing += EnvironmentOrParentTransactionClosing;
            else
                parent.Closing += EnvironmentOrParentTransactionClosing;
        }
Beispiel #2
0
        /// <summary>
        /// Create a transaction for use with the environment.
        /// The transaction handle may be discarded using Abort() or Commit().
        /// Note:
        /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
        /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
        /// </summary>
        /// <param name="parent">
        /// If this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent.
        /// Transactions may be nested to any level.
        /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions.
        /// </param>
        /// <param name="beginFlags">
        /// Special options for this transaction.
        /// </param>
        /// <returns>
        /// New LightningTransaction
        /// </returns>
        public LightningTransaction BeginTransaction(LightningTransaction parent, TransactionBeginFlags beginFlags)
        {
            if (!IsOpened)
            {
                throw new InvalidOperationException("Environment must be opened before starting a transaction");
            }

            return(new LightningTransaction(this, parent, beginFlags));
        }
        public Transaction BeginTransaction(TransactionBeginFlags flags = TransactionBeginFlags.ReadWrite)
        {
            if (((int)flags & (int)TransactionBeginFlags.ReadOnly) != 0)
            {
                ThrowShouldUseReadOnlyTxn();
            }
            var impl = TransactionImpl.Create(this, flags);
            var txn  = new Transaction(impl);

            return(txn);
        }
        public LightningTransaction Create(TransactionBeginFlags beginFlags)
        {
            EnsureEnvironmentOpened();

            IntPtr handle = default(IntPtr);
            NativeMethods.Execute(lib => lib.mdb_txn_begin(_environment._handle, _parentHandle, beginFlags, out handle));

            var tran = new LightningTransaction(_environment, handle, _parentTransaction, beginFlags);

            _transactions.TryAdd(tran, true);

            return tran;
        }
        /// <summary>
        /// Created new instance of LightningTransaction
        /// </summary>
        /// <param name="environment">Environment.</param>
        /// <param name="parent">Parent transaction or null.</param>
        /// <param name="flags">Transaction open options.</param>
        internal LightningTransaction(LightningEnvironment environment, IntPtr handle, LightningTransaction parent, TransactionBeginFlags flags)
        {
            if (environment == null)
                throw new ArgumentNullException("environment");

            this.Environment = environment;
            this.ParentTransaction = parent;
            this.IsReadOnly = flags == TransactionBeginFlags.ReadOnly;
            this.State = LightningTransactionState.Active;

            _handle = handle;
            _subTransactionsManager = new TransactionManager(environment, this);
            _cursorManager = new CursorManager(this);
        }
        /// <summary>
        /// Created new instance of LightningTransaction
        /// </summary>
        /// <param name="environment">Environment.</param>
        /// <param name="parent">Parent transaction or null.</param>
        /// <param name="flags">Transaction open options.</param>
        internal LightningTransaction(LightningEnvironment environment, LightningTransaction parent, TransactionBeginFlags flags)
        {
            if (environment == null)
                throw new ArgumentNullException(nameof(environment));

            Environment = environment;
            ParentTransaction = parent;
            IsReadOnly = (flags & TransactionBeginFlags.ReadOnly) == TransactionBeginFlags.ReadOnly;
            State = LightningTransactionState.Active;
            Environment.Disposing += Dispose;
            if (parent != null)
            {
                parent.Disposing += Dispose;
                parent.StateChanging += OnParentStateChanging;
            }

            var parentHandle = parent?.Handle() ?? IntPtr.Zero;
            mdb_txn_begin(environment.Handle(), parentHandle, flags, out _handle);
            _originalHandle = _handle;
        }
Beispiel #7
0
        /// <summary>
        /// Create a transaction for use with the environment.
        /// The transaction handle may be discarded using Abort() or Commit().
        /// Note:
        /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
        /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
        /// </summary>
        /// <param name="parent">
        /// If this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent.
        /// Transactions may be nested to any level.
        /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions.
        /// </param>
        /// <param name="beginFlags">
        /// Special options for this transaction.
        /// </param>
        /// <returns>
        /// New LightningTransaction
        /// </returns>
        public LightningTransaction BeginTransaction(LightningTransaction parent, TransactionBeginFlags beginFlags)
        {
            this.EnsureOpened();

            return(new LightningTransaction(this, parent, beginFlags));
        }
 /// <summary>
 /// Begin a child transaction.
 /// </summary>
 /// <param name="beginFlags">Options for a new transaction.</param>
 /// <returns>New child transaction.</returns>
 public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return new LightningTransaction(Environment, this, beginFlags);
 }
Beispiel #9
0
 /// <summary>
 /// Create a transaction for use with the environment.
 /// The transaction handle may be discarded usingAbort() or Commit().
 /// Note:
 /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
 /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
 /// </summary>
 /// <param name="beginFlags">
 /// Special options for this transaction.
 /// </param>
 /// <returns>
 /// New LMDBTransaction
 /// </returns>
 public LMDBTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return(BeginTransaction(null, beginFlags));
 }
 int INativeLibraryFacade.mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn)
 {
     return FallbackLibraryFacade.mdb_txn_begin(env, parent, flags, out txn);
 }
 public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return this.BeginTransaction(null, beginFlags);
 }
Beispiel #12
0
        internal static TransactionImpl Create(LMDBEnvironment lmdbEnvironment, TransactionBeginFlags beginFlags)
        {
            lmdbEnvironment.EnsureOpen();

            TransactionImpl tx;

            // ReSharper disable once BitwiseOperatorOnEnumWithoutFlags
            var isReadOnly = (beginFlags & TransactionBeginFlags.ReadOnly) == TransactionBeginFlags.ReadOnly;

            if (isReadOnly)
            {
                if ((tx = lmdbEnvironment.ReadTxnPool.Rent()) == null)
                {
                    tx             = TxPool.Rent();
                    tx._isReadOnly = true;
                    if (tx._state != TransactionState.Disposed)
                    {
                        ThrowShoudBeDisposed();
                    }
                }
                else
                {
                    Debug.Assert(tx._isReadOnly);
                    Debug.Assert(tx._state == TransactionState.Reset);
                }

                if (tx.IsInvalid)
                {
                    // create new handle
                    NativeMethods.AssertExecute(NativeMethods.mdb_txn_begin(
                                                    lmdbEnvironment._handle.Handle,
                                                    IntPtr.Zero, beginFlags, out var handle));
                    tx.SetNewHandle(handle);
                }
                else
                {
                    tx.Renew();
                }
            }
            else
            {
                tx             = TxPool.Rent();
                tx._isReadOnly = false;
                NativeMethods.AssertExecute(NativeMethods.mdb_txn_begin(
                                                lmdbEnvironment._handle.Handle,
                                                IntPtr.Zero, beginFlags, out IntPtr handle));
                tx._handle = handle;
                if (tx._state != TransactionState.Disposed)
                {
                    ThrowShoudBeDisposed();
                }
            }

            tx._lmdbEnvironment = lmdbEnvironment;
            tx._state           = TransactionState.Active;

#if DEBUG
            tx.StackTrace = Environment.StackTrace;
#endif
            return(tx);
        }
        /// <summary>
        /// Create a transaction for use with the environment.
        /// The transaction handle may be discarded using Abort() or Commit().
        /// Note:
        /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
        /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
        /// </summary>
        /// <param name="parent">
        /// If this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent. 
        /// Transactions may be nested to any level. 
        /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions.
        /// </param>
        /// <param name="beginFlags">
        /// Special options for this transaction. 
        /// </param>
        /// <returns>
        /// New LightningTransaction
        /// </returns>
        public LightningTransaction BeginTransaction(LightningTransaction parent, TransactionBeginFlags beginFlags)
        {
            if (!IsOpened)
                throw new InvalidOperationException("Environment must be opened before starting a transaction");

            return new LightningTransaction(this, parent, beginFlags);
        }
Beispiel #14
0
 /// <summary>
 /// Create a transaction for use with the environment.
 /// The transaction handle may be discarded usingAbort() or Commit().
 /// Note:
 /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
 /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
 /// </summary>
 /// <param name="beginFlags">
 /// Special options for this transaction.
 /// </param>
 /// <returns>
 /// New LightningTransaction
 /// </returns>
 public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return(this.BeginTransaction(null, beginFlags));
 }
Beispiel #15
0
 /// <summary>
 /// Begin a child transaction.
 /// </summary>
 /// <param name="beginFlags">Options for a new transaction.</param>
 /// <returns>New child transaction.</returns>
 public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return(new LightningTransaction(Environment, this, beginFlags));
 }
 int INativeLibraryFacade.mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn)
 {
     return(FallbackLibraryFacade.mdb_txn_begin(env, parent, flags, out txn));
 }
Beispiel #17
0
 public static MDBResultCode mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn)
 {
     return(LmdbMethods.mdb_txn_begin(env, parent, flags, out txn));
 }
 /// <summary>
 /// Begin a child transaction.
 /// </summary>
 /// <param name="beginFlags">Options for a new transaction.</param>
 /// <returns>New child transaction.</returns>
 public LMDBTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return(new LMDBTransaction(Environment, this, beginFlags));
 }
Beispiel #19
0
 /// <summary>
 /// Begin a child transaction.
 /// </summary>
 /// <param name="beginFlags">Options for a new transaction.</param>
 /// <returns>New child transaction.</returns>
 public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return(this.Environment.BeginTransaction(this, beginFlags));
 }
Beispiel #20
0
        /// <summary>
        /// Created new instance of LightningTransaction
        /// </summary>
        /// <param name="environment">Environment.</param>
        /// <param name="parent">Parent transaction or null.</param>
        /// <param name="flags">Transaction open options.</param>
        public LightningTransaction(LightningEnvironment environment, LightningTransaction parent, TransactionBeginFlags flags)
        {
            if (environment == null)
            {
                throw new ArgumentNullException("environment");
            }

            this.Environment       = environment;
            this.ParentTransaction = parent;
            this.IsReadOnly        = flags == TransactionBeginFlags.ReadOnly;

            var parentHandle = parent != null
                ? parent._handle
                : IntPtr.Zero;

            IntPtr handle = default(IntPtr);

            NativeMethods.Execute(lib => lib.mdb_txn_begin(environment._handle, parentHandle, flags, out handle));

            _handle = handle;

            this.State = LightningTransactionState.Active;

            if (parent == null)
            {
                this.Environment.Closing += EnvironmentOrParentTransactionClosing;
            }
            else
            {
                parent.Closing += EnvironmentOrParentTransactionClosing;
            }
        }
Beispiel #21
0
        /// <summary>
        /// Created new instance of LightningTransaction
        /// </summary>
        /// <param name="environment">Environment.</param>
        /// <param name="parent">Parent transaction or null.</param>
        /// <param name="flags">Transaction open options.</param>
        internal LightningTransaction(LightningEnvironment environment, LightningTransaction parent, TransactionBeginFlags flags)
        {
            if (environment == null)
            {
                throw new ArgumentNullException(nameof(environment));
            }

            Environment            = environment;
            ParentTransaction      = parent;
            IsReadOnly             = (flags & TransactionBeginFlags.ReadOnly) == TransactionBeginFlags.ReadOnly;
            State                  = LightningTransactionState.Active;
            Environment.Disposing += Dispose;
            if (parent != null)
            {
                parent.Disposing     += Dispose;
                parent.StateChanging += OnParentStateChanging;
            }

            var parentHandle = parent?.Handle() ?? IntPtr.Zero;

            Lmdb.mdb_txn_begin(environment.Handle(), parentHandle, flags, out _handle);
            _originalHandle = _handle;
        }
Beispiel #22
0
 /// <summary>
 /// Create a transaction for use with the environment.
 /// The transaction handle may be discarded using Abort() or Commit().
 /// Note:
 /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
 /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
 /// </summary>
 /// <param name="parent">
 /// If this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent.
 /// Transactions may be nested to any level.
 /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions.
 /// </param>
 /// <param name="beginFlags">
 /// Special options for this transaction.
 /// </param>
 /// <returns>
 /// New LightningTransaction
 /// </returns>
 public LightningTransaction BeginTransaction(LightningTransaction parent, TransactionBeginFlags beginFlags)
 {
     return(new LightningTransaction(this, parent, beginFlags));
 }
Beispiel #23
0
 public static void RunTransactionScenario(this LightningEnvironment env,
                                           Action <LightningTransaction, LightningDatabase> scenario,
                                           DatabaseOpenFlags flags = DatabaseOpenFlags.Create, TransactionBeginFlags transactionFlags = TransactionBeginFlags.None)
 {
     using var tx = env.BeginTransaction(transactionFlags);
     using var db = tx.OpenDatabase(configuration: new DatabaseConfiguration { Flags = flags });
     scenario(tx, db);
 }
 public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags)
 {
     return this.Environment.BeginTransaction(this, beginFlags);
 }
Beispiel #25
0
 public static extern int mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn);
 private ITransaction BeginTransactionInternal(ITransaction parentTransaction, TransactionBeginFlags flags)
 {
     if (parentTransaction == null || parentTransaction.InnerObject == null)
     {
         return(new LMDBTransaction(_environment.BeginTransaction(flags), flags == TransactionBeginFlags.ReadOnly ? true : false));
     }
     else
     {
         ValidateTransaction(parentTransaction);
         LightningTransaction lmdbTransaction = (LightningTransaction)parentTransaction.InnerObject;
         return(new LMDBTransaction(lmdbTransaction.BeginTransaction(flags), flags == TransactionBeginFlags.ReadOnly ? true : false));
     }
 }
 private static extern int mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn);
Beispiel #28
0
 public static extern MDBResultCode mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn);
        public LightningTransaction BeginTransaction(LightningTransaction parent, TransactionBeginFlags beginFlags)
        {
            this.EnsureOpened();

            return new LightningTransaction(this, parent, beginFlags);
        }
Beispiel #30
0
 public static int mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn)
 {
     return check(LmdbMethods.mdb_txn_begin(env, parent, flags, out txn));
 }
Beispiel #31
0
 public static int mdb_txn_begin(IntPtr env, IntPtr parent, TransactionBeginFlags flags, out IntPtr txn)
 {
     return(check(LmdbMethods.mdb_txn_begin(env, parent, flags, out txn)));
 }
 /// <summary>
 /// Create a transaction for use with the environment.
 /// The transaction handle may be discarded using Abort() or Commit().
 /// Note:
 /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
 /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
 /// </summary>
 /// <param name="parent">
 /// If this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent. 
 /// Transactions may be nested to any level. 
 /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions.
 /// </param>
 /// <param name="beginFlags">
 /// Special options for this transaction. 
 /// </param>
 /// <returns>
 /// New LightningTransaction
 /// </returns>
 public LightningTransaction BeginTransaction(LightningTransaction parent, TransactionBeginFlags beginFlags)
 {
     return new LightningTransaction(this, parent, beginFlags);
 }