summaryrefslogtreecommitdiffstats
path: root/ldap
diff options
context:
space:
mode:
authorEndi S. Dewata <endisd@gmail.com>2010-01-12 14:43:08 -0600
committerRich Megginson <rmeggins@redhat.com>2010-01-13 09:18:45 -0700
commit9f88491132cb2d1c5f11fd5475e1a6826e1dc7ee (patch)
tree60d176e017ee8d6a9a2197e5a94029fcdcf33b65 /ldap
parent51fab34954121f128f5b2424fc2b6dfd34054193 (diff)
downloadds-bug509201andV3quotes.tar.gz
ds-bug509201andV3quotes.tar.xz
ds-bug509201andV3quotes.zip
Bug 553027 - Support for nsUniqueId and alias in Retro Changelog.bug509201andV3quotes
This patch adds support for storing the target's nsUniqueId in change log record and renaming any additional attribute using an alias.
Diffstat (limited to 'ldap')
-rw-r--r--ldap/servers/plugins/retrocl/retrocl.c48
-rw-r--r--ldap/servers/plugins/retrocl/retrocl.h2
-rw-r--r--ldap/servers/plugins/retrocl/retrocl_po.c54
3 files changed, 93 insertions, 11 deletions
diff --git a/ldap/servers/plugins/retrocl/retrocl.c b/ldap/servers/plugins/retrocl/retrocl.c
index 836361a0..c586e378 100644
--- a/ldap/servers/plugins/retrocl/retrocl.c
+++ b/ldap/servers/plugins/retrocl/retrocl.c
@@ -79,6 +79,7 @@ Slapi_Backend *retrocl_be_changelog = NULL;
PRLock *retrocl_internal_lock = NULL;
int retrocl_nattributes = 0;
char **retrocl_attributes = NULL;
+char **retrocl_aliases = NULL;
/* ----------------------------- Retrocl Plugin */
@@ -302,6 +303,7 @@ static int retrocl_start (Slapi_PBlock *pb)
static int retrocl_started = 0;
int rc = 0;
Slapi_Entry *e = NULL;
+ char **values = NULL;
if (retrocl_started) {
return rc;
@@ -323,12 +325,49 @@ static int retrocl_start (Slapi_PBlock *pb)
return -1;
}
- retrocl_attributes = slapi_entry_attr_get_charray(e, "nsslapd-attribute");
- if (retrocl_attributes != NULL) {
+ values = slapi_entry_attr_get_charray(e, "nsslapd-attribute");
+ if (values != NULL) {
+ int n = 0;
+ int i = 0;
+
+ slapi_log_error(SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, "nsslapd-attribute:\n");
+
+ for (n=0; values && values[n]; n++) {
+ slapi_log_error(SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, " - %s\n", values[n]);
+ }
+
+ retrocl_nattributes = n;
+
+ retrocl_attributes = (char **)slapi_ch_calloc(n, sizeof(char *));
+ retrocl_aliases = (char **)slapi_ch_calloc(n, sizeof(char *));
+
slapi_log_error(SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, "Attributes:\n");
- for (retrocl_nattributes=0; retrocl_attributes && retrocl_attributes[retrocl_nattributes]; retrocl_nattributes++) {
- slapi_log_error(SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, " - %s\n", retrocl_attributes[retrocl_nattributes]);
+
+ for (i=0; i<n; i++) {
+ char *value = values[i];
+ size_t length = strlen(value);
+
+ char *pos = strchr(value, ':');
+ if (pos == NULL) {
+ retrocl_attributes[i] = slapi_ch_strdup(value);
+ retrocl_aliases[i] = NULL;
+
+ slapi_log_error(SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, " - %s\n",
+ retrocl_attributes[i]);
+
+ } else {
+ retrocl_attributes[i] = slapi_ch_malloc(pos-value+1);
+ strncpy(retrocl_attributes[i], value, pos-value);
+
+ retrocl_aliases[i] = slapi_ch_malloc(value+length-pos);
+ strcpy(retrocl_aliases[i], pos+1);
+
+ slapi_log_error(SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, " - %s [%s]\n",
+ retrocl_attributes[i], retrocl_aliases[i]);
+ }
}
+
+ slapi_ch_array_free(values);
}
retrocl_started = 1;
@@ -352,6 +391,7 @@ static int retrocl_stop (Slapi_PBlock *pb)
int rc = 0;
slapi_ch_array_free(retrocl_attributes);
+ slapi_ch_array_free(retrocl_aliases);
retrocl_stop_trimming();
retrocl_be_changelog = NULL;
diff --git a/ldap/servers/plugins/retrocl/retrocl.h b/ldap/servers/plugins/retrocl/retrocl.h
index 5c0cad1c..c4354d47 100644
--- a/ldap/servers/plugins/retrocl/retrocl.h
+++ b/ldap/servers/plugins/retrocl/retrocl.h
@@ -115,6 +115,7 @@ extern void* g_plg_identity [PLUGIN_MAX];
extern Slapi_Backend *retrocl_be_changelog;
extern int retrocl_nattributes;
extern char** retrocl_attributes;
+extern char** retrocl_aliases;
extern const char *attr_changenumber;
extern const char *attr_targetdn;
@@ -125,6 +126,7 @@ extern const char *attr_deleteoldrdn;
extern const char *attr_changes;
extern const char *attr_changetime;
extern const char *attr_objectclass;
+extern const char *attr_nsuniqueid;
extern const char *attr_isreplicated;
extern PRLock *retrocl_internal_lock;
diff --git a/ldap/servers/plugins/retrocl/retrocl_po.c b/ldap/servers/plugins/retrocl/retrocl_po.c
index 93c67769..0e537eee 100644
--- a/ldap/servers/plugins/retrocl/retrocl_po.c
+++ b/ldap/servers/plugins/retrocl/retrocl_po.c
@@ -64,6 +64,7 @@ const char *attr_changes = "changes";
const char *attr_newsuperior = "newsuperior";
const char *attr_changetime = "changetime";
const char *attr_objectclass = "objectclass";
+const char *attr_nsuniqueid = "nsuniqueid";
const char *attr_isreplicated = "isreplicated";
/*
@@ -176,6 +177,7 @@ write_replog_db(
Slapi_PBlock *newPb = NULL;
changeNumber changenum;
int i;
+ int extensibleObject = 0;
PR_Lock(retrocl_internal_lock);
changenum = retrocl_assign_changenumber();
@@ -207,24 +209,51 @@ write_replog_db(
val.bv_len = 14;
slapi_entry_add_values( e, "objectclass", vals );
- val.bv_val = "extensibleObject";
- val.bv_len = 16;
- slapi_entry_add_values( e, "objectclass", vals );
-
for ( i=0; i<retrocl_nattributes; i++ ) {
char* attributeName = retrocl_attributes[i];
+ char* attributeAlias = retrocl_aliases[i];
+
+ if ( attributeAlias == NULL ) {
+ attributeAlias = attributeName;
+ }
+
+ if ( strcasecmp( attributeName, attr_nsuniqueid ) == 0 ) {
+ Slapi_Entry *entry = NULL;
+ char *uniqueId = NULL;
+
+ slapi_pblock_get( pb, SLAPI_ENTRY_POST_OP, &entry );
+ if ( entry == NULL ) {
+ slapi_pblock_get( pb, SLAPI_ENTRY_PRE_OP, &entry );
+ }
+
+ uniqueId = slapi_entry_get_uniqueid( entry );
- if ( strcasecmp( attributeName, attr_isreplicated ) == 0 ) {
+ slapi_log_error( SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME,
+ "write_replog_db: add %s: \"%s\"\n", attributeAlias, uniqueId );
+
+ val.bv_val = uniqueId;
+ val.bv_len = strlen( uniqueId );
+
+ slapi_entry_add_values( e, attributeAlias, vals );
+
+ extensibleObject = 1;
+
+ } else if ( strcasecmp( attributeName, attr_isreplicated ) == 0 ) {
int isReplicated = 0;
char *attributeValue = NULL;
slapi_pblock_get( pb, SLAPI_IS_REPLICATED_OPERATION, &isReplicated );
attributeValue = isReplicated ? "TRUE" : "FALSE";
+ slapi_log_error( SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME,
+ "write_replog_db: add %s: \"%s\"\n", attributeAlias, attributeValue );
+
val.bv_val = attributeValue;
val.bv_len = strlen( attributeValue );
- slapi_entry_add_values( e, attributeName, vals );
+ slapi_entry_add_values( e, attributeAlias, vals );
+
+ extensibleObject = 1;
} else {
Slapi_Entry *entry = NULL;
@@ -250,11 +279,22 @@ write_replog_db(
if ( valueSet == NULL ) continue;
- slapi_entry_add_valueset( e, attributeName, valueSet );
+ slapi_log_error( SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME,
+ "write_replog_db: add %s\n", attributeAlias );
+
+ slapi_entry_add_valueset( e, attributeAlias, valueSet );
slapi_vattr_values_free( &valueSet, &actual_type_name, buffer_flags );
+
+ extensibleObject = 1;
}
}
+ if ( extensibleObject ) {
+ val.bv_val = "extensibleObject";
+ val.bv_len = 16;
+ slapi_entry_add_values( e, "objectclass", vals );
+ }
+
/* Set the changeNumber attribute */
sprintf( chnobuf, "%lu", changenum );
val.bv_val = chnobuf;