#include "back-bdb2.h"
#include "proto-back-bdb2.h"
-
-static void add_lastmods(Operation *op, LDAPModList **ml);
-
-
-static void
-add_lastmods( Operation *op, LDAPModList **modlist )
-{
- char buf[22];
- struct berval bv;
- struct berval *bvals[2];
- LDAPModList **m;
- LDAPModList *tmp;
- struct tm *ltm;
- time_t currenttime;
-
- Debug( LDAP_DEBUG_TRACE, "add_lastmods\n", 0, 0, 0 );
-
- bvals[0] = &bv;
- bvals[1] = NULL;
-
- /* remove any attempts by the user to modify these attrs */
- for ( m = modlist; *m != NULL; m = &(*m)->ml_next ) {
- if ( oc_check_no_usermod_attr( (*m)->ml_type ) ) {
- Debug( LDAP_DEBUG_TRACE,
- "add_lastmods: found no user mod attr: %s\n",
- (*m)->ml_type, 0, 0 );
- tmp = *m;
- *m = (*m)->ml_next;
- free( tmp->ml_type );
- if ( tmp->ml_bvalues != NULL ) {
- ber_bvecfree( tmp->ml_bvalues );
- }
- free( tmp );
- if (!*m)
- break;
- }
- }
-
- if ( op->o_dn == NULL || op->o_dn[0] == '\0' ) {
- bv.bv_val = "NULLDN";
- bv.bv_len = strlen( bv.bv_val );
- } else {
- bv.bv_val = op->o_dn;
- bv.bv_len = strlen( bv.bv_val );
- }
- tmp = (LDAPModList *) ch_calloc( 1, sizeof(LDAPModList) );
- tmp->ml_type = ch_strdup( "modifiersname" );
- tmp->ml_op = LDAP_MOD_REPLACE;
- tmp->ml_bvalues = (struct berval **) ch_calloc(2, sizeof(struct berval *));
- tmp->ml_bvalues[0] = ber_bvdup( &bv );
- tmp->ml_next = *modlist;
- *modlist = tmp;
-
- currenttime = slap_get_time();
- ldap_pvt_thread_mutex_lock( &gmtime_mutex );
-#ifndef LDAP_LOCALTIME
- ltm = gmtime( ¤ttime );
- strftime( buf, sizeof(buf), "%Y%m%d%H%M%SZ", ltm );
-#else
- ltm = localtime( ¤ttime );
- strftime( buf, sizeof(buf), "%y%m%d%H%M%SZ", ltm );
-#endif
- ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
-
- bv.bv_val = buf;
- bv.bv_len = strlen( bv.bv_val );
- tmp = (LDAPModList *) ch_calloc( 1, sizeof(LDAPModList) );
- tmp->ml_type = ch_strdup( "modifytimestamp" );
- tmp->ml_op = LDAP_MOD_REPLACE;
- tmp->ml_bvalues = (struct berval **) ch_calloc(2, sizeof(struct berval *));
- tmp->ml_bvalues[0] = ber_bvdup( &bv );
- tmp->ml_next = *modlist;
- *modlist = tmp;
-
-}
-
int
bdb2i_back_modify_internal(
BackendDB *be,
a->a_vals[k - 1] = a->a_vals[k];
}
a->a_vals[k - 1] = NULL;
+
+ /* delete the entire attribute, if no values remain */
+ if ( a->a_vals[0] == NULL) {
+ Debug( LDAP_DEBUG_ARGS,
+ "removing entire attribute %s\n",
+ mod->mod_type, 0, 0 );
+ if ( attr_delete( &e->e_attrs, mod->mod_type ) ) {
+ return LDAP_NO_SUCH_ATTRIBUTE;
+ }
+ }
+
break;
}