return rc;
}
+
+void mdb_ad_unwind( struct mdb_info *mdb, int prev_ads )
+{
+ int i;
+
+ for (i=mdb->mi_numads; i>prev_ads; i--) {
+ mdb->mi_adxs[mdb->mi_ads[i]->ad_index] = 0;
+ mdb->mi_ads[i] = NULL;
+ }
+ mdb->mi_numads = i;
+}
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
Ecount ec;
MDB_val key, data;
- int rc;
+ int rc, prev_ads = mdb->mi_numads;
/* We only store rdns, and they go in the dn2id database. */
key.mv_size = sizeof(ID);
rc = mdb_entry_partsize( mdb, txn, e, &ec );
- if (rc)
- return LDAP_OTHER;
+ if (rc) {
+ rc = LDAP_OTHER;
+ goto fail;
+ }
flag |= MDB_RESERVE;
if (rc == MDB_SUCCESS) {
rc = mdb_entry_encode( op, e, &data, &ec );
if( rc != LDAP_SUCCESS )
- return rc;
+ goto fail;
}
if (rc) {
/* Was there a hole from slapadd? */
if ( rc != MDB_KEYEXIST )
rc = LDAP_OTHER;
}
+fail:
+ if (rc) {
+ mdb_ad_unwind( mdb, prev_ads );
+ }
return rc;
}
int mdb_ad_read( struct mdb_info *mdb, MDB_txn *txn );
int mdb_ad_get( struct mdb_info *mdb, MDB_txn *txn, AttributeDescription *ad );
+void mdb_ad_unwind( struct mdb_info *mdb, int prev_ads );
/*
* config.c