s4:dsdb In partitions module, tell the caller what partition was used.
authorAndrew Bartlett <abartlet@samba.org>
Wed, 14 Oct 2009 23:49:25 +0000 (10:49 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 21 Oct 2009 11:43:53 +0000 (22:43 +1100)
This means we don't return any control for modifications to the
control records in sam.ldb, but do if they modified one of the actual
data LDB files.

Andrew Bartlett

source4/dsdb/samdb/ldb_modules/partition.c

index d1892f0c5447a721725c25a31eba2d6c932a229b..64ec798e4c4b62fc134c252096758cb36a66c4da 100644 (file)
@@ -66,7 +66,7 @@ static struct partition_context *partition_init_ctx(struct ldb_module *module, s
  *    helper functions to call the next module in chain
  *    */
 
-static int partition_request(struct ldb_module *module, struct ldb_request *request)
+int partition_request(struct ldb_module *module, struct ldb_request *request)
 {
        int ret;
        switch (request->operation) {
@@ -160,6 +160,7 @@ static int partition_req_callback(struct ldb_request *req,
        struct ldb_request *nreq;
        int ret, i;
        struct partition_private_data *data;
+       struct ldb_control *partition_ctrl;
 
        ac = talloc_get_type(req->context, struct partition_context);
        data = talloc_get_type(ac->module->private_data, struct partition_private_data);
@@ -169,6 +170,21 @@ static int partition_req_callback(struct ldb_request *req,
                                        LDB_ERR_OPERATIONS_ERROR);
        }
 
+       partition_ctrl = ldb_request_get_control(req, DSDB_CONTROL_CURRENT_PARTITION_OID);
+       if (partition_ctrl && (ac->num_requests == 1 || ares->type == LDB_REPLY_ENTRY)) {
+               /* If we didn't fan this request out to mulitple partitions,
+                * or this is an individual search result, we can
+                * deterministily tell the caller what partition this was
+                * written to (repl_meta_data likes to know) */
+                       ret = ldb_reply_add_control(ares,
+                                                   DSDB_CONTROL_CURRENT_PARTITION_OID,
+                                                   false, partition_ctrl->data);
+                       if (ret != LDB_SUCCESS) {
+                               return ldb_module_done(ac->req, NULL, NULL,
+                                                      ret);
+                       }
+       }
+
        if (ares->error != LDB_SUCCESS && !ac->got_success) {
                return ldb_module_done(ac->req, ares->controls,
                                        ares->response, ares->error);