Пример #1
0
        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();
        }
Пример #2
0
        public void GetSecCursor(BTreeDatabase db,
		    string secFileName, SecondaryKeyGenDelegate keyGen,
		    out SecondaryBTreeDatabase secDB,
		    out SecondaryCursor cursor, bool ifCfg,
		    DatabaseEntry data)
        {
            // Open secondary database.
            SecondaryBTreeDatabaseConfig secCfg =
                new SecondaryBTreeDatabaseConfig(db, keyGen);
            secCfg.Creation = CreatePolicy.IF_NEEDED;
            secCfg.Duplicates = DuplicatesPolicy.SORTED;
            secDB = SecondaryBTreeDatabase.Open(secFileName, secCfg);

            int[] intArray = new int[4];
            intArray[0] = 0;
            intArray[1] = 1;
            intArray[2] = 2049;
            intArray[3] = 65537;
            for (int i = 0; i < 4; i++)
            {
                DatabaseEntry record = new DatabaseEntry(
                    BitConverter.GetBytes(intArray[i]));
                db.Put(record, record);
            }

            // Get secondary cursor on the secondary database.
            if (ifCfg == false)
                cursor = secDB.SecondaryCursor();
            else
                cursor = secDB.SecondaryCursor(new CursorConfig());

            // Position the cursor.
            if (data != null)
                Assert.IsTrue(cursor.Move(data, true));
        }
Пример #3
0
        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();
        }
Пример #4
0
        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 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 TestCurrent()
        {
            testName = "TestCurrent";
            SetUpTest(true);
            string dbFileName    = testHome + "/" + testName + ".db";
            string dbSecFileName = testHome + "/" + testName +
                                   "_sec.db";

            // Open a primary database and its secondary database.
            BTreeDatabase          db;
            SecondaryBTreeDatabase secDB;

            OpenSecDB(dbFileName, dbSecFileName, out db, out secDB);

            // Put a pair of key and data into database.
            DatabaseEntry key, data;

            key = new DatabaseEntry(
                ASCIIEncoding.ASCII.GetBytes("key"));
            data = new DatabaseEntry(
                ASCIIEncoding.ASCII.GetBytes("data"));
            db.Put(key, data);

            // Delete the pair with cursor.
            SecondaryCursor secCursor = secDB.SecondaryCursor();

            Assert.IsTrue(secCursor.Move(data, true));

            // Confirm that the current is the one we put into database.
            Assert.AreEqual(data.Data, secCursor.Current.Key.Data);

            // Close all databases.
            secDB.Close();
            db.Close();
        }
Пример #7
0
        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();
        }
Пример #8
0
        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 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();
        }
Пример #10
0
        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();
        }
Пример #11
0
        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();
        }
Пример #12
0
        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();
        }
Пример #13
0
        public void GetSecCursor(BTreeDatabase db,
                                 string secFileName, SecondaryKeyGenDelegate keyGen,
                                 out SecondaryBTreeDatabase secDB,
                                 out SecondaryCursor cursor, bool ifCfg,
                                 DatabaseEntry data)
        {
            // Open secondary database.
            SecondaryBTreeDatabaseConfig secCfg =
                new SecondaryBTreeDatabaseConfig(db, keyGen);

            secCfg.Creation   = CreatePolicy.IF_NEEDED;
            secCfg.Duplicates = DuplicatesPolicy.SORTED;
            secDB             = SecondaryBTreeDatabase.Open(secFileName, secCfg);

            int[] intArray = new int[4];
            intArray[0] = 0;
            intArray[1] = 1;
            intArray[2] = 2049;
            intArray[3] = 65537;
            for (int i = 0; i < 4; i++)
            {
                DatabaseEntry record = new DatabaseEntry(
                    BitConverter.GetBytes(intArray[i]));
                db.Put(record, record);
            }

            // Get secondary cursor on the secondary database.
            if (ifCfg == false)
            {
                cursor = secDB.SecondaryCursor();
            }
            else
            {
                cursor = secDB.SecondaryCursor(new CursorConfig());
            }

            // Position the cursor.
            if (data != null)
            {
                Assert.IsTrue(cursor.Move(data, true));
            }
        }
Пример #14
0
        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();
        }
Пример #15
0
        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();
        }
Пример #16
0
        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();
        }