1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

r6833: split out the routine that calculates the diff between two ldb messages from ldbedit,

so other progs can use it.
This commit is contained in:
Andrew Tridgell 2005-05-16 22:31:45 +00:00 committed by Gerald (Jerry) Carter
parent aac86583a9
commit fa4f33558a
3 changed files with 63 additions and 43 deletions

View File

@ -456,3 +456,58 @@ struct ldb_message *ldb_msg_canonicalize(struct ldb_context *ldb,
return msg2;
}
/*
return a ldb_message representing the differences between msg1 and msg2. If you
then use this in a ldb_modify() call it can be used to save edits to a message
*/
struct ldb_message *ldb_msg_diff(struct ldb_context *ldb,
struct ldb_message *msg1,
struct ldb_message *msg2)
{
struct ldb_message *mod;
struct ldb_message_element *el;
unsigned int i;
mod = ldb_msg_new(ldb);
mod->dn = msg1->dn;
mod->num_elements = 0;
mod->elements = NULL;
msg2 = ldb_msg_canonicalize(ldb, msg2);
if (msg2 == NULL) {
return NULL;
}
/* look in msg2 to find elements that need to be added
or modified */
for (i=0;i<msg2->num_elements;i++) {
el = ldb_msg_find_element(msg1, msg2->elements[i].name);
if (el && ldb_msg_element_compare(el, &msg2->elements[i]) == 0) {
continue;
}
if (ldb_msg_add(ldb, mod,
&msg2->elements[i],
el?LDB_FLAG_MOD_REPLACE:LDB_FLAG_MOD_ADD) != 0) {
return NULL;
}
}
/* look in msg1 to find elements that need to be deleted */
for (i=0;i<msg1->num_elements;i++) {
el = ldb_msg_find_element(msg2, msg1->elements[i].name);
if (!el) {
if (ldb_msg_add_empty(ldb, mod,
msg1->elements[i].name,
LDB_FLAG_MOD_DELETE) != 0) {
return NULL;
}
}
}
return mod;
}

View File

@ -295,6 +295,10 @@ struct ldb_message *ldb_msg_canonicalize(struct ldb_context *ldb,
const struct ldb_message *msg);
struct ldb_message *ldb_msg_diff(struct ldb_context *ldb,
struct ldb_message *msg1,
struct ldb_message *msg2);
struct ldb_val ldb_val_dup(void *mem_ctx, const struct ldb_val *v);
/*

View File

@ -65,51 +65,12 @@ static int modify_record(struct ldb_context *ldb,
struct ldb_message *msg2)
{
struct ldb_message *mod;
struct ldb_message_element *el;
unsigned int i;
int count = 0;
mod = ldb_msg_new(ldb);
mod->dn = msg1->dn;
mod->num_elements = 0;
mod->elements = NULL;
msg2 = ldb_msg_canonicalize(ldb, msg2);
if (msg2 == NULL) {
fprintf(stderr, "Failed to canonicalise msg2\n");
mod = ldb_msg_diff(ldb, msg1, msg2);
if (mod == NULL) {
fprintf(stderr, "Failed to calculate message differences\n");
return -1;
}
/* look in msg2 to find elements that need to be added
or modified */
for (i=0;i<msg2->num_elements;i++) {
el = ldb_msg_find_element(msg1, msg2->elements[i].name);
if (el && ldb_msg_element_compare(el, &msg2->elements[i]) == 0) {
continue;
}
if (ldb_msg_add(ldb, mod,
&msg2->elements[i],
el?LDB_FLAG_MOD_REPLACE:LDB_FLAG_MOD_ADD) != 0) {
return -1;
}
count++;
}
/* look in msg1 to find elements that need to be deleted */
for (i=0;i<msg1->num_elements;i++) {
el = ldb_msg_find_element(msg2, msg1->elements[i].name);
if (!el) {
if (ldb_msg_add_empty(ldb, mod,
msg1->elements[i].name,
LDB_FLAG_MOD_DELETE) != 0) {
return -1;
}
count++;
}
}
if (mod->num_elements == 0) {
return 0;
@ -125,7 +86,7 @@ static int modify_record(struct ldb_context *ldb,
ldif_write_msg(ldb, stdout, LDB_CHANGETYPE_MODIFY, mod);
}
return count;
return mod->num_elements;
}
/*