X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb1_tdb.c;h=a50303c33ce4e6333e823ceea2cceff6788e60f7;hp=16e945974eaf9e2bcbf6ed213c6e5096bfb18c49;hb=3352e4e947777d4a90a2dd4f3037e1e494231b25;hpb=acb26c9c3ee054c8b2141db25c9bd7be064e425c diff --git a/ccan/tdb2/tdb1_tdb.c b/ccan/tdb2/tdb1_tdb.c index 16e94597..a50303c3 100644 --- a/ccan/tdb2/tdb1_tdb.c +++ b/ccan/tdb2/tdb1_tdb.c @@ -209,32 +209,15 @@ enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, TDB_DATA *data) return TDB_SUCCESS; } -/* - * Find an entry in the database and hand the record's data to a parsing - * function. The parsing function is executed under the chain read lock, so it - * should be fast and should not block on other syscalls. - * - * DON'T CALL OTHER TDB CALLS FROM THE PARSER, THIS MIGHT LEAD TO SEGFAULTS. - * - * For mmapped tdb's that do not have a transaction open it points the parsing - * function directly at the mmap area, it avoids the malloc/memcpy in this - * case. If a transaction is open or no mmap is available, it has to do - * malloc/read/parse/free. - * - * This is interesting for all readers of potentially large data structures in - * the tdb records, ldb indexes being one example. - * - * Return -1 if the record was not found. - */ - -int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, - int (*parser)(TDB_DATA key, TDB_DATA data, - void *private_data), - void *private_data) +enum TDB_ERROR tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, + enum TDB_ERROR (*parser)(TDB_DATA key, + TDB_DATA data, + void *private_data), + void *private_data) { tdb1_off_t rec_ptr; struct tdb1_record rec; - int ret; + enum TDB_ERROR ret; uint32_t hash; /* find which hash bucket it is in */ @@ -242,8 +225,7 @@ int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, if (!(rec_ptr = tdb1_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) { /* record not found */ - tdb->last_error = TDB_ERR_NOEXIST; - return -1; + return TDB_ERR_NOEXIST; } ret = tdb1_parse_data(tdb, key, rec_ptr + sizeof(rec) + rec.key_len, @@ -275,6 +257,7 @@ int tdb1_exists(struct tdb_context *tdb, TDB_DATA key) uint32_t hash = tdb_hash(tdb, key.dptr, key.dsize); int ret; + assert(tdb->flags & TDB_VERSION1); ret = tdb1_exists_hash(tdb, key, hash); return ret; } @@ -731,7 +714,7 @@ int tdb1_wipe_all(struct tdb_context *tdb) tdb1_off_t recovery_head; tdb1_len_t recovery_size = 0; - if (tdb1_lockall(tdb) != 0) { + if (tdb_lockall(tdb) != TDB_SUCCESS) { return -1; } @@ -800,16 +783,11 @@ int tdb1_wipe_all(struct tdb_context *tdb) } } - if (tdb1_unlockall(tdb) != 0) { - tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR, - "tdb1_wipe_all: failed to unlock"); - goto failed; - } - + tdb_unlockall(tdb); return 0; failed: - tdb1_unlockall(tdb); + tdb_unlockall(tdb); return -1; } @@ -861,7 +839,7 @@ int tdb1_repack(struct tdb_context *tdb) 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); @@ -888,7 +866,7 @@ int tdb1_repack(struct tdb_context *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);