diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-10-06 05:24:46 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:39:26 -0500 |
commit | 5fd031c97daaa1bf09a7ad80550753acd434075f (patch) | |
tree | 8221ef256c17f138b11d22d9da26ae95db5618c4 /source4/lib/ldb/ldb_tdb/ldb_index.c | |
parent | 92da5aa6b8d5141b22d781442583c9f3ad94d3af (diff) | |
download | samba-5fd031c97daaa1bf09a7ad80550753acd434075f.tar.gz samba-5fd031c97daaa1bf09a7ad80550753acd434075f.tar.bz2 samba-5fd031c97daaa1bf09a7ad80550753acd434075f.zip |
r10753: don't require every ldb module to implement both a search_bytree() and
a search() function, instead each module now only implements the
bytree method, and the expression based search is handled generically
by the modules code. This makes for more consistency and less code
duplication.
fixed the tdb backend to handle BASE searches much more
efficiently. They now always only lookup one record, regardless of the
search expression
(This used to be commit 7e44f9153c5578624e2fca04cdc0a00af0fd9eb4)
Diffstat (limited to 'source4/lib/ldb/ldb_tdb/ldb_index.c')
-rw-r--r-- | source4/lib/ldb/ldb_tdb/ldb_index.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/source4/lib/ldb/ldb_tdb/ldb_index.c b/source4/lib/ldb/ldb_tdb/ldb_index.c index f78d840206..c2a4fb1ea8 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_index.c +++ b/source4/lib/ldb/ldb_tdb/ldb_index.c @@ -676,7 +676,8 @@ int ltdb_search_indexed(struct ldb_module *module, struct dn_list *dn_list; int ret; - if (ltdb->cache->indexlist->num_elements == 0) { + if (ltdb->cache->indexlist->num_elements == 0 && + scope != LDB_SCOPE_BASE) { /* no index list? must do full search */ return -1; } @@ -686,7 +687,18 @@ int ltdb_search_indexed(struct ldb_module *module, return -1; } - ret = ltdb_index_dn(module, tree, ltdb->cache->indexlist, dn_list); + if (scope == LDB_SCOPE_BASE) { + /* with BASE searches only one DN can match */ + char *dn = ldb_dn_linearize(dn_list, base); + if (dn == NULL) { + return -1; + } + dn_list->count = 1; + dn_list->dn = &dn; + ret = 1; + } else { + ret = ltdb_index_dn(module, tree, ltdb->cache->indexlist, dn_list); + } if (ret == 1) { /* we've got a candidate list - now filter by the full tree |