Browse Source

[156758] bak2db loses index configuration when the overriden conf has some changes.
Multi-value'ed attribute diff was not implemented; Added the implementation.

Noriko Hosoi 20 years ago
parent
commit
cfba48b776
1 changed files with 29 additions and 5 deletions
  1. 29 5
      ldap/servers/slapd/entry.c

+ 29 - 5
ldap/servers/slapd/entry.c

@@ -2909,13 +2909,12 @@ slapi_entry_diff(Slapi_Mods *smods, Slapi_Entry *e1, Slapi_Entry *e2, int diff_c
                 if (0 != slapi_attr_value_find(e2_attr,
                                                slapi_value_get_berval(e1_val)))
                 {
-                    /* attr-value e1_val not found in e2_attr; replace it */
-                    /* XXX: does not support multi-value here */
+                    /* attr-value e1_val not found in e2_attr; add it */
                     LDAPDebug(LDAP_DEBUG_TRACE,
                         "slapi_entry_diff: attr-val of %s is not in e2; "
-                        "replace it\n",
+                        "add it\n",
                         e1_attr_name, 0, 0);
-                    slapi_mods_add(smods, LDAP_MOD_REPLACE, e1_attr_name,
+                    slapi_mods_add(smods, LDAP_MOD_ADD, e1_attr_name,
                                    e1_val->bv.bv_len, e1_val->bv.bv_val);
                 }
             }
@@ -2931,6 +2930,7 @@ slapi_entry_diff(Slapi_Mods *smods, Slapi_Entry *e1, Slapi_Entry *e2, int diff_c
                                       attr_get_present_values(e1_attr));
         }
     }
+    /* if the attribute is multi-valued, the untouched values should be put */
 
     for (slapi_entry_first_attr(e2, &e2_attr); e2_attr;
          slapi_entry_next_attr(e2, e2_attr, &e2_attr)) {
@@ -2941,7 +2941,31 @@ slapi_entry_diff(Slapi_Mods *smods, Slapi_Entry *e1, Slapi_Entry *e2, int diff_c
 
         slapi_attr_get_type(e2_attr, &e2_attr_name);
         rval = slapi_entry_attr_find(e1, e2_attr_name, &e1_attr);
-        if (0 != rval)
+        if (0 == rval)
+        {
+            int i;
+            Slapi_Value *e2_val;
+            /* attr e2_attr_names is shared with e1 */
+            /* XXX: not very efficient.
+             *      needs to be rewritten for the schema w/ lots of attributes
+             */
+            for (i = slapi_attr_first_value(e2_attr, &e2_val); i != -1;
+                 i = slapi_attr_next_value(e2_attr, i, &e2_val))
+            {
+                if (0 != slapi_attr_value_find(e1_attr,
+                                               slapi_value_get_berval(e2_val)))
+                {
+                    /* attr-value e2_val not found in e1_attr; delete it */
+                    LDAPDebug(LDAP_DEBUG_TRACE,
+                        "slapi_entry_diff: attr-val of %s is not in e1; "
+                        "delete it\n",
+                        e2_attr_name, 0, 0);
+                    slapi_mods_add(smods, LDAP_MOD_DELETE, e2_attr_name,
+                                   e2_val->bv.bv_len, e2_val->bv.bv_val);
+                }
+            }
+        }
+        else
         {
             /* attr e2_attr_names not in e1 */
             LDAPDebug(LDAP_DEBUG_TRACE,