X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fback-mdb%2Fdelete.c;h=66101679f73ccc8518bd1add019544ca7d835291;hb=8102d9d2df0d97b70f9d5d9e54e7a171975a6fee;hp=a557fc05bc12fcf6c543c9a6a29276793ee9040a;hpb=550dc4aaeee2b9f2ed25b451d950bd5e7088652d;p=openldap diff --git a/servers/slapd/back-mdb/delete.c b/servers/slapd/back-mdb/delete.c index a557fc05bc..66101679f7 100644 --- a/servers/slapd/back-mdb/delete.c +++ b/servers/slapd/back-mdb/delete.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2011 The OpenLDAP Foundation. + * Copyright 2000-2013 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,6 +33,7 @@ mdb_delete( Operation *op, SlapReply *rs ) AttributeDescription *children = slap_schema.si_ad_children; AttributeDescription *entry = slap_schema.si_ad_entry; MDB_txn *txn = NULL; + MDB_cursor *mc; mdb_op_info opinfo = {{{ 0 }}}, *moi = &opinfo; LDAPControl **preread_ctrl = NULL; @@ -89,16 +90,6 @@ txnReturn: ctrls[num_ctrls] = 0; - /* allocate CSN */ - if ( BER_BVISNULL( &op->o_csn ) ) { - struct berval csn; - char csnbuf[LDAP_PVT_CSNSTR_BUFSIZE]; - - csn.bv_val = csnbuf; - csn.bv_len = sizeof(csnbuf); - slap_get_csn( op, &csn, 1 ); - } - /* begin transaction */ rs->sr_err = mdb_opinfo_get( op, mdb, 0, &moi ); rs->sr_text = NULL; @@ -110,15 +101,30 @@ txnReturn: rs->sr_text = "internal error"; goto return_results; } - txn = moi->moi_txn; + /* allocate CSN */ + if ( BER_BVISNULL( &op->o_csn ) ) { + struct berval csn; + char csnbuf[LDAP_PVT_CSNSTR_BUFSIZE]; + + csn.bv_val = csnbuf; + csn.bv_len = sizeof(csnbuf); + slap_get_csn( op, &csn, 1 ); + } + if ( !be_issuffix( op->o_bd, &op->o_req_ndn ) ) { dnParent( &op->o_req_ndn, &pdn ); } + rs->sr_err = mdb_cursor_open( txn, mdb->mi_dn2id, &mc ); + if ( rs->sr_err ) { + rs->sr_err = LDAP_OTHER; + rs->sr_text = "internal error"; + goto return_results; + } /* get parent */ - rs->sr_err = mdb_dn2entry( op, txn, &pdn, &p, 1 ); + rs->sr_err = mdb_dn2entry( op, txn, mc, &pdn, &p, 1 ); switch( rs->sr_err ) { case 0: case MDB_NOTFOUND: @@ -161,7 +167,7 @@ txnReturn: } /* get entry */ - rs->sr_err = mdb_dn2entry( op, txn, &op->o_req_ndn, &e, 0 ); + rs->sr_err = mdb_dn2entry( op, txn, mc, &op->o_req_ndn, &e, 0 ); switch( rs->sr_err ) { case MDB_NOTFOUND: e = p; @@ -326,7 +332,8 @@ txnReturn: } /* delete from dn2id */ - rs->sr_err = mdb_dn2id_delete( op, txn, p->e_id, e ); + rs->sr_err = mdb_dn2id_delete( op, mc, e->e_id ); + mdb_cursor_close( mc ); if ( rs->sr_err != 0 ) { Debug(LDAP_DEBUG_TRACE, "<=- " LDAP_XSTRING(mdb_delete) ": dn2id failed: " @@ -356,7 +363,7 @@ txnReturn: BER_BVZERO( &vals[1] ); rs->sr_err = mdb_index_values( op, txn, slap_schema.si_ad_entryCSN, vals, 0, SLAP_INDEX_ADD_OP ); - if ( rs->sr_err != LDAP_SUCCESS ) { + if ( rs->sr_err != LDAP_SUCCESS ) { rs->sr_text = "entryCSN index update failed"; rs->sr_err = LDAP_OTHER; goto return_results;