public void TestMoveLast() { testName = "TestMoveLast"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); WriteRecords(db); SecondaryCursor cursor = secDB.SecondaryCursor(); Assert.IsTrue(cursor.MoveLast()); Assert.AreEqual(BitConverter.GetBytes((int)10), cursor.Current.Key.Data); cursor.Close(); secDB.Close(); db.Close(); }
public void TestMoveNext() { testName = "TestMoveNext"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); WriteRecords(db); SecondaryCursor cursor = secDB.SecondaryCursor(); cursor.MoveFirst(); for (int i = 0; i < 5; i++) { Assert.IsTrue(cursor.MoveNext()); } cursor.Close(); secDB.Close(); db.Close(); }
public void TestMovePrev() { testName = "TestMovePrev"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); WriteRecords(db); SecondaryCursor cursor = secDB.SecondaryCursor(); cursor.MoveLast(); for (int i = 0; i < 5; i++) { Assert.IsTrue(cursor.MovePrev()); } cursor.Close(); secDB.Close(); db.Close(); }
public void TestMoveNextDuplicate() { testName = "TestMoveNextDuplicate"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); WriteRecords(db); // Create a cursor and move the cursor to duplicate record. SecondaryCursor cursor = secDB.SecondaryCursor(); cursor.Move(new DatabaseEntry( BitConverter.GetBytes((int)10)), true); Assert.IsTrue(cursor.MoveNextDuplicate()); Assert.AreEqual(BitConverter.GetBytes((int)10), cursor.Current.Key.Data); cursor.Close(); secDB.Close(); db.Close(); }
public void TestMoveNextUnique() { testName = "TestMoveNextUnique"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); WriteRecords(db); /* * Move cursor to duplicate record. Since the duplicate * record has the largest key, moving to the next * unique record should fail. */ SecondaryCursor cursor = secDB.SecondaryCursor(); cursor.Move(new DatabaseEntry( BitConverter.GetBytes((int)10)), true); Assert.IsFalse(cursor.MoveNextUnique()); cursor.Close(); secDB.Close(); db.Close(); }
public void TestRefresh() { testName = "TestRefresh"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); WriteRecords(db); SecondaryCursor cursor = secDB.SecondaryCursor(); KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > pair; DatabaseEntry pKey, pData; pKey = new DatabaseEntry(BitConverter.GetBytes((int)6)); pData = new DatabaseEntry(BitConverter.GetBytes((int)10)); pair = new KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> >(pData, new KeyValuePair <DatabaseEntry, DatabaseEntry>( pKey, pData)); cursor.Move(pair, true); Assert.IsTrue(cursor.Refresh()); Assert.AreEqual(pData.Data, cursor.Current.Key.Data); Assert.AreEqual(pKey.Data, cursor.Current.Value.Key.Data); cursor.Close(); secDB.Close(); db.Close(); }
public void TestMoveFirst() { testName = "TestMoveFirst"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); // Open primary and secondary database. BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); // Write ten records into the database. WriteRecords(db); // Move the cursor to the first record(0,0). SecondaryCursor cursor = secDB.SecondaryCursor(); Assert.IsTrue(cursor.MoveFirst()); Assert.AreEqual(BitConverter.GetBytes((int)0), cursor.Current.Key.Data); // Close all. cursor.Close(); secDB.Close(); db.Close(); }
public void TestMovePrevDuplicateWithLockingInfo() { testName = "TestMovePrevDuplicateWithLockingInfo"; testHome = testFixtureHome + "/" + testName; string dbFileName = testName + ".db"; string dbSecFileName = testName + "_sec.db"; Configuration.ClearDir(testHome); /* * Open environment, primary database and * secondary database. */ BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(testHome, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor cursor = secDB.SecondaryCursor(cursorTxn); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_TWO; lockingInfo.ReadModifyWrite = true; /* * Move the cursor to the record(10,6), that is the * record(6, 10) in the primary database. Move to * its previous duplicate record, that is (10,5). */ KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > pair; DatabaseEntry pKey, pData; pKey = new DatabaseEntry(BitConverter.GetBytes((int)6)); pData = new DatabaseEntry(BitConverter.GetBytes((int)10)); pair = new KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> >(pData, new KeyValuePair <DatabaseEntry, DatabaseEntry>( pKey, pData)); cursor.Move(pair, true, lockingInfo); Assert.IsTrue(cursor.MovePrevDuplicate(lockingInfo)); Assert.AreEqual(BitConverter.GetBytes((int)10), cursor.Current.Key.Data); cursor.Close(); cursorTxn.Commit(); // Close all. secDB.Close(); db.Close(); env.Close(); }
public void TestMovePrevUniqueWithLockingInfo() { testName = "TestMovePrevUniqueWithLockingInfo"; SetUpTest(true); string dbFileName = testName + ".db"; string dbSecFileName = testName + "_sec.db"; /* * Open environment, primary database and * secondary database. */ BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(testHome, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor cursor = secDB.SecondaryCursor(cursorTxn); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_TWO; lockingInfo.ReadModifyWrite = true; /* * Move the cursor to the record(10, 6) and move to the * previous unique record which has different key from * the record(10,6). */ KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > pair; DatabaseEntry pKey, pData; pKey = new DatabaseEntry(BitConverter.GetBytes((int)6)); pData = new DatabaseEntry(BitConverter.GetBytes((int)10)); pair = new KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> >(pData, new KeyValuePair <DatabaseEntry, DatabaseEntry>( pKey, pData)); cursor.Move(pair, true, lockingInfo); Assert.IsTrue(cursor.MovePrevUnique(lockingInfo)); Assert.AreNotEqual(BitConverter.GetBytes((int)10), cursor.Current.Key.Data); cursor.Close(); cursorTxn.Commit(); // Close all. secDB.Close(); db.Close(); env.Close(); }
public void MoveToPos(string dbFileName, string dbSecFileName, bool ifPair) { // Open a primary database and its secondary database. BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); // Write ten records into the database. WriteRecords(db); SecondaryCursor secCursor = secDB.SecondaryCursor(); DatabaseEntry key = new DatabaseEntry( BitConverter.GetBytes((int)0)); DatabaseEntry notExistingKey = new DatabaseEntry( BitConverter.GetBytes((int)100)); if (ifPair == false) { Assert.IsTrue(secCursor.Move(key, true)); Assert.IsFalse(secCursor.Move(notExistingKey, true)); } else { KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > pair = new KeyValuePair <DatabaseEntry, KeyValuePair <DatabaseEntry, DatabaseEntry> >(key, new KeyValuePair <DatabaseEntry, DatabaseEntry>( key, key)); KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > notExistingPair; notExistingPair = new KeyValuePair <DatabaseEntry, KeyValuePair <DatabaseEntry, DatabaseEntry> >( notExistingKey, new KeyValuePair < DatabaseEntry, DatabaseEntry>( notExistingKey, notExistingKey)); Assert.IsTrue(secCursor.Move(pair, true)); Assert.IsFalse(secCursor.Move(notExistingPair, true)); } secCursor.Close(); secDB.Close(); db.Close(); }
public void TestMoveNextDuplicateWithLockingInfo() { testName = "TestMoveNextDuplicateWithLockingInfo"; testHome = testFixtureHome + "/" + testName; string dbFileName = testName + ".db"; string dbSecFileName = testName + "_sec.db"; Configuration.ClearDir(testHome); /* * Open environment, primary database and * secondary database. */ BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(testHome, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); /* * Create a cursor and move the cursor to duplicate * record(10, 5), that is record(5,10) in primary database. * Then move the cursor to the next duplicate record * (10, 6), that is record(6,10) in primary database. */ Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor cursor = secDB.SecondaryCursor(cursorTxn); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_THREE; lockingInfo.ReadModifyWrite = true; cursor.Move(new DatabaseEntry( BitConverter.GetBytes((int)10)), true, lockingInfo); Assert.IsTrue(cursor.MoveNextDuplicate(lockingInfo)); Assert.AreEqual(BitConverter.GetBytes((int)10), cursor.Current.Key.Data); cursor.Close(); cursorTxn.Commit(); // Close all. secDB.Close(); db.Close(); env.Close(); }
public void TestMovePrevWithLockingInfo() { testName = "TestMovePrevWithLockingInfo"; testHome = testFixtureHome + "/" + testName; string dbFileName = testName + ".db"; string dbSecFileName = testName + "_sec.db"; Configuration.ClearDir(testHome); /* * Open environment, primary database and * secondary database. */ BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(testHome, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); /* * Move the cursor to the last record and move to its * previous record for five times. */ Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor cursor = secDB.SecondaryCursor(cursorTxn); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_TWO; lockingInfo.ReadModifyWrite = true; cursor.MoveLast(lockingInfo); for (int i = 0; i < 5; i++) { Assert.IsTrue(cursor.MovePrev(lockingInfo)); } cursor.Close(); cursorTxn.Commit(); // Close all. secDB.Close(); db.Close(); env.Close(); }
public void TestMoveNextUniqueWithLockingInfo() { testName = "TestMoveNextUniqueWithLockingInfo"; testHome = testFixtureHome + "/" + testName; string dbFileName = testName + ".db"; string dbSecFileName = testName + "_sec.db"; Configuration.ClearDir(testHome); /* * Open environment, primary database and * secondary database. */ BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(testHome, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); /* * Move cursor to duplicate record. Since the duplicate * record has the largest key, moving to the next * unique record should fail. */ Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor cursor = secDB.SecondaryCursor(cursorTxn); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_THREE; lockingInfo.ReadModifyWrite = true; cursor.Move(new DatabaseEntry( BitConverter.GetBytes((int)10)), true); Assert.IsFalse(cursor.MoveNextUnique()); cursor.Close(); cursorTxn.Commit(); // Close all. secDB.Close(); db.Close(); env.Close(); }
public void MoveToPosWithLockingInfo(string home, string dbFileName, string dbSecFileName, bool ifPair) { // Open a primary database and its secondary database. BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(home, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); // Create an secondary cursor. Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor secCursor = secDB.SecondaryCursor( cursorTxn); DatabaseEntry key = new DatabaseEntry( BitConverter.GetBytes((int)0)); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_THREE; lockingInfo.ReadModifyWrite = true; if (ifPair == false) { Assert.IsTrue(secCursor.Move(key, true, lockingInfo)); } else { KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > pair; pair = new KeyValuePair <DatabaseEntry, KeyValuePair <DatabaseEntry, DatabaseEntry> >(key, new KeyValuePair <DatabaseEntry, DatabaseEntry>( key, key)); Assert.IsTrue(secCursor.Move(pair, true, lockingInfo)); } secCursor.Close(); cursorTxn.Commit(); secDB.Close(); db.Close(); env.Close(); }
public void TestMoveNextWithLockingInfo() { testName = "TestMoveNextWithLockingInfo"; SetUpTest(true); string dbFileName = testName + ".db"; string dbSecFileName = testName + "_sec.db"; /* * Open environment, primary database and * secondary database. */ BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(testHome, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); /* * Move cursor to the first record and move to next * record for five times. */ Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor cursor = secDB.SecondaryCursor(cursorTxn); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_THREE; lockingInfo.ReadModifyWrite = true; cursor.MoveFirst(lockingInfo); for (int i = 0; i < 5; i++) { Assert.IsTrue(cursor.MoveNext(lockingInfo)); } cursor.Close(); cursorTxn.Commit(); // Close all. secDB.Close(); db.Close(); env.Close(); }
public void TestSecondaryCursor() { testName = "TestSecondaryCursor"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; Configuration.ClearDir(testHome); // Open primary database. BTreeDatabaseConfig primaryDBConfig = new BTreeDatabaseConfig(); primaryDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase primaryDB = BTreeDatabase.Open(dbFileName, primaryDBConfig); // Open secondary database. SecondaryBTreeDatabaseConfig secDBConfig = new SecondaryBTreeDatabaseConfig(primaryDB, new SecondaryKeyGenDelegate(SecondaryKeyGen)); SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbFileName, secDBConfig); primaryDB.Put(new DatabaseEntry( BitConverter.GetBytes((int)1)), new DatabaseEntry(BitConverter.GetBytes((int)11))); SecondaryCursor cursor = secDB.SecondaryCursor(); cursor.Move(new DatabaseEntry( BitConverter.GetBytes((int)11)), true); Assert.AreEqual(BitConverter.GetBytes((int)11), cursor.Current.Key.Data); // Close the cursor. cursor.Close(); // Close secondary database. secDB.Close(); // Close primary database. primaryDB.Close(); }
public void TestMoveLastWithLockingInfo() { testName = "TestMoveLastWithLockingInfo"; SetUpTest(true); string dbFileName = testName + ".db"; string dbSecFileName = testName + "_sec.db"; /* * Open environment, primary database and * secondary database. */ BTreeDatabase db; DatabaseEnvironment env; SecondaryBTreeDatabase secDB; OpenSecDBInTxn(testHome, dbFileName, dbSecFileName, out env, out db, out secDB); // Write ten records into the database. WriteRecordsInTxn(db, env); /* * Move the cursor to the last record(10, 6), that is * record(6, 10) in primary database. */ Transaction cursorTxn = env.BeginTransaction(); SecondaryCursor cursor = secDB.SecondaryCursor(cursorTxn); LockingInfo lockingInfo = new LockingInfo(); lockingInfo.IsolationDegree = Isolation.DEGREE_THREE; lockingInfo.ReadModifyWrite = true; Assert.IsTrue(cursor.MoveLast(lockingInfo)); Assert.AreEqual(BitConverter.GetBytes((int)10), cursor.Current.Key.Data); cursor.Close(); cursorTxn.Commit(); // Close all. secDB.Close(); db.Close(); env.Close(); }
public void TestGetEnumerator() { testName = "TestGetEnumerator"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); // Open a primary database and its secondary database. BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); // Write ten records into the database. WriteRecords(db); /* * Get all records from the secondary database and see * if the records with key other than 10 have the same as * their primary key. */ SecondaryCursor secCursor = secDB.SecondaryCursor(); foreach (KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > secData in secCursor) { if (BitConverter.ToInt32(secData.Key.Data, 0) != 10) { Assert.AreEqual(secData.Value.Key.Data, secData.Value.Value.Data); } } // Close all cursors and databases. secCursor.Close(); secDB.Close(); db.Close(); }
public void TestSecondaryCursorWithConfig() { testName = "TestSecondaryCursorWithConfig"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; Configuration.ClearDir(testHome); BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenPrimaryAndSecondaryDB(dbFileName, out db, out secDB); for (int i = 0; i < 10; i++) { db.Put(new DatabaseEntry(BitConverter.GetBytes(i)), new DatabaseEntry(BitConverter.GetBytes((int)i))); } CursorConfig cursorConfig = new CursorConfig(); cursorConfig.WriteCursor = false; SecondaryCursor cursor = secDB.SecondaryCursor(cursorConfig); cursor.Move(new DatabaseEntry( BitConverter.GetBytes((int)5)), true); Assert.AreEqual(1, cursor.Count()); // Close the cursor. cursor.Close(); // Close secondary database. secDB.Close(); // Close primary database. db.Close(); }
public void TestMovePrevUnique() { testName = "TestMovePrevUnique"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); BTreeDatabase db; SecondaryBTreeDatabase secDB; OpenSecDB(dbFileName, dbSecFileName, out db, out secDB); WriteRecords(db); SecondaryCursor cursor = secDB.SecondaryCursor(); KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> > pair; DatabaseEntry pKey, pData; pKey = new DatabaseEntry(BitConverter.GetBytes((int)6)); pData = new DatabaseEntry(BitConverter.GetBytes((int)10)); pair = new KeyValuePair <DatabaseEntry, KeyValuePair < DatabaseEntry, DatabaseEntry> >(pData, new KeyValuePair <DatabaseEntry, DatabaseEntry>( pKey, pData)); cursor.Move(pair, true); Assert.IsTrue(cursor.MovePrevUnique()); Assert.AreNotEqual(BitConverter.GetBytes((int)10), cursor.Current.Key.Data); cursor.Close(); secDB.Close(); db.Close(); }
public void TestDuplicate() { testName = "TestDuplicate"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); // Open a primary database. BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase db = BTreeDatabase.Open( dbFileName, dbConfig); // Open a secondary database. SecondaryBTreeDatabaseConfig secConfig = new SecondaryBTreeDatabaseConfig(db, new SecondaryKeyGenDelegate(SecondaryKeyGen)); secConfig.Creation = CreatePolicy.IF_NEEDED; secConfig.Duplicates = DuplicatesPolicy.UNSORTED; SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbSecFileName, secConfig); // Put a pair of key and data into the database. DatabaseEntry key, data; key = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes("key")); data = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes("data")); db.Put(key, data); // Create a cursor. SecondaryCursor cursor = secDB.SecondaryCursor(); cursor.Move(key, true); // Duplicate the cursor. SecondaryCursor dupCursor; dupCursor = cursor.Duplicate(true); /* * Confirm that the duplicate cursor has the same * position as the original one. */ Assert.AreEqual(cursor.Current.Key, dupCursor.Current.Key); Assert.AreEqual(cursor.Current.Value, dupCursor.Current.Value); // Close the cursor and the duplicate cursor. dupCursor.Close(); cursor.Close(); // Close secondary and primary database. secDB.Close(); db.Close(); }