Switch on the TDB_VERSION1 flag.
/* tdb1_tdb.c: */
int tdb1_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
/* tdb1_tdb.c: */
int tdb1_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
+enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key,
+ TDB_DATA *data);
/* tdb.c: */
enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
/* tdb.c: */
enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
struct hash_info h;
enum TDB_ERROR ecode;
struct hash_info h;
enum TDB_ERROR ecode;
+ if (tdb->flags & TDB_VERSION1)
+ return tdb1_fetch(tdb, key, data);
+
off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL);
if (TDB_OFF_IS_ERR(off)) {
return tdb->last_error = off;
off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL);
if (TDB_OFF_IS_ERR(off)) {
return tdb->last_error = off;
void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead);
void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead);
-TDB_DATA tdb1_fetch(struct tdb_context *tdb, TDB_DATA key);
-
int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key,
int (*parser)(TDB_DATA key, TDB_DATA data,
void *private_data),
int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key,
int (*parser)(TDB_DATA key, TDB_DATA data,
void *private_data),
-TDB_DATA tdb1_fetch(struct tdb_context *tdb, TDB_DATA key)
+enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, TDB_DATA *data)
- TDB_DATA ret = _tdb1_fetch(tdb, key);
-
- return ret;
+ *data = _tdb1_fetch(tdb, key);
+ if (data->dptr == NULL)
+ return tdb->last_error;
+ return TDB_SUCCESS;
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
tdb = tdb_open("run-36-file.tdb1", TDB_VERSION1,
O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
tdb = tdb_open("run-36-file.tdb1", TDB_VERSION1,
O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
ok1(tdb_store(tdb, key, orig_data, TDB_INSERT) == TDB_SUCCESS);
ok1(tdb_store(tdb, key, orig_data, TDB_INSERT) == TDB_SUCCESS);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(tdb1_transaction_start(tdb) == 0);
ok1(tdb_store(tdb, key, orig_data, TDB_INSERT) == TDB_SUCCESS);
ok1(tdb1_transaction_start(tdb) == 0);
ok1(tdb_store(tdb, key, orig_data, TDB_INSERT) == TDB_SUCCESS);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
tdb = tdb_open("run-endian.tdb1",
TDB_VERSION1|TDB_CONVERT,
O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
tdb = tdb_open("run-endian.tdb1",
TDB_VERSION1|TDB_CONVERT,
O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_ERR_EXISTS);
ok1(tdb_store(tdb, key, data, TDB_MODIFY) == TDB_SUCCESS);
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_ERR_EXISTS);
ok1(tdb_store(tdb, key, data, TDB_MODIFY) == TDB_SUCCESS);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
key.dsize++;
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
key.dsize++;
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_ERR_NOEXIST);
ok1(data.dptr == NULL);
tdb_close(tdb);
ok1(data.dptr == NULL);
tdb_close(tdb);
key.dsize = strlen("hi");
key.dptr = (void *)"hi";
key.dsize = strlen("hi");
key.dptr = (void *)"hi";
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
dumbhash_attr.base.next = &log_attr;
dumbhash_attr.hash.fn = tdb1_dumb_hash;
dumbhash_attr.base.next = &log_attr;
dumbhash_attr.hash.fn = tdb1_dumb_hash;
for (flags = 0; flags <= TDB_CONVERT; flags += TDB_CONVERT) {
unsigned int rwmagic = TDB1_HASH_RWLOCK_MAGIC;
for (flags = 0; flags <= TDB_CONVERT; flags += TDB_CONVERT) {
unsigned int rwmagic = TDB1_HASH_RWLOCK_MAGIC;
O_RDWR, 0600, &incompat_hash_attr);
ok1(tdb);
ok1(log_count == 0);
O_RDWR, 0600, &incompat_hash_attr);
ok1(tdb);
ok1(log_count == 0);
- d = tdb1_fetch(tdb, d);
+ ok1(tdb_fetch(tdb, d, &d) == TDB_SUCCESS);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
O_RDWR, 0600, &jhash_attr);
ok1(tdb);
ok1(log_count == 0);
O_RDWR, 0600, &jhash_attr);
ok1(tdb);
ok1(log_count == 0);
- d = tdb1_fetch(tdb, d);
+ ok1(tdb1_fetch(tdb, d, &d) == TDB_SUCCESS);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
ok1(log_count == 0);
d.dptr = (void *)"Hello";
d.dsize = 5;
ok1(log_count == 0);
d.dptr = (void *)"Hello";
d.dsize = 5;
- d = tdb1_fetch(tdb, d);
+ ok1(tdb_fetch(tdb, d, &d) == TDB_SUCCESS);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
&dumbhash_attr);
ok1(tdb);
ok1(log_count == 0);
&dumbhash_attr);
ok1(tdb);
ok1(log_count == 0);
- d = tdb1_fetch(tdb, d);
+ ok1(tdb1_fetch(tdb, d, &d) == TDB_SUCCESS);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
ok1(d.dsize == 5);
free(d.dptr);
ok1(tdb1_check(tdb, NULL, NULL) == 0);
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
key.dsize = strlen("hi");
key.dptr = (void *)"hi";
key.dsize = strlen("hi");
key.dptr = (void *)"hi";
data.dptr = (void *)"world";
data.dsize = strlen("world");
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_SUCCESS);
data.dptr = (void *)"world";
data.dsize = strlen("world");
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_SUCCESS);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(tdb1_transaction_start(tdb) != 0);
ok1(tdb_error(tdb) == TDB_ERR_EINVAL);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(tdb1_transaction_start(tdb) != 0);
ok1(tdb_error(tdb) == TDB_ERR_EINVAL);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(tdb1_transaction_commit(tdb) == 0);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(tdb1_transaction_commit(tdb) == 0);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
tdb = tdb_open(NULL, TDB_INTERNAL|TDB_VERSION1, O_CREAT|O_TRUNC|O_RDWR,
0600, &hsize);
ok1(tdb);
tdb = tdb_open(NULL, TDB_INTERNAL|TDB_VERSION1, O_CREAT|O_TRUNC|O_RDWR,
0600, &hsize);
ok1(tdb);
ok1(tdb1_append(tdb, key, data) == 0);
ok1(tdb1_append(tdb, key, data) == 0);
ok1(tdb1_append(tdb, key, data) == 0);
ok1(tdb1_append(tdb, key, data) == 0);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == 0);
free(data.dptr);
tdb_close(tdb);
ok1(data.dsize == 0);
free(data.dptr);
tdb_close(tdb);
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
hsize.base.next = &tap_log_attr;
hsize.tdb1_hashsize.hsize = 1024;
tdb = tdb_open("run.tdb1", TDB_VERSION1,
O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
tdb = tdb_open("run.tdb1", TDB_VERSION1,
O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize);
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_ERR_EXISTS);
ok1(tdb_store(tdb, key, data, TDB_MODIFY) == TDB_SUCCESS);
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_ERR_EXISTS);
ok1(tdb_store(tdb, key, data, TDB_MODIFY) == TDB_SUCCESS);
- data = tdb1_fetch(tdb, key);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_SUCCESS);
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
key.dsize++;
ok1(data.dsize == strlen("world"));
ok1(memcmp(data.dptr, "world", strlen("world")) == 0);
free(data.dptr);
key.dsize++;
- data = tdb1_fetch(tdb, key);
- ok1(data.dptr == NULL);
+ ok1(tdb_fetch(tdb, key, &data) == TDB_ERR_NOEXIST);
tdb_close(tdb);
return exit_status();
tdb_close(tdb);
return exit_status();
ret = tdb1_transaction_start(tdb) == 0 ? SUCCESS : OTHER_FAILURE;
break;
case FETCH:
ret = tdb1_transaction_start(tdb) == 0 ? SUCCESS : OTHER_FAILURE;
break;
case FETCH:
- data = tdb1_fetch(tdb, k);
- if (data.dptr == NULL) {
+ if (tdb_fetch(tdb, k, &data) != TDB_SUCCESS) {
if (tdb->last_error == TDB_ERR_NOEXIST)
ret = FAILED;
else
if (tdb->last_error == TDB_ERR_NOEXIST)
ret = FAILED;
else