struct ldb_message *msg, *module_msg;
struct ldb_result *res;
struct ldb_context *ldb = ldb_module_get_ctx(module);
- const char *attrs[] = { "partition", "replicateEntries", "modules", "ldapBackend", NULL };
+ const char *attrs[] = { "partition", "replicateEntries", "modules", "ldapBackend",
+ "partialReplica", NULL };
/* perform search for @PARTITION, looking for module, replicateEntries and ldapBackend */
ret = dsdb_module_search_dn(module, mem_ctx, &res,
ldb_dn_new(mem_ctx, ldb, DSDB_PARTITION_DN),
const char **modules;
int ret;
- (*partition) = talloc(mem_ctx, struct dsdb_partition);
+ (*partition) = talloc_zero(mem_ctx, struct dsdb_partition);
if (!*partition) {
return ldb_oom(ldb);
}
struct ldb_context *ldb = ldb_module_get_ctx(module);
struct ldb_message *msg;
struct ldb_message_element *partition_attributes;
+ struct ldb_message_element *partial_replicas;
TALLOC_CTX *mem_ctx;
if (!data) {
return ldb_oom(ldb);
}
- ret = partition_primary_sequence_number(module, mem_ctx, LDB_SEQ_HIGHEST_SEQ, &seq);
+ ret = partition_primary_sequence_number(module, mem_ctx, &seq, parent);
if (ret != LDB_SUCCESS) {
talloc_free(mem_ctx);
return ret;
data->metadata_seq = seq;
partition_attributes = ldb_msg_find_element(msg, "partition");
+ partial_replicas = ldb_msg_find_element(msg, "partialReplica");
for (i=0; partition_attributes && i < partition_attributes->num_values; i++) {
unsigned int j;
return ret;
}
+ /* see if it is a partial replica */
+ for (j=0; partial_replicas && j<partial_replicas->num_values; j++) {
+ struct ldb_dn *pa_dn = ldb_dn_from_ldb_val(mem_ctx, ldb, &partial_replicas->values[j]);
+ if (pa_dn != NULL && ldb_dn_compare(pa_dn, partition->ctrl->dn) == 0) {
+ partition->partial_replica = true;
+ }
+ talloc_free(pa_dn);
+ }
+
ret = add_partition_to_data(ldb, data, partition);
if (ret != LDB_SUCCESS) {
talloc_free(mem_ctx);
return LDB_ERR_UNWILLING_TO_PERFORM;
}
+ /* see if we are still up-to-date */
+ ret = partition_reload_if_required(module, data, req);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+
for (i=0; data->partitions && data->partitions[i]; i++) {
if (ldb_dn_compare(data->partitions[i]->ctrl->dn, dn) == 0) {
partition = data->partitions[i];
if (ret != LDB_SUCCESS) {
return ret;
}
+
+ if (ldb_request_get_control(req, DSDB_CONTROL_PARTIAL_REPLICA)) {
+ /* this new partition is a partial replica */
+ ret = ldb_msg_add_empty(mod_msg, "partialReplica", LDB_FLAG_MOD_ADD, NULL);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+ ret = ldb_msg_add_fmt(mod_msg, "partialReplica", "%s", ldb_dn_get_linearized(dn));
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+ }
/* Perform modify on @PARTITION record */
ret = ldb_build_mod_req(&mod_req, ldb, req, mod_msg, NULL, NULL,
return ldb_operr(ldb);
}
+ /* This loads metadata tdb. If it's missing, creates it */
+ ret = partition_metadata_init(module);
+ if (ret != LDB_SUCCESS) {
+ return ret;
+ }
+
return ldb_next_init(module);
}