示例#1
0
  void insertBadKeyCursorTest() {
    ups_key_t key = {};
    ups_record_t rec = {};
    ups_cursor_t *cursor;
    RecnoType recno;

    REQUIRE(0 == ups_cursor_create(&cursor, db, 0, 0));

    key.flags = 0;
    key.data = &recno;
    key.size = sizeof(recno);
    REQUIRE(UPS_INV_PARAMETER == ups_cursor_insert(cursor, &key, &rec, 0));

    key.data = 0;
    key.size = sizeof(RecnoType);
    REQUIRE(UPS_INV_PARAMETER == ups_cursor_insert(cursor, &key, &rec, 0));

    REQUIRE(UPS_INV_PARAMETER == ups_cursor_insert(cursor, 0, &rec, 0));

    key.data = 0;
    key.size = 0;
    REQUIRE(0 == ups_cursor_insert(cursor, &key, &rec, 0));
    REQUIRE((RecnoType)1ull == *(RecnoType *)key.data);

    REQUIRE(0 == ups_cursor_close(cursor));
  }
示例#2
0
  void overwriteCursorTest() {
    ups_key_t key = {};
    ups_record_t rec = {};
    RecnoType recno, value;
    ups_cursor_t *cursor;

    REQUIRE(0 == ups_cursor_create(&cursor, db, 0, 0));

    key.data = &recno;
    key.flags = UPS_KEY_USER_ALLOC;
    key.size = sizeof(recno);
    REQUIRE(0 == ups_cursor_insert(cursor, &key, &rec, 0));

    value = 0x13ull;
    memset(&rec, 0, sizeof(rec));
    rec.data = &value;
    rec.size = sizeof(value);
    REQUIRE(0 == ups_cursor_insert(cursor, &key, &rec, UPS_OVERWRITE));

    memset(&rec, 0, sizeof(rec));
    REQUIRE(0 == ups_db_find(db, 0, &key, &rec, 0));

    REQUIRE(value == *(RecnoType *)rec.data);

    REQUIRE(0 == ups_cursor_close(cursor));
  }
示例#3
0
  void createInsertCloseReopenCursorTest(void)
  {
    ups_key_t key = {};
    ups_record_t rec = {};
    ups_cursor_t *cursor;
    RecnoType recno, value = 1;

    key.flags = UPS_KEY_USER_ALLOC;
    key.data = &recno;
    key.size = sizeof(recno);

    rec.data = &value;
    rec.size = sizeof(value);

    REQUIRE(0 == ups_cursor_create(&cursor, db, 0, 0));

    for (int i = 0; i < 5; i++) {
      REQUIRE(0 == ups_cursor_insert(cursor, &key, &rec, 0));
      REQUIRE(recno == (RecnoType)i + 1);
    }

    REQUIRE(0 == ups_cursor_close(cursor));
    reopen();
    REQUIRE(0 == ups_cursor_create(&cursor, db, 0, 0));

    for (int i = 5; i < 10; i++) {
      REQUIRE(0 == ups_cursor_insert(cursor, &key, &rec, 0));
      REQUIRE(recno == (RecnoType)i + 1);
    }

    REQUIRE(0 == ups_cursor_close(cursor));
  }
示例#4
0
  void uncoupleTest() {
    ups_key_t key = {};
    ups_record_t rec = {};
    RecnoType recno;
    ups_cursor_t *cursor, *c2;

    key.flags = UPS_KEY_USER_ALLOC;
    key.data = &recno;
    key.size = sizeof(recno);

    REQUIRE(0 == ups_cursor_create(&cursor, db, 0, 0));
    REQUIRE(0 == ups_cursor_create(&c2, db, 0, 0));

    for (int i = 0; i < 5; i++) {
      REQUIRE(0 == ups_cursor_insert(cursor, &key, &rec, 0));
      REQUIRE(recno == (RecnoType)i + 1);
    }

    Page *page = btree_index()->root_page(context.get());
    REQUIRE(page != 0);
    context->changeset.clear(); // unlock pages
    BtreeCursor::uncouple_all_cursors(context.get(), page, 0);

    for (int i = 0; i < 5; i++) {
      REQUIRE(0 == ups_cursor_move(c2, &key, &rec, UPS_CURSOR_NEXT));
      REQUIRE(recno == (RecnoType)i + 1);
    }
  }
示例#5
0
 /** Inserts a key/record pair. */
 void insert(key *k, record *r, uint32_t flags = 0) {
   ups_status_t st = ups_cursor_insert(m_cursor, k ? k->get_handle() : 0,
                       r ? r->get_handle() : 0, flags);
   if (st)
     throw error(st);
 }