diff options
author | Endi S. Dewata <endisd@gmail.com> | 2010-01-12 14:43:08 -0600 |
---|---|---|
committer | Rich Megginson <rmeggins@redhat.com> | 2010-01-13 09:18:45 -0700 |
commit | 9f88491132cb2d1c5f11fd5475e1a6826e1dc7ee (patch) | |
tree | 60d176e017ee8d6a9a2197e5a94029fcdcf33b65 /ldap | |
parent | 51fab34954121f128f5b2424fc2b6dfd34054193 (diff) | |
download | ds-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.c | 48 | ||||
-rw-r--r-- | ldap/servers/plugins/retrocl/retrocl.h | 2 | ||||
-rw-r--r-- | ldap/servers/plugins/retrocl/retrocl_po.c | 54 |
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; |