]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/delete.c
re-fix previus commit the other way 'round (rids are < 1000)
[openldap] / servers / slapd / back-sql / delete.c
index 5659541268adaae12a36f7d5779f72bf3deb0f09..2bfddfda6cefb22a0ebafe900391aa60c402ae71 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2005 The OpenLDAP Foundation.
+ * Copyright 1999-2007 The OpenLDAP Foundation.
  * Portions Copyright 1999 Dmitry Kovalev.
  * Portions Copyright 2002 Pierangelo Masarati.
  * All rights reserved.
@@ -93,7 +93,7 @@ backsql_delete( Operation *op, SlapReply *rs )
        struct berval           pdn = BER_BVNULL;
        int                     manageDSAit = get_manageDSAit( op );
        /* first parameter no */
-       SQLUSMALLINT            pno;
+       SQLUSMALLINT            pno = 0;
 
        Debug( LDAP_DEBUG_TRACE, "==>backsql_delete(): deleting entry \"%s\"\n",
                        op->o_req_ndn.bv_val, 0, 0 );
@@ -115,7 +115,6 @@ backsql_delete( Operation *op, SlapReply *rs )
        bsi.bsi_e = &d;
        rs->sr_err = backsql_init_search( &bsi, &op->o_req_ndn,
                        LDAP_SCOPE_BASE, 
-                       SLAP_NO_LIMIT, SLAP_NO_LIMIT,
                        (time_t)(-1), NULL, dbh, op, rs, slap_anlist_no_attrs,
                        ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
        switch ( rs->sr_err ) {
@@ -172,7 +171,7 @@ backsql_delete( Operation *op, SlapReply *rs )
                goto done;
        }
 
-       rs->sr_err = backsql_has_children( bi, dbh, &op->o_req_ndn );
+       rs->sr_err = backsql_has_children( op, dbh, &op->o_req_ndn );
        switch ( rs->sr_err ) {
        case LDAP_COMPARE_FALSE:
                rs->sr_err = LDAP_SUCCESS;
@@ -218,35 +217,38 @@ backsql_delete( Operation *op, SlapReply *rs )
        /*
         * Get the parent
         */
-       dnParent( &op->o_req_ndn, &pdn );
-       bsi.bsi_e = &p;
        e_id = bsi.bsi_base_id;
-       rs->sr_err = backsql_init_search( &bsi, &pdn,
-                       LDAP_SCOPE_BASE, 
-                       SLAP_NO_LIMIT, SLAP_NO_LIMIT,
-                       (time_t)(-1), NULL, dbh, op, rs, slap_anlist_no_attrs,
-                       BACKSQL_ISF_GET_ENTRY );
-       if ( rs->sr_err != LDAP_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE, "backsql_delete(): "
-                       "could not retrieve deleteDN ID - no such entry\n", 
-                       0, 0, 0 );
-               e = &p;
-               goto done;
-       }
+       if ( !be_issuffix( op->o_bd, &op->o_req_ndn ) ) {
+               dnParent( &op->o_req_ndn, &pdn );
+               bsi.bsi_e = &p;
+               rs->sr_err = backsql_init_search( &bsi, &pdn,
+                               LDAP_SCOPE_BASE, 
+                               (time_t)(-1), NULL, dbh, op, rs,
+                               slap_anlist_no_attrs,
+                               BACKSQL_ISF_GET_ENTRY );
+               if ( rs->sr_err != LDAP_SUCCESS ) {
+                       Debug( LDAP_DEBUG_TRACE, "backsql_delete(): "
+                               "could not retrieve deleteDN ID "
+                               "- no such entry\n", 
+                               0, 0, 0 );
+                       e = &p;
+                       goto done;
+               }
 
-       (void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 );
+               (void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 );
 
-       /* check parent for "children" acl */
-       if ( !access_allowed( op, &p, slap_schema.si_ad_children, 
-                       NULL, ACL_WDEL, NULL ) )
-       {
-               Debug( LDAP_DEBUG_TRACE, "   backsql_delete(): "
-                       "no write access to parent\n", 
-                       0, 0, 0 );
-               rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
-               e = &p;
-               goto done;
+               /* check parent for "children" acl */
+               if ( !access_allowed( op, &p, slap_schema.si_ad_children, 
+                               NULL, ACL_WDEL, NULL ) )
+               {
+                       Debug( LDAP_DEBUG_TRACE, "   backsql_delete(): "
+                               "no write access to parent\n", 
+                               0, 0, 0 );
+                       rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
+                       e = &p;
+                       goto done;
 
+               }
        }
 
        /* avl_apply ... */
@@ -287,9 +289,6 @@ backsql_delete( Operation *op, SlapReply *rs )
                        e = NULL;
                        goto done;
                }
-
-       } else {
-               pno = 0;
        }
 
        rc = backsql_BindParamID( sth, pno + 1, SQL_PARAM_INPUT, &e_id.eid_keyval );
@@ -442,6 +441,7 @@ backsql_delete( Operation *op, SlapReply *rs )
                SQLUSMALLINT    CompletionType = SQL_ROLLBACK;
        
                if ( rs->sr_err == LDAP_SUCCESS && !op->o_noop ) {
+                       assert( e == NULL );
                        CompletionType = SQL_COMMIT;
                }
 
@@ -449,7 +449,6 @@ backsql_delete( Operation *op, SlapReply *rs )
        }
 
 done:;
-#ifdef SLAP_ACL_HONOR_DISCLOSE
        if ( e != NULL ) {
                if ( !access_allowed( op, e, slap_schema.si_ad_entry, NULL,
                                        ACL_DISCLOSE, NULL ) )
@@ -463,7 +462,10 @@ done:;
                        }
                }
        }
-#endif /* SLAP_ACL_HONOR_DISCLOSE */
+
+       if ( op->o_noop && rs->sr_err == LDAP_SUCCESS ) {
+               rs->sr_err = LDAP_X_NO_OPERATION;
+       }
 
        send_ldap_result( op, rs );
 
@@ -474,11 +476,16 @@ done:;
        }
 
        if ( !BER_BVISNULL( &d.e_nname ) ) {
-               entry_clean( &d );
+               backsql_entry_clean( op, &d );
        }
 
        if ( !BER_BVISNULL( &p.e_nname ) ) {
-               entry_clean( &p );
+               backsql_entry_clean( op, &p );
+       }
+
+       if ( rs->sr_ref ) {
+               ber_bvarray_free( rs->sr_ref );
+               rs->sr_ref = NULL;
        }
 
        return rs->sr_err;