/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2008 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Modifications *modlist = op->ora_modlist;
Modifications **modtail = &modlist;
int rc = 0;
- BackendDB *op_be;
+ BackendDB *op_be, *bd = op->o_bd;
char textbuf[ SLAP_TEXT_BUFLEN ];
size_t textlen = sizeof( textbuf );
*/
op->o_bd = select_backend( &op->ora_e->e_nname, manageDSAit, 1 );
if ( op->o_bd == NULL ) {
+ op->o_bd = bd;
rs->sr_ref = referral_rewrite( default_referral,
NULL, &op->ora_e->e_name, LDAP_SCOPE_DEFAULT );
if ( !rs->sr_ref ) rs->sr_ref = default_referral;
if ( rs->sr_ref ) {
rs->sr_err = LDAP_REFERRAL;
- op->o_bd = frontendDB;
send_ldap_result( op, rs );
- op->o_bd = NULL;
if ( rs->sr_ref != default_referral ) {
ber_bvarray_free( rs->sr_ref );
}
- /* check for duplicate values */
+ /* check for unmodifiable attributes */
rs->sr_err = slap_mods_no_repl_user_mod_check( op,
modlist, &rs->sr_text, textbuf, textlen );
if ( rs->sr_err != LDAP_SUCCESS ) {
goto done;
}
+#if 0 /* This is a no-op since *modtail is NULL */
rs->sr_err = slap_mods2entry( *modtail, &op->ora_e,
0, 0, &rs->sr_text, textbuf, textlen );
if ( rs->sr_err != LDAP_SUCCESS ) {
send_ldap_result( op, rs );
goto done;
}
+#endif
}
#ifdef SLAPD_MULTIMASTER
}
done:;
+ op->o_bd = bd;
return rc;
}
attr->a_vals = ch_realloc( attr->a_vals,
sizeof( struct berval ) * (i+j) );
- /* should check for duplicates */
+ /* checked for duplicates in slap_mods_check */
if ( dup ) {
for ( j = 0; mods->sml_values[j].bv_val; j++ ) {
#endif
}
+#if 0 /* checked for duplicates in slap_mods_check */
if( mods->sml_values[1].bv_val != NULL ) {
/* check for duplicates */
int i, j, rc, match;
}
}
}
+#endif
attr = ch_calloc( 1, sizeof(Attribute) );
attr->a_desc = mods->sml_desc;
/* move values to attr structure */
- /* should check for duplicates */
if ( dup ) {
int i;
for ( i = 0; mods->sml_values[i].bv_val; i++ ) /* EMPTY */;
if ( SLAP_LASTMOD( op->o_bd ) ) {
char *ptr;
+ int gotcsn = 0;
timestamp.bv_val = timebuf;
+
+ a = attr_find( op->ora_e->e_attrs, slap_schema.si_ad_entryCSN );
+ if ( a ) {
+ gotcsn = 1;
+ csn = a->a_vals[0];
+ }
if ( BER_BVISEMPTY( &op->o_csn )) {
- if ( SLAP_SHADOW( op->o_bd ))
- manage_ctxcsn = 0;
- csn.bv_val = csnbuf;
- csn.bv_len = sizeof(csnbuf);
- slap_get_csn( op, &csn, manage_ctxcsn );
+ if ( !gotcsn ) {
+ csn.bv_val = csnbuf;
+ csn.bv_len = sizeof(csnbuf);
+ slap_get_csn( op, &csn, manage_ctxcsn );
+ } else {
+ if ( manage_ctxcsn )
+ slap_queue_csn( op, &csn );
+ }
} else {
csn = op->o_csn;
}
slap_schema.si_ad_createTimestamp, ×tamp, NULL );
}
- a = attr_find( op->ora_e->e_attrs,
- slap_schema.si_ad_entryCSN );
- if ( !a ) {
+ if ( !gotcsn ) {
attr_merge_one( op->ora_e,
slap_schema.si_ad_entryCSN, &csn, NULL );
}