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); } }
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)); }
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)); }
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)); }
/** Creates a new Cursor. */ void create(db *db, txn *t = 0, uint32_t flags = 0) { if (m_cursor) close(); if (db) { ups_status_t st = ups_cursor_create(&m_cursor, db->get_handle(), t ? t->get_handle() : 0, flags); if (st) throw error(st); } }