if it was provided. Always check and graduate, regardless of shadow status.
if ( SLAP_LASTMOD( op->o_bd ) ) {
char *ptr;
timestamp.bv_val = timebuf;
+ int gotcsn = 0;
+
+ 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 );
}
return_results:
send_ldap_result( op, rs );
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
+ slap_graduate_commit_csn( op );
if( ltid != NULL ) {
TXN_ABORT( ltid );
op->o_req_dn.bv_val, 0, 0 );
/* allocate CSN */
- if ( !SLAP_SHADOW( op->o_bd )) {
+ if ( BER_BVISEMPTY( &op->o_csn )) {
struct berval csn;
char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
op->o_private = NULL;
send_ldap_result( op, rs );
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
+ slap_graduate_commit_csn( op );
if( preread_ctrl != NULL ) {
slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );
ctrls[num_ctrls] = NULL;
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_mods_opattrs( op, &op->orm_modlist, 1 );
+ slap_mods_opattrs( op, &op->orm_modlist, 1 );
if( 0 ) {
retry: /* transaction retry */
attrs_free( dummy.e_attrs );
}
send_ldap_result( op, rs );
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
if( rs->sr_err == LDAP_SUCCESS && bdb->bi_txn_cp ) {
TXN_CHECKPOINT( bdb->bi_dbenv,
}
done:
+ slap_graduate_commit_csn( op );
+
if( ltid != NULL ) {
TXN_ABORT( ltid );
}
op->o_req_dn.bv_val,op->oq_modrdn.rs_newrdn.bv_val,
op->oq_modrdn.rs_newSup ? op->oq_modrdn.rs_newSup->bv_val : "NULL" );
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_mods_opattrs( op, &op->orr_modlist, 1 );
+ slap_mods_opattrs( op, &op->orr_modlist, 1 );
if( 0 ) {
retry: /* transaction retry */
}
done:
+ slap_graduate_commit_csn( op );
+
if( new_dn.bv_val != NULL ) free( new_dn.bv_val );
if( new_ndn.bv_val != NULL ) free( new_ndn.bv_val );
ldap_pvt_thread_rdwr_wlock(&li->li_giant_rwlock);
/* allocate CSN */
- if ( !SLAP_SHADOW( op->o_bd )) {
+ if ( BER_BVISEMPTY( &op->o_csn )) {
struct berval csn;
char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
send_ldap_result( op, rs );
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
+ slap_graduate_commit_csn( op );
return rc;
}
Debug(LDAP_DEBUG_ARGS, "ldbm_back_modify:\n", 0, 0, 0);
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_mods_opattrs( op, &op->orm_modlist, 1 );
+ slap_mods_opattrs( op, &op->orm_modlist, 1 );
/* grab giant lock for writing */
ldap_pvt_thread_rdwr_wlock(&li->li_giant_rwlock);
ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
send_ldap_result( op, rs );
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
+ slap_graduate_commit_csn( op );
rs->sr_text = NULL;
return rs->sr_err;
( op->oq_modrdn.rs_newSup && op->oq_modrdn.rs_newSup->bv_len )
? op->oq_modrdn.rs_newSup->bv_val : "NULL", 0 );
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_mods_opattrs( op, &op->orr_modlist, 1 );
+ slap_mods_opattrs( op, &op->orr_modlist, 1 );
/* grab giant lock for writing */
ldap_pvt_thread_rdwr_wlock(&li->li_giant_rwlock);
cache_entry_commit( e );
return_results:
+ slap_graduate_commit_csn( op );
if( new_dn.bv_val != NULL ) free( new_dn.bv_val );
if( new_ndn.bv_val != NULL ) free( new_ndn.bv_val );
if( old_ndn.bv_val != NULL ) free( old_ndn.bv_val );
send_res:
send_ldap_result(op, rs);
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
+ slap_graduate_commit_csn( op );
return 0;
}
Entry * entry = NULL;
int spew_res;
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_mods_opattrs( op, &op->orm_modlist, 1 );
+ slap_mods_opattrs( op, &op->orm_modlist, 1 );
ldap_pvt_thread_mutex_lock(&ni->li_mutex);
dn2path(&op->o_req_ndn, &op->o_bd->be_nsuffix[0], &ni->li_base_path,
rs->sr_text = NULL;
ldap_pvt_thread_mutex_unlock(&ni->li_mutex);
send_ldap_result(op, rs);
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
+ slap_graduate_commit_csn( op );
return 0;
}
struct berval path = BER_BVNULL;
int res = 0;
- if ( !SLAP_SHADOW( op->o_bd )) {
+ if ( BER_BVISEMPTY( &op->o_csn )) {
struct berval csn;
char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
SLAP_FREE(path.bv_val);
ldap_pvt_thread_mutex_unlock(&ni->li_mutex);
send_ldap_result(op, rs);
- if ( !SLAP_SHADOW( op->o_bd ))
- slap_graduate_commit_csn( op );
+ slap_graduate_commit_csn( op );
return 0;
}
Entry * entry = NULL;
int res;
+ slap_mods_opattrs( op, &op->orr_modlist, 1 );
+
ldap_pvt_thread_mutex_lock( &ni->li_mutex );
ldap_pvt_thread_mutex_lock( &entry2str_mutex );
entry = (Entry *) get_entry( op, &ni->li_base_path );
ldap_pvt_thread_mutex_unlock( &ni->li_mutex );
ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
send_ldap_result( op, rs );
+ slap_graduate_commit_csn( op );
return 0;
}
#endif /* SLAP_ACL_HONOR_DISCLOSE */
send_ldap_result( op, rs );
+ slap_graduate_commit_csn( op );
if ( !BER_BVISNULL( &realdn )
&& realdn.bv_val != op->ora_e->e_name.bv_val )
#endif /* SLAP_ACL_HONOR_DISCLOSE */
send_ldap_result( op, rs );
+ slap_graduate_commit_csn( op );
if ( !BER_BVISNULL( &bsi.bsi_base_id.eid_ndn ) ) {
(void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 );
assert( op->orr_modlist != NULL );
+ slap_mods_opattrs( op, &op->orr_modlist, 1 );
+
oc = backsql_id2oc( bi, e_id.eid_oc_id );
rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, op->orr_modlist );
slap_graduate_commit_csn( op );
}
send_ldap_result( op, rs );
+ slap_graduate_commit_csn( op );
if ( !BER_BVISNULL( &realnew_dn ) && realnew_dn.bv_val != new_dn.bv_val ) {
ch_free( realnew_dn.bv_val );
#endif
}
-/* modify only calls this for non-replicas. modrdn always calls.
+/* Called for all modify and modrdn ops. If the current op was replicated
+ * from elsewhere, all of the attrs should already be present.
*/
void slap_mods_opattrs(
Operation *op,
char timebuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
Modifications *mod, **modtail, *modlast;
+ int gotcsn = 0, gotmname = 0, gotmtime = 0;
if ( SLAP_LASTMOD( op->o_bd ) ) {
char *ptr;
timestamp.bv_val = timebuf;
+ for ( modtail = modsp; *modtail; modtail = &(*modtail)->sml_next ) {
+ if ( (*modtail)->sml_op != LDAP_MOD_ADD &&
+ (*modtail)->sml_op != LDAP_MOD_REPLACE ) continue;
+ if ( (*modtail)->sml_desc == slap_schema.si_ad_entryCSN ) {
+ csn = (*modtail)->sml_values[0];
+ gotcsn = 1;
+ } else
+ if ( (*modtail)->sml_desc == slap_schema.si_ad_modifiersName ) {
+ gotmname = 1;
+ } else
+ if ( (*modtail)->sml_desc == slap_schema.si_ad_modifyTimestamp ) {
+ gotmtime = 1;
+ }
+ }
if ( BER_BVISEMPTY( &op->o_csn )) {
- 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;
}
nname = op->o_ndn;
}
- for ( modtail = modsp; *modtail; modtail = &(*modtail)->sml_next )
- ;
-
- mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
- mod->sml_op = LDAP_MOD_REPLACE;
- mod->sml_flags = SLAP_MOD_INTERNAL;
- mod->sml_next = NULL;
- BER_BVZERO( &mod->sml_type );
- mod->sml_desc = slap_schema.si_ad_entryCSN;
- mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
- ber_dupbv( &mod->sml_values[0], &csn );
- BER_BVZERO( &mod->sml_values[1] );
- assert( !BER_BVISNULL( &mod->sml_values[0] ) );
- mod->sml_nvalues = NULL;
- *modtail = mod;
- modlast = mod;
- modtail = &mod->sml_next;
-
- if ( get_manageDIT( op ) ) {
- for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) {
- if ( mod->sml_desc == slap_schema.si_ad_modifiersName ) {
- break;
- }
- }
+ if ( !gotcsn ) {
+ mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
+ mod->sml_op = LDAP_MOD_REPLACE;
+ mod->sml_flags = SLAP_MOD_INTERNAL;
+ mod->sml_next = NULL;
+ BER_BVZERO( &mod->sml_type );
+ mod->sml_desc = slap_schema.si_ad_entryCSN;
+ mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
+ ber_dupbv( &mod->sml_values[0], &csn );
+ BER_BVZERO( &mod->sml_values[1] );
+ assert( !BER_BVISNULL( &mod->sml_values[0] ) );
+ mod->sml_nvalues = NULL;
+ *modtail = mod;
+ modlast = mod;
+ modtail = &mod->sml_next;
}
- if ( mod->sml_desc != slap_schema.si_ad_modifiersName ) {
+ if ( !gotmname ) {
mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
mod->sml_op = LDAP_MOD_REPLACE;
mod->sml_flags = SLAP_MOD_INTERNAL;
modtail = &mod->sml_next;
}
- if ( get_manageDIT( op ) ) {
- for ( mod = *modsp; mod != modlast; mod = mod->sml_next ) {
- if ( mod->sml_desc == slap_schema.si_ad_modifyTimestamp ) {
- break;
- }
- }
- }
-
- if ( mod->sml_desc != slap_schema.si_ad_modifyTimestamp ) {
+ if ( !gotmtime ) {
mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
mod->sml_op = LDAP_MOD_REPLACE;
mod->sml_flags = SLAP_MOD_INTERNAL;
done:
-#if 0
- /* should be done by backend */
- if ( rs->sr_err == LDAP_SUCCESS && !repl_user ) {
- slap_mods_opattrs( op, &op->orr_modlist, 1 );
- }
-#endif
-
/* LDAP v2 supporting correct attribute handling. */
if ( rs->sr_err != LDAP_SUCCESS && op->orr_modlist != NULL ) {
Modifications *tmp;