Пример #1
0
        public void TestDiscard()
        {
            DatabaseEnvironment env;

            byte[] gid;

            testName = "TestDiscard";
            testHome = testFixtureHome + "/" + testName;

            Configuration.ClearDir(testHome);

            /*
             * Open an environment and begin a transaction
             * called "transaction". Within the transacion, open a
             * database, write a record and close it. Then prepare
             * the transaction and panic the environment.
             */
            PanicPreparedTxn(testHome, testName, out env, out gid);

            /*
             * Recover the environment.     Log and db files are not
             * destoyed so run normal recovery. Recovery should
             * use DB_CREATE and DB_INIT_TXN flags when
             * opening the environment.
             */
            DatabaseEnvironmentConfig envConfig
                = new DatabaseEnvironmentConfig();

            envConfig.RunRecovery = true;
            envConfig.Create      = true;
            envConfig.UseTxns     = true;
            envConfig.UseMPool    = true;
            env = DatabaseEnvironment.Open(testHome, envConfig);

            PreparedTransaction[] preparedTxns
                         = new PreparedTransaction[10];
            preparedTxns = env.Recover(10, true);

            Assert.AreEqual(gid, preparedTxns[0].GlobalID);
            preparedTxns[0].Txn.Discard();
            try
            {
                preparedTxns[0].Txn.Commit();
            }
            catch (AccessViolationException)
            {
                throw new ExpectedTestException();
            }
            finally
            {
                env.Close();
            }
        }
Пример #2
0
        internal PreparedTransaction[] txn_recover(uint count, uint flags)
        {
            int    err   = 0;
            IntPtr prepp = Marshal.AllocHGlobal((int)(count * (IntPtr.Size + DbConstants.DB_GID_SIZE)));
            uint   sz    = 0;

            err = txn_recover(prepp, count, ref sz, flags);
            DatabaseException.ThrowException(err);
            PreparedTransaction[] ret = new PreparedTransaction[sz];
            for (int i = 0; i < sz; i++)
            {
                IntPtr      cPtr = new IntPtr((IntPtr.Size == 4 ? prepp.ToInt32() : prepp.ToInt64()) + i * (IntPtr.Size + DbConstants.DB_GID_SIZE));
                DB_PREPLIST prep = new DB_PREPLIST(cPtr, false);
                ret[i] = new PreparedTransaction(prep);
            }
            Marshal.FreeHGlobal(prepp);
            return(ret);
        }
Пример #3
0
 internal PreparedTransaction[] txn_recover(int count, uint flags)
 {
     int err = 0;
     IntPtr prepp = Marshal.AllocHGlobal((int)(count * (IntPtr.Size + DbConstants.DB_GID_SIZE)));
     long sz = 0;
     err = txn_recover(prepp, count, ref sz, flags);
     DatabaseException.ThrowException(err);
     PreparedTransaction[] ret = new PreparedTransaction[sz];
     for (long i = 0; i < sz; i++) {
     IntPtr cPtr = new IntPtr((IntPtr.Size == 4 ? prepp.ToInt32() : prepp.ToInt64()) + i * (IntPtr.Size + DbConstants.DB_GID_SIZE));
     DB_PREPLIST prep = new DB_PREPLIST(cPtr, false);
     ret[i] = new PreparedTransaction(prep);
     }
     Marshal.FreeHGlobal(prepp);
     return ret;
 }