+ ret = 0;
+
+ for (i = 0; i < mpret; i++) {
+ struct ldb_message *merged = ldb_map_message_incoming(module, attrs, newres[i]);
+ struct ldb_message **extrares = NULL;
+ int extraret;
+
+ /* Merge with additional data from local database */
+ extraret = ldb_next_search(module, merged->dn, LDB_SCOPE_BASE, "", NULL, &extrares);
+
+ if (extraret == -1) {
+ ldb_debug(module->ldb, LDB_DEBUG_ERROR, "Error searching for extra data!\n");
+ } else if (extraret > 1) {
+ ldb_debug(module->ldb, LDB_DEBUG_ERROR, "More then one result for extra data!\n");
+ talloc_free(newres);
+ return -1;
+ } else if (extraret == 0) {
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "No extra data found for remote DN");
+ }
+
+ if (extraret == 1) {
+ int j;
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Extra data found for remote DN");
+ for (j = 0; j < extrares[0]->num_elements; j++) {
+ ldb_msg_add(module->ldb, merged, &(extrares[0]->elements[j]), extrares[0]->elements[j].flags);
+ }
+
+ ldb_msg_add_string(module->ldb, merged, "extraMapped", "TRUE");
+ } else {
+ ldb_msg_add_string(module->ldb, merged, "extraMapped", "FALSE");
+ }
+
+ if (ldb_match_msg(module->ldb, merged, tree, base, scope)) {
+ (*res)[ret] = merged;
+ ret++;
+ } else {
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "Discarded merged message because it did not match");
+ }