Commit 3352e4e9 authored by Rusty Russell's avatar Rusty Russell

tdb2: unify tdb1_parse_record into tdb_parse_record

Switch on the TDB_VERSION1 flag.
parent ceb2f3ea
...@@ -665,6 +665,11 @@ enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, ...@@ -665,6 +665,11 @@ enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key,
int tdb1_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf); int tdb1_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf);
int tdb1_delete(struct tdb_context *tdb, TDB_DATA key); int tdb1_delete(struct tdb_context *tdb, TDB_DATA key);
int tdb1_exists(struct tdb_context *tdb, TDB_DATA key); int tdb1_exists(struct tdb_context *tdb, TDB_DATA key);
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);
/* tdb.c: */ /* tdb.c: */
enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
......
...@@ -526,6 +526,11 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb, ...@@ -526,6 +526,11 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb,
struct hash_info h; struct hash_info h;
enum TDB_ERROR ecode; enum TDB_ERROR ecode;
if (tdb->flags & TDB_VERSION1) {
return tdb->last_error = tdb1_parse_record(tdb, key, parse,
data);
}
off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL); off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL);
if (TDB_OFF_IS_ERR(off)) { if (TDB_OFF_IS_ERR(off)) {
return tdb->last_error = off; return tdb->last_error = off;
......
...@@ -38,11 +38,6 @@ ...@@ -38,11 +38,6 @@
void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead); void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead);
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);
TDB_DATA tdb1_firstkey(struct tdb_context *tdb); TDB_DATA tdb1_firstkey(struct tdb_context *tdb);
TDB_DATA tdb1_nextkey(struct tdb_context *tdb, TDB_DATA key); TDB_DATA tdb1_nextkey(struct tdb_context *tdb, TDB_DATA key);
......
...@@ -435,15 +435,15 @@ unsigned char *tdb1_alloc_read(struct tdb_context *tdb, tdb1_off_t offset, tdb1_ ...@@ -435,15 +435,15 @@ unsigned char *tdb1_alloc_read(struct tdb_context *tdb, tdb1_off_t offset, tdb1_
} }
/* Give a piece of tdb data to a parser */ /* Give a piece of tdb data to a parser */
enum TDB_ERROR tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key,
int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, tdb1_off_t offset, tdb1_len_t len,
tdb1_off_t offset, tdb1_len_t len, enum TDB_ERROR (*parser)(TDB_DATA key,
int (*parser)(TDB_DATA key, TDB_DATA data, TDB_DATA data,
void *private_data), void *private_data),
void *private_data) void *private_data)
{ {
TDB_DATA data; TDB_DATA data;
int result; enum TDB_ERROR result;
data.dsize = len; data.dsize = len;
...@@ -453,14 +453,14 @@ int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, ...@@ -453,14 +453,14 @@ int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key,
* parser directly at the mmap area. * parser directly at the mmap area.
*/ */
if (tdb->tdb1.io->tdb1_oob(tdb, offset+len, 0) != 0) { if (tdb->tdb1.io->tdb1_oob(tdb, offset+len, 0) != 0) {
return -1; return tdb->last_error;
} }
data.dptr = offset + (unsigned char *)tdb->file->map_ptr; data.dptr = offset + (unsigned char *)tdb->file->map_ptr;
return parser(key, data, private_data); return parser(key, data, private_data);
} }
if (!(data.dptr = tdb1_alloc_read(tdb, offset, len))) { if (!(data.dptr = tdb1_alloc_read(tdb, offset, len))) {
return -1; return tdb->last_error;
} }
result = parser(key, data, private_data); result = parser(key, data, private_data);
......
...@@ -159,11 +159,12 @@ int tdb1_rec_read(struct tdb_context *tdb, tdb1_off_t offset, struct tdb1_record ...@@ -159,11 +159,12 @@ int tdb1_rec_read(struct tdb_context *tdb, tdb1_off_t offset, struct tdb1_record
int tdb1_rec_write(struct tdb_context *tdb, tdb1_off_t offset, struct tdb1_record *rec); int tdb1_rec_write(struct tdb_context *tdb, tdb1_off_t offset, struct tdb1_record *rec);
int tdb1_do_delete(struct tdb_context *tdb, tdb1_off_t rec_ptr, struct tdb1_record *rec); int tdb1_do_delete(struct tdb_context *tdb, tdb1_off_t rec_ptr, struct tdb1_record *rec);
unsigned char *tdb1_alloc_read(struct tdb_context *tdb, tdb1_off_t offset, tdb1_len_t len); unsigned char *tdb1_alloc_read(struct tdb_context *tdb, tdb1_off_t offset, tdb1_len_t len);
int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, enum TDB_ERROR tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key,
tdb1_off_t offset, tdb1_len_t len, tdb1_off_t offset, tdb1_len_t len,
int (*parser)(TDB_DATA key, TDB_DATA data, enum TDB_ERROR (*parser)(TDB_DATA key,
void *private_data), TDB_DATA data,
void *private_data); void *private_data),
void *private_data);
tdb1_off_t tdb1_find_lock_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t hash, int locktype, tdb1_off_t tdb1_find_lock_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t hash, int locktype,
struct tdb1_record *rec); struct tdb1_record *rec);
void tdb1_io_init(struct tdb_context *tdb); void tdb1_io_init(struct tdb_context *tdb);
......
...@@ -209,32 +209,15 @@ enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, TDB_DATA *data) ...@@ -209,32 +209,15 @@ enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, TDB_DATA *data)
return TDB_SUCCESS; return TDB_SUCCESS;
} }
/* enum TDB_ERROR tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key,
* Find an entry in the database and hand the record's data to a parsing enum TDB_ERROR (*parser)(TDB_DATA key,
* function. The parsing function is executed under the chain read lock, so it TDB_DATA data,
* should be fast and should not block on other syscalls. void *private_data),
* void *private_data)
* 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)
{ {
tdb1_off_t rec_ptr; tdb1_off_t rec_ptr;
struct tdb1_record rec; struct tdb1_record rec;
int ret; enum TDB_ERROR ret;
uint32_t hash; uint32_t hash;
/* find which hash bucket it is in */ /* find which hash bucket it is in */
...@@ -242,8 +225,7 @@ int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, ...@@ -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))) { if (!(rec_ptr = tdb1_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) {
/* record not found */ /* record not found */
tdb->last_error = TDB_ERR_NOEXIST; return TDB_ERR_NOEXIST;
return -1;
} }
ret = tdb1_parse_data(tdb, key, rec_ptr + sizeof(rec) + rec.key_len, ret = tdb1_parse_data(tdb, key, rec_ptr + sizeof(rec) + rec.key_len,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment