diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-09-20 05:41:42 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-09-20 06:44:16 +0200 |
commit | 46dab92a2ddb4af3706de15894acc54b0b2b8d7b (patch) | |
tree | b125c36472117f9bf2cf86f2bbfc4efe437a6946 /source4/lib/ldb/common | |
parent | c14b2eb8ddba17b6e349038671124e70a66e6723 (diff) | |
download | samba-46dab92a2ddb4af3706de15894acc54b0b2b8d7b.tar.gz samba-46dab92a2ddb4af3706de15894acc54b0b2b8d7b.tar.bz2 samba-46dab92a2ddb4af3706de15894acc54b0b2b8d7b.zip |
s4:ldb: add ldb_parse_tree_copy_shallow() and change version to 0.9.7
metze
Diffstat (limited to 'source4/lib/ldb/common')
-rw-r--r-- | source4/lib/ldb/common/ldb_parse.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/source4/lib/ldb/common/ldb_parse.c b/source4/lib/ldb/common/ldb_parse.c index 0fab0026f3..7f347c51df 100644 --- a/source4/lib/ldb/common/ldb_parse.c +++ b/source4/lib/ldb/common/ldb_parse.c @@ -818,3 +818,61 @@ void ldb_parse_tree_attr_replace(struct ldb_parse_tree *tree, break; } } + +/* + shallow copy a tree - copying only the elements array so that the caller + can safely add new elements without changing the message +*/ +struct ldb_parse_tree *ldb_parse_tree_copy_shallow(TALLOC_CTX *mem_ctx, + const struct ldb_parse_tree *ot) +{ + int i; + struct ldb_parse_tree *nt; + + nt = talloc(mem_ctx, struct ldb_parse_tree); + if (!nt) { + return NULL; + } + + *nt = *ot; + + switch (ot->operation) { + case LDB_OP_AND: + case LDB_OP_OR: + nt->u.list.elements = talloc_array(nt, struct ldb_parse_tree, + ot->u.list.num_elements); + if (!nt->u.list.elements) { + talloc_free(nt); + return NULL; + } + + for (i=0;i<ot->u.list.num_elements;i++) { + nt->u.list.elements[i] = + ldb_parse_tree_copy_shallow(nt->u.list.elements, + ot->u.list.elements[i]); + if (!nt->u.list.elements[i]) { + talloc_free(nt); + return NULL; + } + } + break; + case LDB_OP_NOT: + nt->u.isnot.child = ldb_parse_tree_copy_shallow(nt, + ot->u.isnot.child); + if (!nt->u.isnot.child) { + talloc_free(nt); + return NULL; + } + break; + case LDB_OP_EQUALITY: + case LDB_OP_GREATER: + case LDB_OP_LESS: + case LDB_OP_APPROX: + case LDB_OP_SUBSTRING: + case LDB_OP_PRESENT: + case LDB_OP_EXTENDED: + break; + } + + return nt; +} |