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