mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
test cursor prev_nodup. addresses #250
git-svn-id: file:///svn/tokudb@1889 c7de825b-a66e-492c-adef-691d508d4ae1
This commit is contained in:
@@ -19,44 +19,6 @@ int keyeq(Dbt *a, Dbt *b) {
|
||||
return memcmp(a->get_data(), b->get_data(), a->get_size()) == 0;
|
||||
}
|
||||
|
||||
void load(Db *db, int n) {
|
||||
if (verbose) printf("load\n");
|
||||
int i;
|
||||
for (i=0; i<n; i++) {
|
||||
if (i == n/2) continue;
|
||||
int k = htonl(i);
|
||||
Dbt key(&k, sizeof k);
|
||||
int v = i;
|
||||
Dbt val(&v, sizeof v);
|
||||
int r = db->put(0, &key, &val, DB_YESOVERWRITE); assert(r == 0);
|
||||
}
|
||||
|
||||
for (i=0; i<n; i++) {
|
||||
int k = htonl(n/2);
|
||||
int v = i;
|
||||
Dbt key(&k, sizeof k);
|
||||
Dbt val(&v, sizeof v);
|
||||
int r = db->put(0, &key, &val, DB_YESOVERWRITE); assert(r == 0);
|
||||
}
|
||||
}
|
||||
|
||||
void test_cursor_flags(Db *db) {
|
||||
int r;
|
||||
Dbc *cursor;
|
||||
|
||||
r = db->cursor(0, &cursor, 0); assert(r == 0);
|
||||
Dbt key; key.set_flags(DB_DBT_MALLOC);
|
||||
Dbt val; val.set_flags(DB_DBT_MALLOC);
|
||||
r = cursor->get(&key, &val, DB_FIRST); assert(r == 0);
|
||||
if (key.get_data()) free(key.get_data());
|
||||
if (val.get_data()) free(val.get_data());
|
||||
db_recno_t n;
|
||||
r = cursor->count(&n, 1); assert(r == EINVAL);
|
||||
r = cursor->count(&n, 0); assert(r == 0);
|
||||
printf("n=%d\n", n);
|
||||
r = cursor->close(); assert(r == 0);
|
||||
}
|
||||
|
||||
int my_cursor_count(Dbc *cursor, db_recno_t *count, Db *db) {
|
||||
int r;
|
||||
Dbt key; key.set_flags(DB_DBT_REALLOC);
|
||||
@@ -86,6 +48,118 @@ int my_cursor_count(Dbc *cursor, db_recno_t *count, Db *db) {
|
||||
return r;
|
||||
}
|
||||
|
||||
int my_next_nodup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
for (;;) {
|
||||
r = cursor->get(&nkey, &nval, DB_NEXT);
|
||||
if (r != 0) break;
|
||||
if (!keyeq(¤tkey, &nkey)) break;
|
||||
}
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
}
|
||||
|
||||
int my_prev_nodup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
for (;;) {
|
||||
r = cursor->get(&nkey, &nval, DB_PREV);
|
||||
if (r != 0) break;
|
||||
if (!keyeq(¤tkey, &nkey)) break;
|
||||
}
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
}
|
||||
|
||||
int my_next_dup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(&nkey, &nval, DB_NEXT);
|
||||
if (r == 0 && !keyeq(¤tkey, &nkey)) r = DB_NOTFOUND;
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
}
|
||||
|
||||
int my_prev_dup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(&nkey, &nval, DB_PREV);
|
||||
if (r == 0 && !keyeq(¤tkey, &nkey)) r = DB_NOTFOUND;
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
}
|
||||
|
||||
void load(Db *db, int n) {
|
||||
if (verbose) printf("load\n");
|
||||
int i;
|
||||
for (i=0; i<n; i++) {
|
||||
if (i == n/2) continue;
|
||||
int k = htonl(i);
|
||||
Dbt key(&k, sizeof k);
|
||||
int v = i;
|
||||
Dbt val(&v, sizeof v);
|
||||
int r = db->put(0, &key, &val, DB_YESOVERWRITE); assert(r == 0);
|
||||
}
|
||||
|
||||
for (i=0; i<n; i++) {
|
||||
int k = htonl(n/2);
|
||||
int v = i;
|
||||
Dbt key(&k, sizeof k);
|
||||
Dbt val(&v, sizeof v);
|
||||
int r = db->put(0, &key, &val, DB_YESOVERWRITE); assert(r == 0);
|
||||
}
|
||||
}
|
||||
|
||||
void test_cursor_count_flags(Db *db) {
|
||||
int r;
|
||||
Dbc *cursor;
|
||||
|
||||
r = db->cursor(0, &cursor, 0); assert(r == 0);
|
||||
Dbt key; key.set_flags(DB_DBT_MALLOC);
|
||||
Dbt val; val.set_flags(DB_DBT_MALLOC);
|
||||
r = cursor->get(&key, &val, DB_FIRST); assert(r == 0);
|
||||
if (key.get_data()) free(key.get_data());
|
||||
if (val.get_data()) free(val.get_data());
|
||||
db_recno_t n;
|
||||
r = cursor->count(&n, 1); assert(r == EINVAL);
|
||||
r = cursor->count(&n, 0); assert(r == 0);
|
||||
if (verbose) printf("n=%d\n", n);
|
||||
r = cursor->close(); assert(r == 0);
|
||||
}
|
||||
|
||||
void walk(Db *db, int n) {
|
||||
if (verbose) printf("walk\n");
|
||||
Dbc *cursor;
|
||||
@@ -107,9 +181,11 @@ void walk(Db *db, int n) {
|
||||
db_recno_t count;
|
||||
r = cursor->count(&count, 0); assert(r == 0);
|
||||
if (verbose) printf("%d %d %d\n", k, v, count);
|
||||
#if 0
|
||||
db_recno_t mycount;
|
||||
r = my_cursor_count(cursor, &mycount, db); assert(r == 0);
|
||||
assert(mycount == count);
|
||||
#endif
|
||||
if (k == n/2) assert((int)count == n); else assert(count == 1);
|
||||
}
|
||||
assert(i == 2*n-1);
|
||||
@@ -155,46 +231,6 @@ void test_zero_count(Db *db, int n) {
|
||||
r = cursor->close(); assert(r == 0);
|
||||
}
|
||||
|
||||
int my_next_nodup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
for (;;) {
|
||||
r = cursor->get(&nkey, &nval, DB_NEXT);
|
||||
if (r != 0) break;
|
||||
if (!keyeq(¤tkey, &nkey)) break;
|
||||
}
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
}
|
||||
|
||||
int my_prev_nodup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
for (;;) {
|
||||
r = cursor->get(&nkey, &nval, DB_PREV);
|
||||
if (r != 0) break;
|
||||
if (!keyeq(¤tkey, &nkey)) break;
|
||||
}
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
}
|
||||
|
||||
void test_next_nodup(Db *db, int n) {
|
||||
if (verbose) printf("test_next_nodup\n");
|
||||
int r;
|
||||
@@ -209,9 +245,10 @@ void test_next_nodup(Db *db, int n) {
|
||||
int v = *(int*)val.get_data();
|
||||
if (verbose) printf("%d %d\n", k, v);
|
||||
assert(k == i);
|
||||
if (k != n/2) assert(v == i); else assert(v == 0);
|
||||
if (k == n/2) assert(v == 0); else assert(v == i);
|
||||
i += 1;
|
||||
r = my_next_nodup(cursor, &key, &val);
|
||||
// r = my_next_nodup(cursor, &key, &val);
|
||||
r = cursor->get(&key, &val, DB_NEXT_NODUP);
|
||||
}
|
||||
assert(i == n);
|
||||
if (key.get_data()) free(key.get_data());
|
||||
@@ -219,38 +256,29 @@ void test_next_nodup(Db *db, int n) {
|
||||
r = cursor->close(); assert(r == 0);
|
||||
}
|
||||
|
||||
int my_next_dup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
void test_prev_nodup(Db *db, int n) {
|
||||
if (verbose) printf("test_prev_nodup\n");
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(&nkey, &nval, DB_NEXT);
|
||||
if (r == 0 && !keyeq(¤tkey, &nkey)) r = DB_NOTFOUND;
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
}
|
||||
|
||||
int my_prev_dup(Dbc *cursor, Dbt *key, Dbt *val) {
|
||||
int r;
|
||||
Dbt currentkey; currentkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt currentval; currentval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(¤tkey, ¤tval, DB_CURRENT); assert(r == 0);
|
||||
Dbt nkey; nkey.set_flags(DB_DBT_REALLOC);
|
||||
Dbt nval; nval.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(&nkey, &nval, DB_PREV);
|
||||
if (r == 0 && !keyeq(¤tkey, &nkey)) r = DB_NOTFOUND;
|
||||
if (nkey.get_data()) free(nkey.get_data());
|
||||
if (nval.get_data()) free(nval.get_data());
|
||||
if (currentkey.get_data()) free(currentkey.get_data());
|
||||
if (currentval.get_data()) free(currentval.get_data());
|
||||
if (r == 0) r = cursor->get(key, val, DB_CURRENT);
|
||||
return r;
|
||||
Dbc *cursor;
|
||||
r = db->cursor(0, &cursor, 0); assert(r == 0);
|
||||
Dbt key; key.set_flags(DB_DBT_REALLOC);
|
||||
Dbt val; val.set_flags(DB_DBT_REALLOC);
|
||||
r = cursor->get(&key, &val, DB_LAST); assert(r == 0);
|
||||
int i = n-1;
|
||||
while (r == 0) {
|
||||
int k = htonl(*(int*)key.get_data());
|
||||
int v = *(int*)val.get_data();
|
||||
if (verbose) printf("%d %d\n", k, v);
|
||||
assert(k == i);
|
||||
if (k == n/2) assert(v == n-1); else assert(v == i);
|
||||
i -= 1;
|
||||
// r = my_next_nodup(cursor, &key, &val);
|
||||
r = cursor->get(&key, &val, DB_PREV_NODUP);
|
||||
}
|
||||
assert(i == -1);
|
||||
if (key.get_data()) free(key.get_data());
|
||||
if (val.get_data()) free(val.get_data());
|
||||
r = cursor->close(); assert(r == 0);
|
||||
}
|
||||
|
||||
void test_next_dup(Db *db, int n) {
|
||||
@@ -271,8 +299,24 @@ void test_next_dup(Db *db, int n) {
|
||||
if (verbose) printf("%d %d\n", k, v);
|
||||
assert(k == n/2); assert(v == i);
|
||||
i += 1;
|
||||
r = my_next_dup(cursor, &key, &val);
|
||||
// r = my_next_dup(cursor, &key, &val);
|
||||
r = cursor->get(&key, &val, DB_NEXT_DUP);
|
||||
}
|
||||
assert(i == n);
|
||||
#ifdef DB_PREV_DUP
|
||||
i = n - 1;
|
||||
for (;;) {
|
||||
r = cursor->get(&key, &val, DB_CURRENT);
|
||||
assert(r == 0);
|
||||
int k = htonl(*(int*)key.get_data());
|
||||
int v = *(int*)val.get_data();
|
||||
assert(k == n/2); assert(v == i);
|
||||
r = cursor->get(&key, &val, DB_PREV_DUP);
|
||||
if (r != 0) break;
|
||||
i -= 1;
|
||||
}
|
||||
assert(i == 0);
|
||||
#endif
|
||||
if (key.get_data()) free(key.get_data());
|
||||
if (val.get_data()) free(val.get_data());
|
||||
r = cursor->close(); assert(r == 0);
|
||||
@@ -293,9 +337,10 @@ int main(int argc, char *argv[]) {
|
||||
r = db.open(0, "test.db", 0, DB_BTREE, DB_CREATE, 0777); assert(r == 0);
|
||||
|
||||
load(&db, 10);
|
||||
test_cursor_flags(&db);
|
||||
test_cursor_count_flags(&db);
|
||||
walk(&db, 10);
|
||||
test_next_nodup(&db, 10);
|
||||
test_prev_nodup(&db, 10);
|
||||
test_next_dup(&db, 10);
|
||||
test_zero_count(&db, 10);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user