summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/ldb/Makefile.ldb5
-rw-r--r--source4/lib/ldb/include/includes.h2
-rwxr-xr-xsource4/lib/ldb/tests/init_slapd.sh2
-rw-r--r--source4/lib/ldb/tests/slapd.conf12
-rwxr-xr-xsource4/lib/ldb/tests/start_slapd.sh3
-rw-r--r--source4/lib/ldb/tests/test-index.ldif3
-rw-r--r--source4/lib/ldb/tests/test.ldif3
-rw-r--r--source4/lib/ldb/tools/ldbtest.c247
8 files changed, 266 insertions, 11 deletions
diff --git a/source4/lib/ldb/Makefile.ldb b/source4/lib/ldb/Makefile.ldb
index ba8c040f9c..dfd429ecc8 100644
--- a/source4/lib/ldb/Makefile.ldb
+++ b/source4/lib/ldb/Makefile.ldb
@@ -11,7 +11,7 @@ endif
TDBDIR=../tdb
-CFLAGS=-Wall -g -Iinclude -I. -I.. -DSTANDALONE=1 -DUSE_MMAP=1 $(LDAP_FLAGS)
+CFLAGS=-Wall -O3 -Iinclude -I. -I.. -DSTANDALONE=1 -DUSE_MMAP=1 $(LDAP_FLAGS)
LIB_FLAGS=-Llib -lldb $(LDAP_LIBS)
TDB_OBJ=$(TDBDIR)/tdb.o $(TDBDIR)/spinlock.o
@@ -59,6 +59,9 @@ bin/ldbmodify: tools/ldbmodify.o $(LIBS)
bin/ldbedit: tools/ldbedit.o $(LIBS)
$(CC) -o bin/ldbedit tools/ldbedit.o $(LIB_FLAGS)
+bin/ldbtest: tools/ldbtest.o $(LIBS)
+ $(CC) -o bin/ldbtest tools/ldbtest.o $(LIB_FLAGS)
+
clean:
rm -f */*.o *~ */*~ $(BINS) $(LDB_LIB)
diff --git a/source4/lib/ldb/include/includes.h b/source4/lib/ldb/include/includes.h
index 485d7157b8..7ee6876f48 100644
--- a/source4/lib/ldb/include/includes.h
+++ b/source4/lib/ldb/include/includes.h
@@ -15,6 +15,8 @@
#include <signal.h>
#include <unistd.h>
#include <fnmatch.h>
+#include <sys/time.h>
+#include <time.h>
#include "ldb.h"
#include "ldb_parse.h"
diff --git a/source4/lib/ldb/tests/init_slapd.sh b/source4/lib/ldb/tests/init_slapd.sh
index 94dca71791..67eecb031c 100755
--- a/source4/lib/ldb/tests/init_slapd.sh
+++ b/source4/lib/ldb/tests/init_slapd.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-export PATH=/home/tridge/samba/openldap/prefix/sbin:/home/tridge/samba/openldap/prefix/bin:/home/tridge/samba/openldap/prefix/libexec:$PATH
+export PATH=/usr/sbin:$PATH
rm -rf tests/tmp/db
mkdir -p tests/tmp/db
diff --git a/source4/lib/ldb/tests/slapd.conf b/source4/lib/ldb/tests/slapd.conf
index cb71eb3963..10d15b541c 100644
--- a/source4/lib/ldb/tests/slapd.conf
+++ b/source4/lib/ldb/tests/slapd.conf
@@ -14,12 +14,14 @@ access to * by * write
allow update_anon bind_anon_dn
+modulepath /usr/lib/ldap
+moduleload back_bdb
+
defaultsearchbase "o=University of Michigan,c=US"
-database ldbm
+backend bdb
+database bdb
suffix "o=University of Michigan,c=US"
directory tests/tmp/db
-
-index objectClass eq
-index drink eq
-index title eq
+index objectClass eq
+index uid eq
diff --git a/source4/lib/ldb/tests/start_slapd.sh b/source4/lib/ldb/tests/start_slapd.sh
index d000eec9a4..d03a0fca32 100755
--- a/source4/lib/ldb/tests/start_slapd.sh
+++ b/source4/lib/ldb/tests/start_slapd.sh
@@ -1,8 +1,7 @@
#!/bin/sh
-export PATH=/home/tridge/samba/openldap/prefix/sbin:/home/tridge/samba/openldap/prefix/bin:/home/tridge/samba/openldap/prefix/libexec:$PATH
+export PATH=/usr/sbin:$PATH
mkdir -p tests/tmp/db
slapd -f tests/slapd.conf -h "`tests/ldapi_url.sh`" $*
-
diff --git a/source4/lib/ldb/tests/test-index.ldif b/source4/lib/ldb/tests/test-index.ldif
index fe9c79d1a2..0f1268c44f 100644
--- a/source4/lib/ldb/tests/test-index.ldif
+++ b/source4/lib/ldb/tests/test-index.ldif
@@ -1,4 +1,3 @@
dn: @INDEXLIST
-@IDXATTR: drink
-@IDXATTR: title
+@IDXATTR: uid
@IDXATTR: objectclass
diff --git a/source4/lib/ldb/tests/test.ldif b/source4/lib/ldb/tests/test.ldif
index 72d52a25f8..2d7e1f95de 100644
--- a/source4/lib/ldb/tests/test.ldif
+++ b/source4/lib/ldb/tests/test.ldif
@@ -414,3 +414,6 @@ pager: +1 313 555 2844
facsimiletelephonenumber: +1 313 555 9700
telephonenumber: +1 313 555 5331
+dn: ou=Ldb Test,ou=People,o=University of Michigan,c=US
+objectclass: organizationalUnit
+ou: Ldb Test
diff --git a/source4/lib/ldb/tools/ldbtest.c b/source4/lib/ldb/tools/ldbtest.c
new file mode 100644
index 0000000000..b7d1d22db8
--- /dev/null
+++ b/source4/lib/ldb/tools/ldbtest.c
@@ -0,0 +1,247 @@
+/*
+ ldb database library
+
+ Copyright (C) Andrew Tridgell 2004
+
+ ** NOTE! The following LGPL license applies to the ldb
+ ** library. This does NOT imply that all of Samba is released
+ ** under the LGPL
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/*
+ * Name: ldb
+ *
+ * Component: ldbtest
+ *
+ * Description: utility to test ldb
+ *
+ * Author: Andrew Tridgell
+ */
+
+#include "includes.h"
+
+static struct timeval tp1,tp2;
+
+static void start_timer()
+{
+ gettimeofday(&tp1,NULL);
+}
+
+static double end_timer()
+{
+ gettimeofday(&tp2,NULL);
+ return((tp2.tv_sec - tp1.tv_sec) +
+ (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
+}
+
+static void add_records(struct ldb_context *ldb,
+ const char *basedn,
+ int count)
+{
+ struct ldb_message msg;
+ int i;
+
+ for (i=0;i<count;i++) {
+ struct ldb_message_element el[6];
+ struct ldb_val vals[6][1];
+ char *name;
+
+ asprintf(&name, "Test%d", i);
+
+ asprintf(&msg.dn, "cn=%s,%s", name, basedn);
+ msg.num_elements = 6;
+ msg.elements = el;
+
+ el[0].flags = 0;
+ el[0].name = "cn";
+ el[0].num_values = 1;
+ el[0].values = vals[0];
+ vals[0][0].data = name;
+ vals[0][0].length = strlen(name);
+
+ el[1].flags = 0;
+ el[1].name = "title";
+ el[1].num_values = 1;
+ el[1].values = vals[1];
+ asprintf((char **)&vals[1][0].data, "The title of %s", name);
+ vals[1][0].length = strlen(vals[1][0].data);
+
+ el[2].flags = 0;
+ el[2].name = "uid";
+ el[2].num_values = 1;
+ el[2].values = vals[2];
+ vals[2][0].data = ldb_casefold(name);
+ vals[2][0].length = strlen(vals[2][0].data);
+
+ el[3].flags = 0;
+ el[3].name = "mail";
+ el[3].num_values = 1;
+ el[3].values = vals[3];
+ asprintf((char **)&vals[3][0].data, "%s@example.com", name);
+ vals[3][0].length = strlen(vals[3][0].data);
+
+ el[4].flags = 0;
+ el[4].name = "objectClass";
+ el[4].num_values = 1;
+ el[4].values = vals[4];
+ vals[4][0].data = "OpenLDAPperson";
+ vals[4][0].length = strlen(vals[4][0].data);
+
+ el[5].flags = 0;
+ el[5].name = "sn";
+ el[5].num_values = 1;
+ el[5].values = vals[5];
+ vals[5][0].data = name;
+ vals[5][0].length = strlen(vals[5][0].data);
+
+ if (ldb_add(ldb, &msg) != 0) {
+ printf("Add of %s failed - %s\n", name, ldb_errstring(ldb));
+ exit(1);
+ }
+
+ printf("adding uid %s\r", name);
+ fflush(stdout);
+
+ free(name);
+ free(msg.dn);
+ free(vals[1][0].data);
+ free(vals[2][0].data);
+ free(vals[3][0].data);
+ }
+
+ printf("\n");
+}
+
+static void search_uid(struct ldb_context *ldb, int nrecords, int nsearches)
+{
+ int i;
+
+ for (i=0;i<nsearches;i++) {
+ int uid = (i * 700 + 17) % (nrecords * 2);
+ char *expr;
+ struct ldb_message **res;
+ int ret;
+
+ asprintf(&expr, "(uid=TEST%d)", uid);
+ ret = ldb_search(ldb, NULL, LDB_SCOPE_SUBTREE, expr, NULL, &res);
+
+ if (uid < nrecords && ret != 1) {
+ printf("Failed to find %s - %s\n", expr, ldb_errstring(ldb));
+ exit(1);
+ }
+
+ if (uid >= nrecords && ret > 0) {
+ printf("Found %s !? - %d\n", expr, ret);
+ exit(1);
+ }
+
+ if (ret > 0) {
+ ldb_search_free(ldb, res);
+ }
+
+ printf("testing uid %d/%d - %d \r", i, uid, ret);
+ fflush(stdout);
+
+ free(expr);
+ }
+
+ printf("\n");
+}
+
+static void start_test(struct ldb_context *ldb, int nrecords, int nsearches)
+{
+ printf("Adding %d records\n", nrecords);
+
+ add_records(ldb, "ou=Ldb Test,ou=People,o=University of Michigan,c=US",
+ nrecords);
+
+ printf("Starting search on uid\n");
+
+ start_timer();
+
+ search_uid(ldb, nrecords, nsearches);
+
+ printf("uid search took %.2f seconds\n", end_timer());
+}
+
+
+static void usage(void)
+{
+ printf("Usage: ldbtest <options>\n");
+ printf("Options:\n");
+ printf(" -H ldb_url choose the database (or $LDB_URL)\n");
+ printf(" -r nrecords database size to use\n");
+ printf(" -s nsearches number of searches to do\n");
+ printf("\n");
+ printf("tests ldb API\n\n");
+ exit(1);
+}
+
+ int main(int argc, char * const argv[])
+{
+ struct ldb_context *ldb;
+ const char *ldb_url;
+ int opt;
+ int nrecords = 5000;
+ int nsearches = 2000;
+
+ ldb_url = getenv("LDB_URL");
+
+ while ((opt = getopt(argc, argv, "hH:r:s:")) != EOF) {
+ switch (opt) {
+ case 'H':
+ ldb_url = optarg;
+ break;
+
+ case 'r':
+ nrecords = atoi(optarg);
+ break;
+
+ case 's':
+ nsearches = atoi(optarg);
+ break;
+
+ case 'h':
+ default:
+ usage();
+ break;
+ }
+ }
+
+ if (!ldb_url) {
+ fprintf(stderr, "You must specify a ldb URL\n\n");
+ usage();
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ ldb = ldb_connect(ldb_url, 0, NULL);
+
+ if (!ldb) {
+ perror("ldb_connect");
+ exit(1);
+ }
+
+ srandom(1);
+
+ start_test(ldb, nrecords, nsearches);
+
+ ldb_close(ldb);
+
+ return 0;
+}