X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftest%2Frun-firstkey-nextkey.c;h=1eb265ef926b4e87834c733c9bff8ddde77fd1ac;hp=db52c85281b4da599789ceffd3fd10166b2643d2;hb=d9cbd7d4454ae35e4e2f6d18a9469bf26948e4b9;hpb=d70577b6aff24ccf6815896509dabb8c9ac07904 diff --git a/ccan/tdb2/test/run-firstkey-nextkey.c b/ccan/tdb2/test/run-firstkey-nextkey.c index db52c852..1eb265ef 100644 --- a/ccan/tdb2/test/run-firstkey-nextkey.c +++ b/ccan/tdb2/test/run-firstkey-nextkey.c @@ -1,10 +1,4 @@ -#include -#include -#include -#include -#include -#include -#include +#include "tdb2-source.h" #include #include "logging.h" @@ -37,65 +31,74 @@ static int trav(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, void *p) return 0; } +/* Since tdb_nextkey frees dptr, we need to clone it. */ +static TDB_DATA dup_key(TDB_DATA key) +{ + void *p = malloc(key.dsize); + memcpy(p, key.dptr, key.dsize); + key.dptr = p; + return key; +} + int main(int argc, char *argv[]) { unsigned int i, j; int num; struct trav_data td; - TDB_DATA k, k2; + TDB_DATA k; struct tdb_context *tdb; union tdb_attribute seed_attr; - + enum TDB_ERROR ecode; int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, - TDB_NOMMAP|TDB_CONVERT }; + TDB_NOMMAP|TDB_CONVERT, + TDB_INTERNAL|TDB_VERSION1, TDB_VERSION1, + TDB_NOMMAP|TDB_VERSION1, + TDB_INTERNAL|TDB_CONVERT|TDB_VERSION1, + TDB_CONVERT|TDB_VERSION1, + TDB_NOMMAP|TDB_CONVERT|TDB_VERSION1 }; seed_attr.base.attr = TDB_ATTRIBUTE_SEED; seed_attr.base.next = &tap_log_attr; seed_attr.seed.seed = 6334326220117065685ULL; plan_tests(sizeof(flags) / sizeof(flags[0]) - * (NUM_RECORDS*4 + (NUM_RECORDS-1)*2 + 20) + 1); + * (NUM_RECORDS*6 + (NUM_RECORDS-1)*3 + 22) + 1); for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) { tdb = tdb_open("run-traverse.tdb", flags[i], - O_RDWR|O_CREAT|O_TRUNC, 0600, &seed_attr); + O_RDWR|O_CREAT|O_TRUNC, 0600, + flags[i] & TDB_VERSION1 ? NULL : &seed_attr); ok1(tdb); if (!tdb) continue; - ok1(tdb_firstkey(tdb).dptr == NULL); - ok1(tdb_error(tdb) == TDB_SUCCESS); + ok1(tdb_firstkey(tdb, &k) == TDB_ERR_NOEXIST); /* One entry... */ k.dptr = (unsigned char *)# k.dsize = sizeof(num); num = 0; ok1(tdb_store(tdb, k, k, TDB_INSERT) == 0); - k = tdb_firstkey(tdb); + ok1(tdb_firstkey(tdb, &k) == TDB_SUCCESS); ok1(k.dsize == sizeof(num)); ok1(memcmp(k.dptr, &num, sizeof(num)) == 0); - k2 = tdb_nextkey(tdb, k); - ok1(k2.dsize == 0 && k2.dptr == NULL); - free(k.dptr); + ok1(tdb_nextkey(tdb, &k) == TDB_ERR_NOEXIST); /* Two entries. */ k.dptr = (unsigned char *)# k.dsize = sizeof(num); num = 1; ok1(tdb_store(tdb, k, k, TDB_INSERT) == 0); - k = tdb_firstkey(tdb); + ok1(tdb_firstkey(tdb, &k) == TDB_SUCCESS); ok1(k.dsize == sizeof(num)); memcpy(&num, k.dptr, sizeof(num)); ok1(num == 0 || num == 1); - k2 = tdb_nextkey(tdb, k); - ok1(k2.dsize == sizeof(j)); - free(k.dptr); - memcpy(&j, k2.dptr, sizeof(j)); + ok1(tdb_nextkey(tdb, &k) == TDB_SUCCESS); + ok1(k.dsize == sizeof(j)); + memcpy(&j, k.dptr, sizeof(j)); ok1(j == 0 || j == 1); ok1(j != num); - k = tdb_nextkey(tdb, k2); - ok1(k.dsize == 0 && k.dptr == NULL); - free(k2.dptr); + ok1(tdb_nextkey(tdb, &k) == TDB_ERR_NOEXIST); /* Clean up. */ k.dptr = (unsigned char *)# @@ -109,39 +112,40 @@ int main(int argc, char *argv[]) ok1(store_records(tdb)); td.calls = 0; - num = tdb_traverse_read(tdb, trav, &td); + num = tdb_traverse(tdb, trav, &td); ok1(num == NUM_RECORDS); ok1(td.calls == NUM_RECORDS); - /* Simple loop should match tdb_traverse_read */ - for (j = 0, k = tdb_firstkey(tdb); j < td.calls; j++) { + /* Simple loop should match tdb_traverse */ + for (j = 0, ecode = tdb_firstkey(tdb, &k); j < td.calls; j++) { int val; + ok1(ecode == TDB_SUCCESS); ok1(k.dsize == sizeof(val)); memcpy(&val, k.dptr, k.dsize); ok1(td.records[j] == val); - k2 = tdb_nextkey(tdb, k); - free(k.dptr); - k = k2; + ecode = tdb_nextkey(tdb, &k); } - /* But arbitary orderings should work too. */ + /* But arbitrary orderings should work too. */ for (j = td.calls-1; j > 0; j--) { k.dptr = (unsigned char *)&td.records[j-1]; k.dsize = sizeof(td.records[j-1]); - k = tdb_nextkey(tdb, k); + k = dup_key(k); + ok1(tdb_nextkey(tdb, &k) == TDB_SUCCESS); ok1(k.dsize == sizeof(td.records[j])); ok1(memcmp(k.dptr, &td.records[j], k.dsize) == 0); free(k.dptr); } /* Even delete should work. */ - for (j = 0, k = tdb_firstkey(tdb); k.dptr; j++) { + for (j = 0, ecode = tdb_firstkey(tdb, &k); + ecode != TDB_ERR_NOEXIST; + j++) { + ok1(ecode == TDB_SUCCESS); ok1(k.dsize == 4); ok1(tdb_delete(tdb, k) == 0); - k2 = tdb_nextkey(tdb, k); - free(k.dptr); - k = k2; + ecode = tdb_nextkey(tdb, &k); } diag("delete using first/nextkey gave %u of %u records",