return SLAPD_DISCONNECT;
}
- op->ora_e = (Entry *) ch_calloc( 1, sizeof(Entry) );
+ op->ora_e = entry_alloc();
rs->sr_err = dnPrettyNormal( NULL, &dn, &op->o_req_dn, &op->o_req_ndn,
op->o_tmpmemctx );
op->o_bd = frontendDB;
rc = frontendDB->be_add( op, rs );
+
+#ifdef LDAP_X_TXN
+ if ( rc == LDAP_X_TXN_SPECIFY_OKAY ) {
+ /* skip cleanup */
+ return rc;
+ } else
+#endif
if ( rc == 0 ) {
if ( op->ora_e != NULL && op->o_private != NULL ) {
BackendDB *bd = op->o_bd;
if ( op->o_bd->be_add ) {
/* do the update here */
int repl_user = be_isupdate( op );
-#ifndef SLAPD_MULTIMASTER
- if ( !SLAP_SHADOW(op->o_bd) || repl_user )
-#endif /* ! SLAPD_MULTIMASTER */
- {
+ if ( !SLAP_SINGLE_SHADOW(op->o_bd) || repl_user ) {
int update = !BER_BVISEMPTY( &op->o_bd->be_update_ndn );
slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
send_ldap_result( op, rs );
goto done;
}
- }
-#ifdef SLAPD_MULTIMASTER
- if ( !repl_user )
-#endif /* SLAPD_MULTIMASTER */
- {
cb.sc_next = op->o_callback;
op->o_callback = &cb;
}
+
rc = op->o_bd->be_add( op, rs );
if ( rc == LDAP_SUCCESS ) {
/* NOTE: be_entry_release_w() is
op->o_private = op->o_bd;
}
-#ifndef SLAPD_MULTIMASTER
} else {
BerVarray defref = NULL;
LDAP_UNWILLING_TO_PERFORM,
"shadow context; no update referral" );
}
-#endif /* SLAPD_MULTIMASTER */
}
} else {
Debug( LDAP_DEBUG_ARGS, "do_add: no backend support\n", 0, 0, 0 );
}
}
- attr = ch_calloc( 1, sizeof(Attribute) );
-
- /* move ad to attr structure */
- attr->a_desc = mods->sml_desc;
+ attr = attr_alloc( mods->sml_desc );
/* move values to attr structure */
/* should check for duplicates */
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 );
}