summaryrefslogtreecommitdiff
path: root/source4/lib/ldb/ldb_tdb/ldb_search.c
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2005-06-14 19:15:17 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:18:11 -0500
commit9189833a8753a723a8b8d0af9c8b096571b06a84 (patch)
treed20481827bb51e1d2a6cddb2a7bcb64ff653b7a7 /source4/lib/ldb/ldb_tdb/ldb_search.c
parent056d63c62f3793fda0d3049a2f98cef435c9003e (diff)
downloadsamba-9189833a8753a723a8b8d0af9c8b096571b06a84.tar.gz
samba-9189833a8753a723a8b8d0af9c8b096571b06a84.tar.bz2
samba-9189833a8753a723a8b8d0af9c8b096571b06a84.zip
r7582: Better way to have a fast path searching for a specific DN.
Old way was ugly and had a bug, you couldn't add an attribute named dn or distinguishedName and search for it, tdb would change that search in a dn search. This makes it also possible to search by dn against an ldap server as the old method was not supported by ldap syntaxes. sss (This used to be commit a614466dec2484a0d39bdfae53da822cfcf80926)
Diffstat (limited to 'source4/lib/ldb/ldb_tdb/ldb_search.c')
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_search.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/source4/lib/ldb/ldb_tdb/ldb_search.c b/source4/lib/ldb/ldb_tdb/ldb_search.c
index 17eff6f0a6..d210510ff2 100644
--- a/source4/lib/ldb/ldb_tdb/ldb_search.c
+++ b/source4/lib/ldb/ldb_tdb/ldb_search.c
@@ -272,7 +272,7 @@ int ltdb_search_dn1(struct ldb_module *module, const char *dn, struct ldb_messag
/*
search the database for a single simple dn
*/
-int ltdb_search_dn(struct ldb_module *module, char *dn,
+int ltdb_search_dn(struct ldb_module *module, const char *dn,
const char * const attrs[], struct ldb_message ***res)
{
struct ldb_context *ldb = module->ldb;
@@ -482,17 +482,9 @@ int ltdb_search_bytree(struct ldb_module *module, const char *base,
*res = NULL;
- if (tree->operation == LDB_OP_SIMPLE &&
- (ldb_attr_cmp(tree->u.simple.attr, "dn") == 0 ||
- ldb_attr_cmp(tree->u.simple.attr, "distinguishedName") == 0) &&
- !ltdb_has_wildcard(module, tree->u.simple.attr, &tree->u.simple.value)) {
- /* yay! its a nice simple one */
- ret = ltdb_search_dn(module, tree->u.simple.value.data, attrs, res);
- } else {
- ret = ltdb_search_indexed(module, base, scope, tree, attrs, res);
- if (ret == -1) {
- ret = ltdb_search_full(module, base, scope, tree, attrs, res);
- }
+ ret = ltdb_search_indexed(module, base, scope, tree, attrs, res);
+ if (ret == -1) {
+ ret = ltdb_search_full(module, base, scope, tree, attrs, res);
}
ltdb_unlock_read(module);
@@ -513,6 +505,13 @@ int ltdb_search(struct ldb_module *module, const char *base,
struct ldb_parse_tree *tree;
int ret;
+ /* check if we are looking for a simple dn */
+ if (scope == LDB_SCOPE_BASE && (expression == NULL || expression[0] == '\0')) {
+ ret = ltdb_search_dn(module, base, attrs, res);
+ ltdb_unlock_read(module);
+ return ret;
+ }
+
tree = ldb_parse_tree(ltdb, expression);
if (tree == NULL) {
ltdb->last_err_string = "expression parse failed";