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(); } }
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); }
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; }