From 7bf853950d551e519fe25a344eb6a742fc5dd299 Mon Sep 17 00:00:00 2001 From: Garming Sam Date: Mon, 19 Feb 2018 12:37:20 +1300 Subject: [PATCH] ldb: Change remaining fetch prototypes to remove TDB_DATA Signed-off-by: Garming Sam Reviewed-by: Andrew Bartlett Reviewed-by: Gary Lockyer --- lib/ldb/ldb_tdb/ldb_search.c | 28 ++++++++++++++------------ lib/ldb/ldb_tdb/ldb_tdb.c | 38 +++++++++++++++++++++++++++++++++--- lib/ldb/ldb_tdb/ldb_tdb.h | 4 ++-- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/lib/ldb/ldb_tdb/ldb_search.c b/lib/ldb/ldb_tdb/ldb_search.c index 78ef8b0abb1..35583a1eaa3 100644 --- a/lib/ldb/ldb_tdb/ldb_search.c +++ b/lib/ldb/ldb_tdb/ldb_search.c @@ -180,17 +180,15 @@ struct ltdb_parse_data_unpack_ctx { unsigned int unpack_flags; }; -static int ltdb_parse_data_unpack(TDB_DATA key, TDB_DATA data, +static int ltdb_parse_data_unpack(struct ldb_val key, + struct ldb_val data, void *private_data) { struct ltdb_parse_data_unpack_ctx *ctx = private_data; unsigned int nb_elements_in_db; int ret; struct ldb_context *ldb = ldb_module_get_ctx(ctx->module); - struct ldb_val data_parse = { - .data = data.dptr, - .length = data.dsize - }; + struct ldb_val data_parse = data; if (ctx->unpack_flags & LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC) { /* @@ -200,13 +198,13 @@ static int ltdb_parse_data_unpack(TDB_DATA key, TDB_DATA data, * and the caller needs a stable result. */ data_parse.data = talloc_memdup(ctx->msg, - data.dptr, - data.dsize); + data.data, + data.length); if (data_parse.data == NULL) { ldb_debug(ldb, LDB_DEBUG_ERROR, "Unable to allocate data(%d) for %*.*s\n", - (int)data.dsize, - (int)key.dsize, (int)key.dsize, key.dptr); + (int)data.length, + (int)key.length, (int)key.length, key.data); return LDB_ERR_OPERATIONS_ERROR; } } @@ -217,13 +215,13 @@ static int ltdb_parse_data_unpack(TDB_DATA key, TDB_DATA data, ctx->unpack_flags, &nb_elements_in_db); if (ret == -1) { - if (data_parse.data != data.dptr) { + if (data_parse.data != data.data) { talloc_free(data_parse.data); } ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid data for index %*.*s\n", - (int)key.dsize, (int)key.dsize, key.dptr); - return LDB_ERR_OPERATIONS_ERROR; + (int)key.length, (int)key.length, key.data); + return LDB_ERR_OPERATIONS_ERROR; } return ret; } @@ -246,13 +244,17 @@ int ltdb_search_key(struct ldb_module *module, struct ltdb_private *ltdb, .module = module, .unpack_flags = unpack_flags }; + struct ldb_val ldb_key = { + .data = tdb_key.dptr, + .length = tdb_key.dsize + }; memset(msg, 0, sizeof(*msg)); msg->num_elements = 0; msg->elements = NULL; - ret = ltdb->kv_ops->fetch_and_parse(ltdb, tdb_key, + ret = ltdb->kv_ops->fetch_and_parse(ltdb, ldb_key, ltdb_parse_data_unpack, &ctx); if (ret == -1) { diff --git a/lib/ldb/ldb_tdb/ldb_tdb.c b/lib/ldb/ldb_tdb/ldb_tdb.c index f94a308cbf9..423b5a1f687 100644 --- a/lib/ldb/ldb_tdb/ldb_tdb.c +++ b/lib/ldb/ldb_tdb/ldb_tdb.c @@ -1765,6 +1765,9 @@ struct kv_ctx { ldb_kv_traverse_fn kv_traverse_fn; void *ctx; struct ltdb_private *ltdb; + int (*parser)(struct ldb_val key, + struct ldb_val data, + void *private_data); }; static int ldb_tdb_traverse_fn_wrapper(struct tdb_context *tdb, TDB_DATA tdb_key, TDB_DATA tdb_data, void *ctx) @@ -1847,12 +1850,41 @@ static int ltdb_tdb_update_in_iterate(struct ltdb_private *ltdb, return tdb_ret; } -static int ltdb_tdb_parse_record(struct ltdb_private *ltdb, TDB_DATA key, - int (*parser)(TDB_DATA key, TDB_DATA data, +static int ltdb_tdb_parse_record_wrapper(TDB_DATA tdb_key, TDB_DATA tdb_data, + void *ctx) +{ + struct kv_ctx *kv_ctx = ctx; + struct ldb_val key = { + .length = tdb_key.dsize, + .data = tdb_key.dptr, + }; + struct ldb_val data = { + .length = tdb_data.dsize, + .data = tdb_data.dptr, + }; + + return kv_ctx->parser(key, data, kv_ctx->ctx); +} + +static int ltdb_tdb_parse_record(struct ltdb_private *ltdb, + struct ldb_val ldb_key, + int (*parser)(struct ldb_val key, + struct ldb_val data, void *private_data), void *ctx) { - return tdb_parse_record(ltdb->tdb, key, parser, ctx); + struct kv_ctx kv_ctx = { + .parser = parser, + .ctx = ctx, + .ltdb = ltdb + }; + TDB_DATA key = { + .dptr = ldb_key.data, + .dsize = ldb_key.length + }; + + return tdb_parse_record(ltdb->tdb, key, ltdb_tdb_parse_record_wrapper, + &kv_ctx); } static const char * ltdb_tdb_name(struct ltdb_private *ltdb) diff --git a/lib/ldb/ldb_tdb/ldb_tdb.h b/lib/ldb/ldb_tdb/ldb_tdb.h index 2c0ea7cfe38..f14666ba88a 100644 --- a/lib/ldb/ldb_tdb/ldb_tdb.h +++ b/lib/ldb/ldb_tdb/ldb_tdb.h @@ -15,8 +15,8 @@ struct kv_db_ops { int (*iterate)(struct ltdb_private *ltdb, ldb_kv_traverse_fn fn, void *ctx); int (*update_in_iterate)(struct ltdb_private *ltdb, struct ldb_val key, struct ldb_val key2, struct ldb_val data, void *ctx); - int (*fetch_and_parse)(struct ltdb_private *ltdb, TDB_DATA key, - int (*parser)(TDB_DATA key, TDB_DATA data, + int (*fetch_and_parse)(struct ltdb_private *ltdb, struct ldb_val key, + int (*parser)(struct ldb_val key, struct ldb_val data, void *private_data), void *ctx); int (*lock_read)(struct ldb_module *); -- 2.34.1