summaryrefslogtreecommitdiffstats
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
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.
-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;