mirror of
https://github.com/samba-team/samba.git
synced 2025-02-21 01:59:07 +03:00
tdb2: unify tdb1_parse_record into tdb_parse_record
Switch on the TDB_VERSION1 flag. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (Imported from CCAN commit 3352e4e947777d4a90a2dd4f3037e1e494231b25)
This commit is contained in:
parent
9140fca812
commit
014ca657e6
@ -677,6 +677,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_delete(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: */
|
||||
enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
|
||||
|
@ -528,6 +528,11 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb,
|
||||
struct hash_info h;
|
||||
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);
|
||||
if (TDB_OFF_IS_ERR(off)) {
|
||||
return tdb->last_error = off;
|
||||
|
@ -38,11 +38,6 @@
|
||||
|
||||
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_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_
|
||||
}
|
||||
|
||||
/* Give a piece of tdb data to a parser */
|
||||
|
||||
int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key,
|
||||
tdb1_off_t offset, tdb1_len_t len,
|
||||
int (*parser)(TDB_DATA key, TDB_DATA data,
|
||||
void *private_data),
|
||||
void *private_data)
|
||||
enum TDB_ERROR tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key,
|
||||
tdb1_off_t offset, tdb1_len_t len,
|
||||
enum TDB_ERROR (*parser)(TDB_DATA key,
|
||||
TDB_DATA data,
|
||||
void *private_data),
|
||||
void *private_data)
|
||||
{
|
||||
TDB_DATA data;
|
||||
int result;
|
||||
enum TDB_ERROR result;
|
||||
|
||||
data.dsize = len;
|
||||
|
||||
@ -453,14 +453,14 @@ int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key,
|
||||
* parser directly at the mmap area.
|
||||
*/
|
||||
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;
|
||||
return parser(key, data, private_data);
|
||||
}
|
||||
|
||||
if (!(data.dptr = tdb1_alloc_read(tdb, offset, len))) {
|
||||
return -1;
|
||||
return tdb->last_error;
|
||||
}
|
||||
|
||||
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
|
||||
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);
|
||||
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,
|
||||
tdb1_off_t offset, tdb1_len_t len,
|
||||
int (*parser)(TDB_DATA key, TDB_DATA data,
|
||||
void *private_data),
|
||||
void *private_data);
|
||||
enum TDB_ERROR tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key,
|
||||
tdb1_off_t offset, tdb1_len_t len,
|
||||
enum TDB_ERROR (*parser)(TDB_DATA key,
|
||||
TDB_DATA 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,
|
||||
struct tdb1_record *rec);
|
||||
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)
|
||||
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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user