svn commit: samba r17422 - in branches/SOC/mkhl/ldb-map/modules: .
mkhl at samba.org
mkhl at samba.org
Sat Aug 5 12:50:41 GMT 2006
Author: mkhl
Date: 2006-08-05 12:50:41 +0000 (Sat, 05 Aug 2006)
New Revision: 17422
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17422
Log:
Add logic to generate a list of attributes a parse tree requires from
that parse tree.
Use that logic to reenable partitioning attributes of a search request.
(No comments w.r.t. the function name, please...)c
Martin
Modified:
branches/SOC/mkhl/ldb-map/modules/ldb_map.c
Changeset:
Modified: branches/SOC/mkhl/ldb-map/modules/ldb_map.c
===================================================================
--- branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-08-05 12:46:42 UTC (rev 17421)
+++ branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-08-05 12:50:41 UTC (rev 17422)
@@ -655,7 +655,34 @@
return 0;
}
+/* TODO: comment me! */
+static
+int
+map_attrs_merge(struct ldb_module *module,
+ void *mem_ctx,
+ const char ***attrs,
+ const char * const *more_attrs)
+{
+ int i, j, k;
+ for (i = 0; (*attrs)[i]; i++) /* noop */ ;
+ for (j = 0; more_attrs[j]; j++) /* noop */ ;
+
+ *attrs = talloc_realloc(mem_ctx, *attrs, const char *, i+j+1);
+ if (*attrs == NULL) {
+ map_oom(module);
+ return -1;
+ }
+
+ for (k = 0; k < j; k++) {
+ (*attrs)[i+k] = more_attrs[k];
+ }
+
+ (*attrs)[i+k] = NULL;
+
+ return 0;
+}
+
/* Mapping ldb values
* ================== */
@@ -1254,6 +1281,45 @@
return True; /* no parse tree */
}
+/* TODO: Comment me! */
+static
+int
+ldb_parse_tree_collect_attrs(struct ldb_module *module,
+ void *mem_ctx,
+ const char ***attrs,
+ const struct ldb_parse_tree *tree)
+{
+ const char **new_attrs;
+ int i, ret;
+
+ if (tree == NULL) {
+ return 0;
+ }
+
+ switch (tree->operation) {
+ case LDB_OP_OR:
+ case LDB_OP_AND: /* attributes stored in list of subtrees */
+ for (i = 0; i < tree->u.list.num_elements; i++) {
+ ret = ldb_parse_tree_collect_attrs(module, mem_ctx, attrs, tree->u.list.elements[i]);
+ if (ret) {
+ return ret;
+ }
+ }
+ return 0;
+
+ case LDB_OP_NOT: /* attributes stored in single subtree */
+ return ldb_parse_tree_collect_attrs(module, mem_ctx, attrs, tree->u.isnot.child);
+
+ default: /* single attribute in tree */
+ new_attrs = ldb_attr_list_copy_add(mem_ctx, *attrs, tree->u.equality.attr);
+ talloc_free(*attrs);
+ *attrs = new_attrs;
+ return 0;
+ }
+
+ return -1;
+}
+
static int map_subtree_select_local(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree);
/* Select a negated subtree that queries attributes in the local partition */
@@ -1635,7 +1701,75 @@
return 0;
}
+/* TODO: Comment me! */
+/* TODO: Rename me! */
+static
+int
+map_flarp(struct ldb_module *module,
+ void *local_ctx,
+ void *remote_ctx,
+ const char ***local_attrs,
+ const char ***remote_attrs,
+ const char * const *search_attrs,
+ const struct ldb_parse_tree *tree)
+{
+ void *tmp_ctx;
+ const char **tree_attrs;
+ int ret;
+ /* Clear initial lists of partitioned attributes */
+ *local_attrs = NULL;
+ *remote_attrs = NULL;
+
+ /* There are no searched attributes, just stick to that */
+ if (search_attrs == NULL) {
+ return 0;
+ }
+
+ /* There is no tree, just partition the searched attributes */
+ if (tree == NULL) {
+ return map_attrs_partition(module, local_ctx, remote_ctx, local_attrs, remote_attrs, search_attrs);
+ }
+
+ /* Create context for temporary memory */
+ tmp_ctx = talloc_new(local_ctx);
+ if (tmp_ctx == NULL) {
+ goto oom;
+ }
+
+ /* Prepare list of attributes from tree */
+ tree_attrs = talloc_array(tmp_ctx, const char *, 1);
+ if (tree_attrs == NULL) {
+ talloc_free(tmp_ctx);
+ goto oom;
+ }
+ tree_attrs[0] = NULL;
+
+ /* Collect attributes from tree */
+ ret = ldb_parse_tree_collect_attrs(module, tmp_ctx, &tree_attrs, tree);
+ if (ret) {
+ goto done;
+ }
+
+ /* Merge attributes from search operation */
+ ret = map_attrs_merge(module, tmp_ctx, &tree_attrs, search_attrs);
+ if (ret) {
+ goto done;
+ }
+
+ /* Split local from remote attributes */
+ ret = map_attrs_partition(module, local_ctx, remote_ctx, local_attrs, remote_attrs, tree_attrs);
+
+done:
+ /* Free temporary memory */
+ talloc_free(tmp_ctx);
+ return ret;
+
+oom:
+ map_oom(module);
+ return -1;
+}
+
/* Mapping search results
* ====================== */
@@ -2135,17 +2269,10 @@
ac->remote_req->callback = map_remote_search_callback;
/* Split local from remote attrs */
- /* TODO: To check merged results against the original query,
- * we need to have all their attributes available. */
- /* That's why this code is disabled:
- ret = map_attrs_partition(module, ac, ac->remote_req, &local_attrs, &remote_attrs, req->op.search.attrs);
+ ret = map_flarp(module, ac, ac->remote_req, &local_attrs, &remote_attrs, req->op.search.attrs, req->op.search.tree);
if (ret) {
- ret = LDB_ERR_OPERATIONS_ERROR;
goto failed;
}
- */
- local_attrs = NULL;
- remote_attrs = NULL;
ac->local_attrs = local_attrs;
ac->remote_req->op.search.attrs = remote_attrs;
More information about the samba-cvs
mailing list