svn commit: samba r12184 - in branches/tmp/samba4_ldap_controls/source/lib/ldb: modules tools

idra at samba.org idra at samba.org
Sun Dec 11 18:34:08 GMT 2005


Author: idra
Date: 2005-12-11 18:34:07 +0000 (Sun, 11 Dec 2005)
New Revision: 12184

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12184

Log:

ok now sort works, it was an ber encoding problem in the control
plus some weird bug when the connection is sealed made me not think
about that immediately.

Simo.


Modified:
   branches/tmp/samba4_ldap_controls/source/lib/ldb/modules/sort.c
   branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c


Changeset:
Modified: branches/tmp/samba4_ldap_controls/source/lib/ldb/modules/sort.c
===================================================================
--- branches/tmp/samba4_ldap_controls/source/lib/ldb/modules/sort.c	2005-12-11 18:32:58 UTC (rev 12183)
+++ branches/tmp/samba4_ldap_controls/source/lib/ldb/modules/sort.c	2005-12-11 18:34:07 UTC (rev 12184)
@@ -62,6 +62,7 @@
 	struct ldb_server_sort_control **sort_ctrls;
 	struct ldb_sort_resp_control *sort_resp;
 	int i, cnum, ret;
+	BOOL do_sort = True;
 
 	/* check if there's a paged request control */
 	if (req->controls != NULL) {
@@ -82,7 +83,38 @@
 	sort_ctrls = (struct ldb_server_sort_control **)req->controls[cnum]->data;
 
 	/* FIXME: we do not support more than one attribute for sorting right now */
-	if (sort_ctrls[1] != NULL) {
+	/* FIXME: we need to check if the attribute type exist or return an error */
+	if (sort_ctrls[1] != NULL)
+		do_sort = False;
+		
+	if (!do_sort && req->controls[cnum]->critical) {
+		sort_result = talloc(req, struct ldb_result);
+		if (!sort_result)
+			return LDB_ERR_OPERATIONS_ERROR;
+
+		sort_result->count = 0;
+		sort_result->msgs = NULL;
+		sort_result->controls = talloc_array(sort_result, struct ldb_control *, 2);
+		if (! sort_result->controls )
+			return LDB_ERR_OPERATIONS_ERROR;
+
+		sort_result->controls[0] = talloc(sort_result->controls, struct ldb_control);
+		if (! sort_result->controls[0] )
+			return LDB_ERR_OPERATIONS_ERROR;
+
+		sort_result->controls[0]->oid = LDB_CONTROL_SORT_RESP_OID;
+		sort_result->controls[0]->critical = False;
+		sort_resp = talloc(sort_result->controls[0], struct ldb_sort_resp_control);
+		if (! sort_resp )
+			return LDB_ERR_OPERATIONS_ERROR;
+
+		sort_resp->result = 53; /* unwilling to perform */
+		sort_resp->attr_desc = "sort control is not complete yet";
+		sort_result->controls[0]->data = sort_resp;
+		sort_result->controls[1] = NULL;
+
+		req->op.search.res = sort_result;
+
 		return LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION;
 	}
 
@@ -113,29 +145,31 @@
 	}
 
 	/* SORT HERE */
-	sort_result = req->op.search.res;
-	sort_control = sort_ctrls[0];
-	ldbctx = module->ldb;
-	h = ldb_attrib_handler(ldbctx, sort_control->attributeName);
+	if (do_sort) {
+		sort_result = req->op.search.res;
+		sort_control = sort_ctrls[0];
+		ldbctx = module->ldb;
+		h = ldb_attrib_handler(ldbctx, sort_control->attributeName);
 
-	/* FIXME: I don't like to use a static structure like sort_control
-	 * we need to either:
-	 * a) write a qsort function that takes a third void parameter
-	 * or
-	 * b) prepare a structure with all elements pre digested like:
-	 * 	struct element {
-	 * 		struct ldb_message_element *el;
-	 * 		struct ldb_message *msg;
-	 * 	}
-	 *
-	 * 	this mean we will have to do a linear scan of
-	 * 	the msgs array to build the new sort array, and
-	 * 	then do a linear scan of the resulting array
-	 * 	to rebuild the msgs array in the original shape.
-	 */
+		/* FIXME: I don't like to use a static structure like sort_control
+		 * we need to either:
+		 * a) write a qsort function that takes a third void parameter
+		 * or
+		 * b) prepare a structure with all elements pre digested like:
+		 * 	struct element {
+		 * 		struct ldb_message_element *el;
+		 * 		struct ldb_message *msg;
+		 * 	}
+		 *
+		 * 	this mean we will have to do a linear scan of
+		 * 	the msgs array to build the new sort array, and
+		 * 	then do a linear scan of the resulting array
+		 * 	to rebuild the msgs array in the original shape.
+		 */
 
-	qsort(sort_result->msgs, sort_result->count,
-		sizeof(struct ldb_message *), (comparison_fn_t)sort_compare);
+		qsort(sort_result->msgs, sort_result->count,
+			sizeof(struct ldb_message *), (comparison_fn_t)sort_compare);
+	}
 
 	if (sort_result->controls) {
 		for (i = 0; sort_result->controls[i]; i++);
@@ -158,7 +192,11 @@
 	if (! sort_resp )
 		return LDB_ERR_OPERATIONS_ERROR;
 
-	sort_resp->result = 0;
+	if (do_sort) {
+		sort_resp->result = 0;
+	} else {
+		sort_resp->result = 53;
+	}
 	sort_resp->attr_desc = "sort control is not complete yet";
 	sort_result->controls[i]->data = sort_resp;
 

Modified: branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c
===================================================================
--- branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c	2005-12-11 18:32:58 UTC (rev 12183)
+++ branches/tmp/samba4_ldap_controls/source/lib/ldb/tools/ldbtest_controls.c	2005-12-11 18:34:07 UTC (rev 12184)
@@ -262,7 +262,7 @@
 		fprintf(stderr, "ERROR: No control reply even if control was marked as critical\n");
 	} else {
 		sort_result = (struct ldb_sort_resp_control *)result->controls[0]->data;
-		fprintf(stderr, "Sort result: %d (%s)\n", sort_result->result, sort_result->attr_desc);
+		fprintf(stderr, "Sort result: %d (%s)\n", sort_result->result, sort_result->attr_desc?sort_result->attr_desc:"null");
 	}
 
 	ret = talloc_free(result);



More information about the samba-cvs mailing list