summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
2bba2a8)
Switch on the TDB_VERSION1 flag; we now only do a tdb1_traverse_read on a
read-only database, as there is no tdb2 equivalent.
int tdb1_transaction_recover(struct tdb_context *tdb);
int tdb1_transaction_cancel(struct tdb_context *tdb);
int tdb1_transaction_recover(struct tdb_context *tdb);
int tdb1_transaction_cancel(struct tdb_context *tdb);
+/* tdb1_traverse.c: */
+int tdb1_traverse(struct tdb_context *tdb,
+ int (*)(struct tdb_context *, TDB_DATA, TDB_DATA, void *),
+ void *private_data);
+
/* 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,
/* 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,
-typedef int (*tdb1_traverse_func)(struct tdb_context *, TDB_DATA, TDB_DATA, void *);
-
void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead);
int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key,
void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead);
int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key,
TDB_DATA tdb1_nextkey(struct tdb_context *tdb, TDB_DATA key);
TDB_DATA tdb1_nextkey(struct tdb_context *tdb, TDB_DATA key);
-int tdb1_traverse(struct tdb_context *tdb, tdb1_traverse_func fn, void *private_data);
-
-int tdb1_traverse_read(struct tdb_context *tdb, tdb1_traverse_func fn, void *private_data);
-
int tdb1_lockall(struct tdb_context *tdb);
int tdb1_unlockall(struct tdb_context *tdb);
int tdb1_lockall(struct tdb_context *tdb);
int tdb1_unlockall(struct tdb_context *tdb);
state.error = TDB_SUCCESS;
state.dest_db = tmp_db;
state.error = TDB_SUCCESS;
state.dest_db = tmp_db;
- if (tdb1_traverse_read(tdb, repack_traverse, &state) == -1) {
+ if (tdb1_traverse(tdb, repack_traverse, &state) == -1) {
tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
__location__ " Failed to traverse copying out");
tdb1_transaction_cancel(tdb);
tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
__location__ " Failed to traverse copying out");
tdb1_transaction_cancel(tdb);
state.error = TDB_SUCCESS;
state.dest_db = tdb;
state.error = TDB_SUCCESS;
state.dest_db = tdb;
- if (tdb1_traverse_read(tmp_db, repack_traverse, &state) == -1) {
+ if (tdb1_traverse(tmp_db, repack_traverse, &state) == -1) {
tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
__location__ " Failed to traverse copying back");
tdb1_transaction_cancel(tdb);
tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
__location__ " Failed to traverse copying back");
tdb1_transaction_cancel(tdb);
a non-zero return value from fn() indicates that the traversal should stop
*/
static int tdb1_traverse_internal(struct tdb_context *tdb,
a non-zero return value from fn() indicates that the traversal should stop
*/
static int tdb1_traverse_internal(struct tdb_context *tdb,
- tdb1_traverse_func fn, void *private_data,
- struct tdb1_traverse_lock *tl)
+ int (*fn)(struct tdb_context *,
+ TDB_DATA, TDB_DATA, void *),
+ void *private_data,
+ struct tdb1_traverse_lock *tl)
{
TDB_DATA key, dbuf;
struct tdb1_record rec;
{
TDB_DATA key, dbuf;
struct tdb1_record rec;
- a write style traverse - temporarily marks the db read only
+ a read style traverse - only if db read only
-int tdb1_traverse_read(struct tdb_context *tdb,
- tdb1_traverse_func fn, void *private_data)
+static int tdb1_traverse_read(struct tdb_context *tdb,
+ int (*fn)(struct tdb_context *,
+ TDB_DATA, TDB_DATA, void *),
+ void *private_data)
{
struct tdb1_traverse_lock tl = { NULL, 0, 0, F_RDLCK };
int ret;
{
struct tdb1_traverse_lock tl = { NULL, 0, 0, F_RDLCK };
int ret;
alignment restrictions malloc gives you.
*/
int tdb1_traverse(struct tdb_context *tdb,
alignment restrictions malloc gives you.
*/
int tdb1_traverse(struct tdb_context *tdb,
- tdb1_traverse_func fn, void *private_data)
+ int (*fn)(struct tdb_context *, TDB_DATA, TDB_DATA, void *),
+ void *private_data)
{
struct tdb1_traverse_lock tl = { NULL, 0, 0, F_WRLCK };
int ret;
{
struct tdb1_traverse_lock tl = { NULL, 0, 0, F_WRLCK };
int ret;
- if ((tdb->flags & TDB_RDONLY) || tdb->tdb1.traverse_read) {
+ /* If we're read-only, we don't have to write-lock whole db. */
+ if (tdb->flags & TDB_RDONLY) {
return tdb1_traverse_read(tdb, fn, private_data);
}
return tdb1_traverse_read(tdb, fn, private_data);
}
tdb1_unlock(tdb, TDB1_BUCKET(rec.full_hash), F_RDLCK);
/* Traverse must work. */
tdb1_unlock(tdb, TDB1_BUCKET(rec.full_hash), F_RDLCK);
/* Traverse must work. */
- ok1(tdb1_traverse(tdb, test_traverse, &orig_data) == 1);
+ ok1(tdb_traverse(tdb, test_traverse, &orig_data) == 1);
/* Delete should work. */
ok1(tdb_delete(tdb, key) == TDB_SUCCESS);
/* Delete should work. */
ok1(tdb_delete(tdb, key) == TDB_SUCCESS);
- ok1(tdb1_traverse(tdb, test_traverse, NULL) == 0);
+ ok1(tdb_traverse(tdb, test_traverse, NULL) == 0);
/* Transactions should work. */
ok1(tdb1_transaction_start(tdb) == 0);
/* Transactions should work. */
ok1(tdb1_transaction_start(tdb) == 0);
free(data.dptr);
ok1(tdb1_transaction_commit(tdb) == 0);
free(data.dptr);
ok1(tdb1_transaction_commit(tdb) == 0);
- ok1(tdb1_traverse(tdb, test_traverse, &orig_data) == 1);
+ ok1(tdb_traverse(tdb, test_traverse, &orig_data) == 1);
tdb_close(tdb);
return exit_status();
tdb_close(tdb);
return exit_status();
ok1(correct_data(data));
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
== WOULD_HAVE_BLOCKED);
ok1(correct_data(data));
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
== WOULD_HAVE_BLOCKED);
- tdb1_traverse(tdb, traverse2, NULL);
+ tdb_traverse(tdb, traverse2, NULL);
/* That should *not* release the transaction lock! */
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
/* That should *not* release the transaction lock! */
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
data.dsize = strlen("world");
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_SUCCESS);
data.dsize = strlen("world");
ok1(tdb_store(tdb, key, data, TDB_INSERT) == TDB_SUCCESS);
- tdb1_traverse(tdb, traverse1, NULL);
- tdb1_traverse_read(tdb, traverse1, NULL);
+ tdb_traverse(tdb, traverse1, NULL);
+ tdb_add_flag(tdb, TDB_RDONLY);
+ tdb_traverse(tdb, traverse1, NULL);
+ tdb_remove_flag(tdb, TDB_RDONLY);
tdb_close(tdb);
return exit_status();
tdb_close(tdb);
return exit_status();
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-no-lock-during-traverse.tdb1",
TDB_VERSION1, O_CREAT|O_TRUNC|O_RDWR,
0600, &hsize);
tdb = tdb_open("run-no-lock-during-traverse.tdb1",
TDB_VERSION1, O_CREAT|O_TRUNC|O_RDWR,
0600, &hsize);
ok1(locking_errors1 == 0);
ok1(tdb1_lockall(tdb) == 0);
ok1(locking_errors1 == 0);
ok1(locking_errors1 == 0);
ok1(tdb1_lockall(tdb) == 0);
ok1(locking_errors1 == 0);
- tdb1_traverse(tdb, delete_other, &errors);
+ ok1(tdb_traverse(tdb, delete_other, &errors) >= 0);
ok1(errors == 0);
ok1(locking_errors1 == 0);
ok1(tdb1_unlockall(tdb) == 0);
ok1(errors == 0);
ok1(locking_errors1 == 0);
ok1(tdb1_unlockall(tdb) == 0);
ok1(locking_errors1 == 0);
ok1(tdb1_lockall(tdb) == 0);
ok1(locking_errors1 == 0);
ok1(locking_errors1 == 0);
ok1(tdb1_lockall(tdb) == 0);
ok1(locking_errors1 == 0);
- tdb1_traverse(tdb, delete_self, NULL);
+ ok1(tdb_traverse(tdb, delete_self, NULL) == NUM_ENTRIES);
ok1(locking_errors1 == 0);
ok1(tdb1_unlockall(tdb) == 0);
ok1(locking_errors1 == 0);
ok1(tdb1_unlockall(tdb) == 0);
ok1(tdb1_transaction_start(tdb) == 0);
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
== WOULD_HAVE_BLOCKED);
ok1(tdb1_transaction_start(tdb) == 0);
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
== WOULD_HAVE_BLOCKED);
- tdb1_traverse(tdb, traverse, NULL);
+ tdb_traverse(tdb, traverse, NULL);
/* That should *not* release the transaction lock! */
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
== WOULD_HAVE_BLOCKED);
/* That should *not* release the transaction lock! */
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
== WOULD_HAVE_BLOCKED);
- tdb1_traverse_read(tdb, traverse, NULL);
+ tdb_traverse(tdb, traverse, NULL);
/* That should *not* release the transaction lock! */
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
/* That should *not* release the transaction lock! */
ok1(external_agent_operation1(agent, TRANSACTION_START, tdb->name)
struct tdb_data k, d;
int64_t count = 0;
struct tdb_data k, d;
int64_t count = 0;
+ if (tdb->flags & TDB_VERSION1) {
+ count = tdb1_traverse(tdb, fn, p);
+ if (count == -1)
+ return tdb->last_error;
+ return count;
+ }
+
k.dptr = NULL;
for (ecode = first_in_hash(tdb, &tinfo, &k, &d.dsize);
ecode == TDB_SUCCESS;
k.dptr = NULL;
for (ecode = first_in_hash(tdb, &tinfo, &k, &d.dsize);
ecode == TDB_SUCCESS;