A Database Cursor class
Наследование: IDisposable
Пример #1
0
 private void Find()
 {
     Cursor c = new Cursor(db);
     byte[] k1 = new byte[5]; k1[0] = 5;
     byte[] k2 = new byte[5]; k2[0] = 6;
     byte[] r1 = new byte[5]; r1[0] = 1;
     byte[] r2 = new byte[5]; r2[0] = 2;
     db.Insert(k1, r1);
     db.Insert(k2, r2);
     c.Find(k1);
     byte[] f = c.GetRecord();
     checkEqual(r1, f);
     c.Find(k2);
     byte[] g = c.GetRecord();
     checkEqual(r2, g);
 }
Пример #2
0
        private void GetDuplicateCount()
        {
            Cursor c = new Cursor(db);
            byte[] k1 = new byte[5]; k1[0] = 5;
            byte[] r1 = new byte[5]; r1[0] = 1;
            byte[] r2 = new byte[5]; r2[0] = 2;
            byte[] r3 = new byte[5]; r2[0] = 2;
            c.Insert(k1, r1);
            Assert.AreEqual(1, c.GetDuplicateCount());

            c.Insert(k1, r2, UpsConst.UPS_DUPLICATE);
            Assert.AreEqual(2, c.GetDuplicateCount());

            c.Insert(k1, r3, UpsConst.UPS_DUPLICATE);
            Assert.AreEqual(3, c.GetDuplicateCount());

            c.Erase();
            c.MoveFirst();
            Assert.AreEqual(2, c.GetDuplicateCount());
        }
Пример #3
0
 private void TryFind()
 {
     Cursor c = new Cursor(db);
     byte[] k1 = new byte[5]; k1[0] = 5;
     byte[] k2 = new byte[5]; k2[0] = 6;
     byte[] k3 = new byte[5]; k3[0] = 7;
     byte[] r1 = new byte[5]; r1[0] = 1;
     byte[] r2 = new byte[5]; r2[0] = 2;
     db.Insert(k1, r1);
     db.Insert(k2, r2);
     var f = c.TryFind(k1);
     checkEqual(r1, f);
     var g = c.TryFind(k2);
     checkEqual(r2, g);
     var h = c.TryFind(k3);
     Assert.IsNull(h);
 }
Пример #4
0
 private void CursorTest()
 {
     Transaction t = env.Begin();
     Cursor c = new Cursor(db, t);
     byte[] k = new byte[5];
     byte[] r = new byte[5];
     c.Insert(k, r);
     db.Find(t, k);
     c.Close();
     t.Commit();
     db.Find(k);
 }
Пример #5
0
        private void Move()
        {
            Cursor c = new Cursor(db);
            byte[] k = new byte[5];
            byte[] r = new byte[5];

            k[0] = 0;
            db.Insert(k, r);
            k[0] = 1;
            db.Insert(k, r);
            k[0] = 2;
            db.Insert(k, r);
            k[0] = 3;
            db.Insert(k, r);
            k[0] = 4;
            db.Insert(k, r);

            c.Move(UpsConst.UPS_CURSOR_NEXT);
            c.Move(UpsConst.UPS_CURSOR_NEXT);
            c.Move(UpsConst.UPS_CURSOR_PREVIOUS);
            c.Move(UpsConst.UPS_CURSOR_LAST);
            c.Move(UpsConst.UPS_CURSOR_FIRST);
        }
Пример #6
0
 private void MovePrevious()
 {
     Cursor c = new Cursor(db);
     byte[] k = new byte[5];
     byte[] r = new byte[5];
     db.Insert(k, r);
     c.MovePrevious();
 }
Пример #7
0
        private void Cursor10000Test()
        {
            //create database
            Upscaledb.Environment env = new Upscaledb.Environment();
            env.Create("ntest.db");

            Parameter[] param = new Parameter[1];
            param[0] = new Parameter();
            param[0].name = UpsConst.UPS_PARAM_KEY_TYPE;
            param[0].value = UpsConst.UPS_TYPE_UINT64;
            Database db = env.CreateDatabase(1, 0, param);

            //insert records
            for (ulong i = 0; i < 10000; i++)
            {
                byte[] key = BitConverter.GetBytes(i);
                byte[] record = new byte[20];
                db.Insert(key, record);
            }

            //close database
            db.Close();

            //reopen again
            db = env.OpenDatabase(1);
            Cursor cursor = new Cursor(db);

            cursor.MoveFirst();
            ulong firstKey = BitConverter.ToUInt64(cursor.GetKey(), 0);
            Assert.AreEqual((ulong)0, firstKey);

            cursor.MoveLast();
            ulong lastKey = BitConverter.ToUInt64(cursor.GetKey(), 0);
            Assert.AreEqual((ulong)9999, lastKey);

            //close database
            cursor.Close();
            db.Close();
            env.Close();
        }
Пример #8
0
        private void InsertDuplicate()
        {
            Cursor c = new Cursor(db);
            byte[] q;
            byte[] k1 = new byte[5]; k1[0] = 5;
            byte[] r1 = new byte[5]; r1[0] = 1;
            byte[] r2 = new byte[5]; r2[0] = 2;
            c.Insert(k1, r1);
            q = c.GetRecord();
            checkEqual(r1, q);
            q = c.GetKey();
            checkEqual(k1, q);

            c.Insert(k1, r2, UpsConst.UPS_DUPLICATE);
            q = c.GetRecord();
            checkEqual(r2, q);
            q = c.GetKey();
            checkEqual(k1, q);
        }
Пример #9
0
 /// <summary>
 /// Clones a Database Cursor
 /// </summary>
 /// <remarks>
 /// This method wraps the native ups_cursor_clone function.
 /// <br />
 /// Clones an existing Cursor. The new Cursor will point to exactly the
 /// same item as the old Cursor. If the old Cursor did not point
 /// to any item, so will the new Cursor.
 ///
 /// If the old Cursor is bound to a Transaction, then the new
 /// Cursor will also be bound to this Transaction.
 /// </remarks>
 /// <returns>The new Cursor object</returns>
 /// <exception cref="DatabaseException">
 ///   <list type="bullet">
 ///   <item><see cref="UpsConst.UPS_OUT_OF_MEMORY"/>
 ///     if the new structure could not be allocated</item>
 ///   </list>
 /// </exception>
 public Cursor Clone()
 {
     IntPtr newHandle = new IntPtr(0);
       lock (this.db) {
     int st = NativeMethods.CursorClone(handle, out newHandle);
     if (st != 0)
       throw new DatabaseException(st);
     Cursor c = new Cursor(db, newHandle);
     db.AddCursor(c);
     return c;
       }
 }
Пример #10
0
 private void AutoCleanupCursors4()
 {
     Upscaledb.Environment env = new Upscaledb.Environment();
     Database db = new Database();
     env.Create("ntest.db");
     db = env.CreateDatabase(1);
     Cursor cursor1 = new Cursor(db);
     Cursor cursor2 = cursor1.Clone();
     Cursor cursor3 = cursor1.Clone();
     Cursor cursor4 = cursor1.Clone();
     Cursor cursor5 = cursor1.Clone();
     cursor3.Close();
     cursor5.Close();
     // let gc do the cleanup
     env.Close();
 }
Пример #11
0
 /// <summary>
 /// Removes a Cursor from the Cursor list
 /// </summary>
 public void RemoveCursor(Cursor c)
 {
     cursors.Remove(c);
 }
Пример #12
0
 /// <summary>
 /// Adds a Cursor to the Cursor list
 /// </summary>
 public void AddCursor(Cursor c)
 {
     cursors.Add(c);
 }
Пример #13
0
        static void Main(string[] args)
        {
            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            Upscaledb.Environment env = new Upscaledb.Environment();
            Database[] db = new Database[3];
            Cursor[] cursor = new Cursor[3];

            /*
             * set up the customer and order data - these arrays will later
             * be inserted into the Databases
             */
            Customer[] customers = new Customer[4];
            customers[0] = new Customer(1, "Alan Antonov Corp.");
            customers[1] = new Customer(2, "Barry Broke Inc.");
            customers[2] = new Customer(3, "Carl Caesar Lat.");
            customers[3] = new Customer(4, "Doris Dove Brd.");

            Order[] orders = new Order[8];
            orders[0] = new Order(1, 1, "Joe");
            orders[1] = new Order(2, 1, "Tom");
            orders[2] = new Order(3, 3, "Joe");
            orders[3] = new Order(4, 4, "Tom");
            orders[4] = new Order(5, 3, "Ben");
            orders[5] = new Order(6, 3, "Ben");
            orders[6] = new Order(7, 4, "Chris");
            orders[7] = new Order(8, 1, "Ben");

            /*
             * Create a new Environment
             */
            env.Create("test.db");

            /*
             * then create the three Databases in this Environment; each Database
             * has a name - the first is our "customer" Database, the second
             * is for the "orders"; the third manages our 1:n relation and
             * therefore needs to enable duplicate keys
             */
            db[DBIDX_CUSTOMER] = env.CreateDatabase(DBNAME_CUSTOMER);
            db[DBIDX_ORDER]    = env.CreateDatabase(DBNAME_ORDER);
            db[DBIDX_C2O]      = env.CreateDatabase(DBNAME_C2O,
                    UpsConst.UPS_ENABLE_DUPLICATE_KEYS);

            /*
             * create a Cursor for each Database
             */
            cursor[DBIDX_CUSTOMER] = new Cursor(db[DBIDX_CUSTOMER]);
            cursor[DBIDX_ORDER] = new Cursor(db[DBIDX_ORDER]);
            cursor[DBIDX_C2O] = new Cursor(db[DBIDX_C2O]);

            /*
             * Insert the customers in the customer Database
             *
             * INSERT INTO customers VALUES (1, "Alan Antonov Corp.");
             * INSERT INTO customers VALUES (2, "Barry Broke Inc.");
             * etc.
             */
            for (int i = 0; i < customers.GetLength(0); i++) {
                byte[] key = customers[i].GetKey();
                byte[] rec = customers[i].GetRecord();

                db[DBIDX_CUSTOMER].Insert(key, rec);
            }

            /*
             * Insert the orders in the order Database
             *
             * INSERT INTO orders VALUES (1, "Joe");
             * INSERT INTO orders VALUES (2, "Tom");
             * etc.
             */
            for (int i = 0; i < orders.GetLength(0); i++) {
                byte[] key = orders[i].GetKey();
                byte[] rec = orders[i].GetRecord();

                db[DBIDX_ORDER].Insert(key, rec);
            }

            /*
             * and now the 1:n relationships; the flag UPS_DUPLICATE creates
             * a duplicate key, if the key already exists
             *
             * INSERT INTO c2o VALUES (1, 1);
             * INSERT INTO c2o VALUES (2, 1);
             * etc
             */
            for (int i = 0; i < orders.GetLength(0); i++) {
                byte[] key = orders[i].GetCustomerKey();
                byte[] rec = orders[i].GetKey();

                db[DBIDX_C2O].Insert(key, rec, UpsConst.UPS_DUPLICATE);
            }

            /*
             * now start the queries - we want to dump each customer and
             * his orders
             *
             * loop over the customer; for each customer, loop over the
             * 1:n table and pick those orders with the customer id.
             * then load the order and print it
             *
             * the outer loop is similar to
             * SELECT * FROM customers WHERE 1;
             */
            while (1 == 1) {
                Customer c;

                try {
                    cursor[DBIDX_CUSTOMER].MoveNext();
                }
                catch (DatabaseException e) {
                    // reached end of Database?
                    if (e.ErrorCode == UpsConst.UPS_KEY_NOT_FOUND)
                        break;
                    Console.Out.WriteLine("cursor.MoveNext failed: " + e);
                    return;
                }

                // load the customer
                c = new Customer(cursor[DBIDX_CUSTOMER].GetKey(),
                        cursor[DBIDX_CUSTOMER].GetRecord());

                // print information about this customer
                Console.Out.WriteLine("customer " + c.id + " ('" + c.name + "')");

                /*
                 * loop over the 1:n table
                 *
                 * SELECT * FROM customers, orders, c2o
                 *      WHERE c2o.customer_id=customers.id AND
                 *          c2o.order_id=orders.id;
                 */
                try {
                    cursor[DBIDX_C2O].Find(c.GetKey());
                }
                catch (DatabaseException e) {
                    // no order for this customer?
                    if (e.ErrorCode == UpsConst.UPS_KEY_NOT_FOUND)
                        continue;
                    Console.Out.WriteLine("cursor.Find failed: " + e);
                    return;
                }

                do {
                    /*
                     * load the order; orderId is a byteArray with the ID of the
                     * Order; the record of the item is a byteArray with the
                     * name of the assigned employee
                     *
                     * SELECT * FROM orders WHERE id = order_id;
                     */
                    byte[] orderId = cursor[DBIDX_C2O].GetRecord();
                    cursor[DBIDX_ORDER].Find(orderId);
                    String assignee = enc.GetString(cursor[DBIDX_ORDER].GetRecord());

                    Console.Out.WriteLine("  order: " + BitConverter.ToInt32(orderId, 0) +
                        " (assigned to " + assignee + ")");

                    /*
                     * move to the next order of this customer
                     *
                     * the flag UPS_ONLY_DUPLICATES restricts the cursor
                     * movement to the duplicates of the current key.
                     */
                    try {
                        cursor[DBIDX_C2O].MoveNext(UpsConst.UPS_ONLY_DUPLICATES);
                    }
                    catch (DatabaseException e) {
                        // no more orders for this customer?
                        if (e.ErrorCode == UpsConst.UPS_KEY_NOT_FOUND)
                            break;
                        Console.Out.WriteLine("cursor.MoveNext failed: " + e);
                        return;
                    }
                } while (1 == 1);
            }
        }
Пример #14
0
 private void GetRecord()
 {
     Cursor c = new Cursor(db);
     byte[] k = new byte[5];
     byte[] r = new byte[5];
     db.Insert(k, r);
     c.MovePrevious();
     byte[] f = c.GetRecord();
     checkEqual(r, f);
 }
Пример #15
0
        private void ApproxMatching()
        {
            Upscaledb.Environment env = new Upscaledb.Environment();
            Database db = new Database();
            byte[] k1 = new byte[5];
            byte[] r1 = new byte[5];
            k1[0] = 1; r1[0] = 1;
            byte[] k2 = new byte[5];
            byte[] r2 = new byte[5];
            k2[0] = 2; r2[0] = 2;
            byte[] k3 = new byte[5];
            byte[] r3 = new byte[5];
            k3[0] = 3; r3[0] = 3;
            try
            {
                env.Create("ntest.db");
                db = env.CreateDatabase(1);
                db.Insert(k1, r1);
                db.Insert(k2, r2);
                db.Insert(k3, r3);

                Cursor c = new Cursor(db);
                byte[] r = c.Find(k2, UpsConst.UPS_FIND_GT_MATCH);
                checkEqual(r, r3);
                checkEqual(k2, k3);
                k2[0] = 2;
                r = c.Find(k2, UpsConst.UPS_FIND_GT_MATCH);
                checkEqual(r, r1);
                checkEqual(k2, k1);
                db.Close();
                env.Close();
            }
            catch (DatabaseException e)
            {
                Assert.Fail("unexpected exception " + e);
            }
        }
Пример #16
0
        private void Insert()
        {
            Cursor c = new Cursor(db);
            byte[] q;
            byte[] k1 = new byte[5]; k1[0] = 5;
            byte[] k2 = new byte[5]; k2[0] = 6;
            byte[] r1 = new byte[5]; r1[0] = 1;
            byte[] r2 = new byte[5]; r2[0] = 2;
            c.Insert(k1, r1);
            q = c.GetRecord();
            checkEqual(r1, q);
            q = c.GetKey();
            checkEqual(k1, q);

            c.Insert(k2, r2);
            q = c.GetRecord();
            checkEqual(r2, q);
            q = c.GetKey();
            checkEqual(k2, q);
        }
Пример #17
0
 private void Clone()
 {
     Cursor c1 = new Cursor(db);
     Cursor c2 = c1.Clone();
 }
Пример #18
0
        private void InsertNegative()
        {
            Cursor c = new Cursor(db);
            byte[] q;
            byte[] k1 = new byte[5]; k1[0] = 5;
            byte[] r1 = new byte[5]; r1[0] = 1;
            byte[] r2 = new byte[5]; r2[0] = 2;
            c.Insert(k1, r1);
            q = c.GetRecord();
            checkEqual(r1, q);
            q = c.GetKey();
            checkEqual(k1, q);

            try {
                c.Insert(k1, r2);
            }
            catch (DatabaseException e) {
                Assert.AreEqual(UpsConst.UPS_DUPLICATE_KEY, e.ErrorCode);
            }
        }
Пример #19
0
 private void Create()
 {
     Cursor c = new Cursor(db);
     c.Close();
 }
Пример #20
0
 private void MoveNegative()
 {
     Cursor c = new Cursor(db);
     try {
         c.Move(UpsConst.UPS_CURSOR_NEXT);
     }
     catch (DatabaseException e) {
         Assert.AreEqual(UpsConst.UPS_KEY_NOT_FOUND, e.ErrorCode);
     }
 }
Пример #21
0
 private void Erase()
 {
     Cursor c = new Cursor(db);
     byte[] k1 = new byte[5]; k1[0] = 5;
     byte[] r1 = new byte[5]; r1[0] = 1;
     c.Insert(k1, r1);
     c.Erase();
 }
Пример #22
0
 private void Overwrite()
 {
     Cursor c = new Cursor(db);
     byte[] k = new byte[5];
     byte[] r1 = new byte[5]; r1[0] = 1;
     byte[] r2 = new byte[5]; r2[0] = 2;
     db.Insert(k, r1);
     c.MoveFirst();
     byte[] f = c.GetRecord();
     checkEqual(r1, f);
     c.Overwrite(r2);
     byte[] g = c.GetRecord();
     checkEqual(r2, g);
 }
Пример #23
0
 private void EraseNegative()
 {
     Cursor c = new Cursor(db);
     try {
         c.Erase();
     }
     catch (DatabaseException e) {
         Assert.AreEqual(UpsConst.UPS_CURSOR_IS_NIL, e.ErrorCode);
     }
 }
Пример #24
0
 private void TryMove()
 {
     Cursor c = new Cursor(db);
     byte[] k1 = BitConverter.GetBytes(1UL);
     byte[] r1 = BitConverter.GetBytes(2UL);
     db.Insert(k1, r1);
     byte[] k2 = null, r2 = null;
     Assert.IsTrue(c.TryMove(ref k2, ref r2, UpsConst.UPS_CURSOR_NEXT));
     checkEqual(k1, k2);
     checkEqual(r1, r2);
     Assert.IsFalse(c.TryMove(ref k2, ref r2, UpsConst.UPS_CURSOR_NEXT));
     Assert.IsNull(k2);
     Assert.IsNull(r2);
 }
Пример #25
0
        public Result SelectRange(String query, Cursor begin, Cursor end)
        {
            int st;
              IntPtr result = new IntPtr(0);
              lock (this) {
            st = NativeMethods.EnvSelectRange(handle, query,
                                begin != null ? begin.GetHandle() : IntPtr.Zero,
                                end != null ? end.GetHandle() : IntPtr.Zero,
                                out result);
              }
              if (st != 0)
            throw new DatabaseException(st);

              return new Result(result);
        }