Author: mkhl
Date: 2006-06-25 16:08:19 +0000 (Sun, 25 Jun 2006)
New Revision: 16511

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

Log:
Add remote search callback, not yet merging results.

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-06-25 12:22:12 UTC (rev 
16510)
+++ branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-06-25 16:08:19 UTC (rev 
16511)
@@ -1395,7 +1395,14 @@
        return 0;
 }
 
+static
+int
+merge_mapped_results(struct map_async_search_context *context)
+{
+       return LDB_SUCCESS;     /* TODO */
+}
 
+
 /* store single search result in async context */
 static
 int
@@ -1404,6 +1411,7 @@
                     struct ldb_async_result *ares)
 {
        struct map_async_context *ac;
+       const char *dn;
 
        if (context == NULL || ares == NULL) {
                ldb_set_errstring(ldb, talloc_asprintf(ldb, "NULL Context or 
Result in callback"));
@@ -1418,19 +1426,17 @@
                return LDB_SUCCESS;
        }
 
-       /* we already have a remote DN */
+       /* we have already found a remote DN */
        if (ac->remote_dn) {
-               ldb_set_errstring(ldb,
-                                 talloc_asprintf(ldb, "Too many results"));
+               ldb_set_errstring(ldb, talloc_asprintf(ldb, "Too many results 
to base search"));
                talloc_free(ares);
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
        /* extract remote DN */
-       ac->search_res = talloc_steal(ac, ares);
-       ac->remote_dn = ldb_dn_explode(ac,
-                                      ldb_msg_find_string(ares->message,
-                                                          IS_MAPPED, NULL));
+       ac->search_res = ares;
+       dn = ldb_msg_find_string(ares->message, IS_MAPPED, NULL);
+       ac->remote_dn = ldb_dn_explode(ac, dn);
 
        return LDB_SUCCESS;
 }
@@ -1492,6 +1498,47 @@
                       void *context,
                       struct ldb_async_result *ares)
 {
+       struct map_async_search_context *sc;
+       int ret;
+
+       if (context == NULL || ares == NULL) {
+               ldb_set_errstring(ldb, talloc_asprintf(ldb, "NULL Context or 
Result in callback"));
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+
+       sc = talloc_get_type(context, struct map_async_search_context);
+
+       switch (ares->type) {
+       case LDB_REPLY_ENTRY:
+               /* we have already found a remote record */
+               if (sc->remote_res) {
+                       ldb_set_errstring(ldb, talloc_asprintf(ldb, "Too many 
results to base search"));
+                       talloc_free(ares);
+                       return LDB_ERR_OPERATIONS_ERROR;
+               }
+
+               /* store remote result */
+               sc->remote_res = ares;
+
+               /* merge remote into local record */
+               ret = merge_mapped_results(sc);
+               if (ret != LDB_SUCCESS)
+                       talloc_free(ares);
+
+               return ret;
+
+       case LDB_REPLY_DONE:
+               /* no mapped record found, continue with local record */
+               if (sc->remote_res == NULL)
+                       return sc->ac->orig_req->async.callback(ldb, 
sc->ac->orig_req->async.context, sc->local_res);
+               break;
+
+       default:
+               talloc_free(ares);
+               ldb_set_errstring(ldb, talloc_asprintf(ldb, "Unexpected result 
type in base search for mapped entry"));
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+
        return LDB_SUCCESS;
 }
 
@@ -1516,13 +1563,11 @@
 
        /* stop searching if it's not a record */
        if (ares->type != LDB_REPLY_ENTRY)
-               return ac->orig_req->
-                       async.callback(ldb, ac->orig_req->async.context, ares);
+               goto callback;
 
        /* stop searching if it's not mapped */
        if (!ldb_msg_find_element(ares->message, IS_MAPPED))
-               return ac->orig_req->
-                       async.callback(ldb, ac->orig_req->async.context, ares);
+               goto callback;
 
        /* extract remote DN */
        dn = ldb_dn_explode(ac, ldb_msg_find_string(ares->message,
@@ -1541,8 +1586,9 @@
        if (sc == NULL)
                goto error;
 
+       /* store local result */
        sc->ac = ac;
-       sc->local_res = ares;   /* TODO: steal? */
+       sc->local_res = ares;
        sc->remote_res = NULL;
 
        /* TODO: replace NULL with remote attrs! */
@@ -1552,6 +1598,9 @@
 
        return ldb_next_remote_request(ac->module, req);
 
+callback:
+       return ac->orig_req->async.callback(ldb, ac->orig_req->async.context, 
ares);
+
 error:
        talloc_free(ares);
        return LDB_ERR_OPERATIONS_ERROR;
@@ -1561,7 +1610,6 @@
 /* Handling LDB requests */
 
 /* /\* Search fallback database *\/ */
-/* /\* TODO: async *\/ */
 /* static int map_search_fb(struct ldb_module *module, struct ldb_request 
*req) */
 /* { */
 /*     struct ldb_parse_tree *tree = req->op.search.tree; */
@@ -1592,7 +1640,6 @@
 /* } */
 
 /* /\* Search in the database against which we are mapping *\/ */
-/* /\* TODO: async *\/ */
 /* static int map_search_mp(struct ldb_module *module, struct ldb_request 
*req) */
 /* { */
 /*     const struct ldb_dn *base = req->op.search.base; */
@@ -1714,7 +1761,6 @@
 /* } */
 
 /* /\* Search for matching records using a ldb_parse_tree *\/ */
-/* /\* TODO: async *\/ */
 /* static int map_search_bytree(struct ldb_module *module, struct ldb_request 
*req) */
 /* { */
 /*     const struct ldb_dn *base = req->op.search.base; */
@@ -1905,7 +1951,7 @@
                map_oom(module);
                goto failed;
        }
-       local->dn = msg->dn;    /* TODO: reference? */
+       local->dn = msg->dn;
 
        /* prepare the remote message */
        remote = ldb_msg_new(ac->remote_req);
@@ -2062,7 +2108,7 @@
                map_oom(module);
                goto failed;
        }
-       local->dn = msg->dn;    /* TODO: reference? */
+       local->dn = msg->dn;
 
        /* prepare the remote message */
        remote = ldb_msg_new(ac->remote_req);
@@ -2329,7 +2375,7 @@
                return ldb_next_request(module, req);
 
        /* no mapping requested, skip to next module */
-       /* TODO: both? either? neither? what to doin each case? */
+       /* TODO: both? either? neither? what to do in each case? */
        if (!check_dn_local(module, req->op.rename.olddn) ||
            !check_dn_local(module, req->op.rename.newdn))
                return ldb_next_request(module, req);

Reply via email to