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);
