diff options
author | Andrew Bartlett <abartlet@samba.org> | 2012-08-09 22:46:48 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2012-08-10 10:18:27 +1000 |
commit | 1d1bdc315b4619f0ca5b2a0db602cbe283f8dca8 (patch) | |
tree | 27ae54190fdb5767995f7431d5d08a3ac8082d46 | |
parent | a5495bc6b073d29041d9a8e229d37693d6a0c513 (diff) | |
download | samba-1d1bdc315b4619f0ca5b2a0db602cbe283f8dca8.tar.gz samba-1d1bdc315b4619f0ca5b2a0db602cbe283f8dca8.tar.bz2 samba-1d1bdc315b4619f0ca5b2a0db602cbe283f8dca8.zip |
lib/ldb: Use tdb_parse_record and a callback rather than tdb_fetch()
This avoid allocation at the tdb layer as we will allocate this
with talloc right away anyway.
Andrew Bartlett
-rw-r--r-- | lib/ldb/ldb_tdb/ldb_search.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/lib/ldb/ldb_tdb/ldb_search.c b/lib/ldb/ldb_tdb/ldb_search.c index e631f7baca..703ad6ad0e 100644 --- a/lib/ldb/ldb_tdb/ldb_search.c +++ b/lib/ldb/ldb_tdb/ldb_search.c @@ -234,6 +234,26 @@ static int ltdb_search_base(struct ldb_module *module, struct ldb_dn *dn) return LDB_ERR_NO_SUCH_OBJECT; } +struct ltdb_parse_data_unpack_ctx { + struct ldb_message *msg; + struct ldb_module *module; +}; + +static int ltdb_parse_data_unpack(TDB_DATA key, TDB_DATA data, + void *private_data) +{ + struct ltdb_parse_data_unpack_ctx *ctx = private_data; + + int ret = ltdb_unpack_data(ctx->module, &data, ctx->msg); + if (ret == -1) { + struct ldb_context *ldb = ldb_module_get_ctx(ctx->module); + 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; + } + return ret; +} + /* search the database for a single simple dn, returning all attributes in a single message @@ -246,9 +266,11 @@ int ltdb_search_dn1(struct ldb_module *module, struct ldb_dn *dn, struct ldb_mes void *data = ldb_module_get_private(module); struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private); int ret; - TDB_DATA tdb_key, tdb_data; - - memset(msg, 0, sizeof(*msg)); + TDB_DATA tdb_key; + struct ltdb_parse_data_unpack_ctx ctx = { + .msg = msg, + .module = module + }; /* form the key */ tdb_key = ltdb_key(module, dn); @@ -256,24 +278,24 @@ int ltdb_search_dn1(struct ldb_module *module, struct ldb_dn *dn, struct ldb_mes return LDB_ERR_OPERATIONS_ERROR; } - tdb_data = tdb_fetch(ltdb->tdb, tdb_key); - talloc_free(tdb_key.dptr); - if (!tdb_data.dptr) { - return LDB_ERR_NO_SUCH_OBJECT; - } - + memset(msg, 0, sizeof(*msg)); + msg->num_elements = 0; msg->elements = NULL; - ret = ltdb_unpack_data(module, &tdb_data, msg); - free(tdb_data.dptr); + ret = tdb_parse_record(ltdb->tdb, tdb_key, + ltdb_parse_data_unpack, &ctx); + talloc_free(tdb_key.dptr); + if (ret == -1) { - struct ldb_context *ldb = ldb_module_get_ctx(module); - ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid data for index %s\n", - ldb_dn_get_linearized(msg->dn)); - return LDB_ERR_OPERATIONS_ERROR; + if (tdb_error(ltdb->tdb) == TDB_ERR_NOEXIST) { + return LDB_ERR_NO_SUCH_OBJECT; + } + return LDB_ERR_OPERATIONS_ERROR; + } else if (ret != LDB_SUCCESS) { + return ret; } - + if (!msg->dn) { msg->dn = ldb_dn_copy(msg, dn); } |