X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-mdb%2Fadd.c;h=4192a3cc79837d180e9f14b1810f146885699cbf;hb=5fcc9285fb8c549a5264921a2b61cfc40803d720;hp=652bb1009b52f8051083aa4324153d85fc000ca6;hpb=a05cbba77a94875ac00c207344d819513ff6499d;p=openldap diff --git a/servers/slapd/back-mdb/add.c b/servers/slapd/back-mdb/add.c index 652bb1009b..4192a3cc79 100644 --- a/servers/slapd/back-mdb/add.c +++ b/servers/slapd/back-mdb/add.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2011 The OpenLDAP Foundation. + * Copyright 2000-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,9 @@ mdb_add(Operation *op, SlapReply *rs ) AttributeDescription *children = slap_schema.si_ad_children; AttributeDescription *entry = slap_schema.si_ad_entry; MDB_txn *txn = NULL; - ID eid = NOID, pid = 0; + MDB_cursor *mc = NULL; + MDB_cursor *mcd; + ID eid, pid = 0; mdb_op_info opinfo = {{{ 0 }}}, *moi = &opinfo; int subentry; @@ -141,8 +143,18 @@ txnReturn: dnParent( &op->ora_e->e_nname, &pdn ); } + rs->sr_err = mdb_cursor_open( txn, mdb->mi_dn2id, &mcd ); + if( rs->sr_err != 0 ) { + Debug( LDAP_DEBUG_TRACE, + LDAP_XSTRING(mdb_add) ": mdb_cursor_open failed (%d)\n", + rs->sr_err, 0, 0 ); + rs->sr_err = LDAP_OTHER; + rs->sr_text = "internal error"; + goto return_results; + } + /* get entry or parent */ - rs->sr_err = mdb_dn2entry( op, txn, &op->ora_e->e_nname, &p, 1 ); + rs->sr_err = mdb_dn2entry( op, txn, mcd, &op->ora_e->e_nname, &p, 1 ); switch( rs->sr_err ) { case 0: rs->sr_err = LDAP_ALREADY_EXISTS; @@ -305,21 +317,30 @@ txnReturn: goto return_results;; } - if ( eid == NOID ) { - rs->sr_err = mdb_next_id( op->o_bd, txn, &eid ); - if( rs->sr_err != 0 ) { - Debug( LDAP_DEBUG_TRACE, - LDAP_XSTRING(mdb_add) ": next_id failed (%d)\n", - rs->sr_err, 0, 0 ); - rs->sr_err = LDAP_OTHER; - rs->sr_text = "internal error"; - goto return_results; - } - op->ora_e->e_id = eid; + rs->sr_err = mdb_cursor_open( txn, mdb->mi_id2entry, &mc ); + if( rs->sr_err != 0 ) { + Debug( LDAP_DEBUG_TRACE, + LDAP_XSTRING(mdb_add) ": mdb_cursor_open failed (%d)\n", + rs->sr_err, 0, 0 ); + rs->sr_err = LDAP_OTHER; + rs->sr_text = "internal error"; + goto return_results; + } + + rs->sr_err = mdb_next_id( op->o_bd, mc, &eid ); + if( rs->sr_err != 0 ) { + Debug( LDAP_DEBUG_TRACE, + LDAP_XSTRING(mdb_add) ": next_id failed (%d)\n", + rs->sr_err, 0, 0 ); + rs->sr_err = LDAP_OTHER; + rs->sr_text = "internal error"; + goto return_results; } + op->ora_e->e_id = eid; /* dn2id index */ - rs->sr_err = mdb_dn2id_add( op, txn, pid, op->ora_e ); + rs->sr_err = mdb_dn2id_add( op, mcd, mcd, pid, op->ora_e ); + mdb_cursor_close( mcd ); if ( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": dn2id_add failed: %s (%d)\n", @@ -347,7 +368,7 @@ txnReturn: } /* id2entry index */ - rs->sr_err = mdb_id2entry_add( op, txn, op->ora_e ); + rs->sr_err = mdb_id2entry_add( op, txn, mc, op->ora_e ); if ( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": id2entry_add failed\n", @@ -387,7 +408,9 @@ txnReturn: goto return_results; } - if (( rs->sr_err = mdb_txn_commit( txn )) != 0 ) { + rs->sr_err = mdb_txn_commit( txn ); + txn = NULL; + if ( rs->sr_err != 0 ) { rs->sr_text = "txn_commit failed"; Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": %s : %s (%d)\n", @@ -395,7 +418,6 @@ txnReturn: rs->sr_err = LDAP_OTHER; goto return_results; } - txn = NULL; } Debug(LDAP_DEBUG_TRACE,