r6833: split out the routine that calculates the diff between two ldb messages from...
authorAndrew Tridgell <tridge@samba.org>
Mon, 16 May 2005 22:31:45 +0000 (22:31 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:16:49 +0000 (13:16 -0500)
so other progs can use it.

source/lib/ldb/common/ldb_msg.c
source/lib/ldb/include/ldb.h
source/lib/ldb/tools/ldbedit.c

index 4c903cf9368dc07f809748e3cdf47616bafddd12..7a6dea049ae15fc1031bb8eba6c0d7d3a82fb084 100644 (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;
+}
index f748bb6b42e3dce18dcf1d83f5919393a7c2dd9e..18d974cf428e8df454660a377354d71570ec8bd8 100644 (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);
 
 /*
index 4c41b6b19a64d47e7181dac9d99d2470e6b978f1..851eaeebdff90bb5570a051d2bbb47eec2f52ead 100644 (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;
 }
 
 /*