/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2000-2013 The OpenLDAP Foundation.
+ * Copyright 2000-2017 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
ap->a_nvals,
e->e_id, SLAP_INDEX_ADD_OP );
} else {
+ int found = 0;
/* if this was only an add, we only need to index
* the added values.
*/
struct berval *vals;
if ( ml->sml_desc != ap->a_desc || !ml->sml_numvals )
continue;
+ found = 1;
switch( ml->sml_op ) {
case LDAP_MOD_ADD:
case LDAP_MOD_REPLACE:
if ( rc )
break;
}
+ /* This attr was affected by a modify of a subtype, so
+ * there was no direct match in the modlist. Just readd
+ * all of its values.
+ */
+ if ( !found ) {
+ rc = bdb_index_values( op, tid, ap->a_desc,
+ ap->a_nvals,
+ e->e_id, SLAP_INDEX_ADD_OP );
+ }
}
if ( rc != LDAP_SUCCESS ) {
Debug( LDAP_DEBUG_ANY,
int rc;
-#ifdef LDAP_X_TXN
- int settle = 0;
-#endif
-
Debug( LDAP_DEBUG_ARGS, LDAP_XSTRING(bdb_modify) ": %s\n",
op->o_req_dn.bv_val, 0, 0 );
#ifdef LDAP_X_TXN
- if( op->o_txnSpec ) {
- /* acquire connection lock */
- ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
- if( op->o_conn->c_txn == CONN_TXN_INACTIVE ) {
- rs->sr_text = "invalid transaction identifier";
- rs->sr_err = LDAP_X_TXN_ID_INVALID;
- goto txnReturn;
- } else if( op->o_conn->c_txn == CONN_TXN_SETTLE ) {
- settle=1;
- goto txnReturn;
- }
-
- if( op->o_conn->c_txn_backend == NULL ) {
- op->o_conn->c_txn_backend = op->o_bd;
-
- } else if( op->o_conn->c_txn_backend != op->o_bd ) {
- rs->sr_text = "transaction cannot span multiple database contexts";
- rs->sr_err = LDAP_AFFECTS_MULTIPLE_DSAS;
- goto txnReturn;
- }
-
- /* insert operation into transaction */
-
- rs->sr_text = "transaction specified";
- rs->sr_err = LDAP_X_TXN_SPECIFY_OKAY;
-
-txnReturn:
- /* release connection lock */
- ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
-
- if( !settle ) {
- send_ldap_result( op, rs );
- return rs->sr_err;
- }
- }
+ if( op->o_txnSpec && txn_preop( op, rs ))
+ return rs->sr_err;
#endif
ctrls[num_ctrls] = NULL;
}
/* begin transaction */
- rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id,
- bdb->bi_db_opflags );
+ {
+ int tflags = bdb->bi_db_opflags;
+ if ( get_lazyCommit( op ))
+ tflags |= DB_TXN_NOSYNC;
+ rs->sr_err = TXN_BEGIN( bdb->bi_dbenv, NULL, <id, tflags );
+ }
rs->sr_text = NULL;
if( rs->sr_err != 0 ) {
Debug( LDAP_DEBUG_TRACE,