summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/entry.c
diff options
context:
space:
mode:
authorNoriko Hosoi <nhosoi@redhat.com>2005-05-04 16:41:23 +0000
committerNoriko Hosoi <nhosoi@redhat.com>2005-05-04 16:41:23 +0000
commitcfba48b776f4aeb08b9f1681eb966eebce948a68 (patch)
tree78f2a96664fd3116855e474d04d0c68e0395ed93 /ldap/servers/slapd/entry.c
parent461363cea7bfd6c0e99040375768d5da66e6c44d (diff)
downloadds-cfba48b776f4aeb08b9f1681eb966eebce948a68.tar.gz
ds-cfba48b776f4aeb08b9f1681eb966eebce948a68.tar.xz
ds-cfba48b776f4aeb08b9f1681eb966eebce948a68.zip
[156758] bak2db loses index configuration when the overriden conf has some changes.
Multi-value'ed attribute diff was not implemented; Added the implementation.
Diffstat (limited to 'ldap/servers/slapd/entry.c')
-rw-r--r--ldap/servers/slapd/entry.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c
index 238cad28..f690e37e 100644
--- a/ldap/servers/slapd/entry.c
+++ b/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,