X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-mdb%2Fadd.c;h=3bfe12eb7627a08992d42b5da6b2f13b33996dde;hb=6018fe9671dcbb90e3845bc14851858c5d9fdf2a;hp=7822b9fcf05fdb6f8b140bf6c1720368c3ca3516;hpb=473e2c997f6b1f226d35da186db8033c922001f3;p=openldap diff --git a/servers/slapd/back-mdb/add.c b/servers/slapd/back-mdb/add.c index 7822b9fcf0..3bfe12eb76 100644 --- a/servers/slapd/back-mdb/add.c +++ b/servers/slapd/back-mdb/add.c @@ -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,12 +143,22 @@ 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; - mdb_entry_return( p ); + mdb_entry_return( op, p ); p = NULL; goto return_results; case MDB_NOTFOUND: @@ -175,7 +187,7 @@ txnReturn: rs->sr_ref = NULL; } if ( p != (Entry *)&slap_entry_root ) - mdb_entry_return( p ); + mdb_entry_return( op, p ); p = NULL; Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": parent " @@ -191,7 +203,7 @@ txnReturn: if ( ! rs->sr_err ) { if ( p != (Entry *)&slap_entry_root ) - mdb_entry_return( p ); + mdb_entry_return( op, p ); p = NULL; Debug( LDAP_DEBUG_TRACE, @@ -204,7 +216,7 @@ txnReturn: if ( p != (Entry *)&slap_entry_root ) { if ( is_entry_subentry( p ) ) { - mdb_entry_return( p ); + mdb_entry_return( op, p ); p = NULL; /* parent is a subentry, don't allow add */ Debug( LDAP_DEBUG_TRACE, @@ -216,7 +228,7 @@ txnReturn: } if ( is_entry_alias( p ) ) { - mdb_entry_return( p ); + mdb_entry_return( op, p ); p = NULL; /* parent is an alias, don't allow add */ Debug( LDAP_DEBUG_TRACE, @@ -235,7 +247,7 @@ txnReturn: rs->sr_ref = referral_rewrite( ref, &p->e_name, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); ber_bvarray_free( ref ); - mdb_entry_return( p ); + mdb_entry_return( op, p ); p = NULL; Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(mdb_add) ": parent is referral\n", @@ -277,7 +289,7 @@ txnReturn: } } - mdb_entry_return( p ); + mdb_entry_return( op, p ); } p = NULL; @@ -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",