summaryrefslogtreecommitdiff
path: root/source4/torture/ldb
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2016-07-27 00:17:36 +1200
committerStefan Metzmacher <metze@samba.org>2016-07-28 10:06:12 +0200
commitf6e87188b60bea7d15bc015a8617e7ed3f7fbeda (patch)
tree891d28d73260e2da86f34c53997b7bfc79e641eb /source4/torture/ldb
parentebdf6e079b758aeb750201c4989706c43af2420e (diff)
downloadsamba-f6e87188b60bea7d15bc015a8617e7ed3f7fbeda.tar.gz
ldb: Add ldb_unpack_data_only_attr_list_flags()
This function allows us to control allocation of memory during parse of the packed ldb data. This in turn can have an important performance impact as each small allocation can have a large overhead Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Diffstat (limited to 'source4/torture/ldb')
-rw-r--r--source4/torture/ldb/ldb.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/source4/torture/ldb/ldb.c b/source4/torture/ldb/ldb.c
index 7ea9726d520..f7f04db0242 100644
--- a/source4/torture/ldb/ldb.c
+++ b/source4/torture/ldb/ldb.c
@@ -1102,6 +1102,54 @@ static bool torture_ldb_unpack(struct torture_context *torture)
return true;
}
+static bool torture_ldb_unpack_flags(struct torture_context *torture)
+{
+ TALLOC_CTX *mem_ctx = talloc_new(torture);
+ struct ldb_context *ldb;
+ struct ldb_val data = data_blob_const(dda1d01d_bin, sizeof(dda1d01d_bin));
+ struct ldb_message *msg = ldb_msg_new(mem_ctx);
+ const char *ldif_text = dda1d01d_ldif;
+ struct ldb_ldif ldif;
+ unsigned int nb_elements_in_db;
+
+ ldb = samba_ldb_init(mem_ctx, torture->ev, NULL, NULL, NULL);
+ torture_assert(torture,
+ ldb != NULL,
+ "Failed to init ldb");
+
+ torture_assert_int_equal(torture,
+ ldb_unpack_data_only_attr_list_flags(ldb, &data,
+ msg,
+ NULL, 0,
+ LDB_UNPACK_DATA_FLAG_NO_DATA_ALLOC,
+ &nb_elements_in_db),
+ 0,
+ "ldb_unpack_data failed");
+
+ ldif.changetype = LDB_CHANGETYPE_NONE;
+ ldif.msg = msg;
+ ldif_text = ldb_ldif_write_string(ldb, mem_ctx, &ldif);
+
+ torture_assert_int_equal(torture,
+ strcmp(ldif_text, dda1d01d_ldif), 0,
+ "ldif form differs from binary form");
+
+ torture_assert_int_equal(torture,
+ ldb_unpack_data_only_attr_list_flags(ldb, &data,
+ msg,
+ NULL, 0,
+ LDB_UNPACK_DATA_FLAG_NO_DN,
+ &nb_elements_in_db),
+ 0,
+ "ldb_unpack_data failed");
+
+ torture_assert(torture,
+ msg->dn == NULL,
+ "msg->dn should be NULL");
+
+ return true;
+}
+
static bool torture_ldb_parse_ldif(struct torture_context *torture)
{
TALLOC_CTX *mem_ctx = talloc_new(torture);
@@ -1265,6 +1313,8 @@ struct torture_suite *torture_ldb(TALLOC_CTX *mem_ctx)
torture_suite_add_simple_test(suite, "dn", torture_ldb_dn);
torture_suite_add_simple_test(suite, "unpack-data",
torture_ldb_unpack);
+ torture_suite_add_simple_test(suite, "unpack-data-flags",
+ torture_ldb_unpack_flags);
torture_suite_add_simple_test(suite, "parse-ldif",
torture_ldb_parse_ldif);
torture_suite_add_simple_test(suite, "unpack-data-only-attr-list",