]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/delete.c
use helper to destroy modrdn modifications; send result after commit\!...
[openldap] / servers / slapd / back-sql / delete.c
index 35648c5f9e67ddd135d8712a7ba9022c860f7c7f..31087f081c25b140f6364c256a4e9356c2376381 100644 (file)
@@ -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 ) {
@@ -123,9 +122,8 @@ backsql_delete( Operation *op, SlapReply *rs )
                break;
 
        case LDAP_REFERRAL:
-               if ( !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
-                               dn_match( &op->o_req_ndn, &bsi.bsi_e->e_nname )
-                               && manageDSAit )
+               if ( manageDSAit && !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
+                               dn_match( &op->o_req_ndn, &bsi.bsi_e->e_nname ) )
                {
                        rs->sr_err = LDAP_SUCCESS;
                        rs->sr_text = NULL;
@@ -163,7 +161,7 @@ backsql_delete( Operation *op, SlapReply *rs )
        }
 
        if ( !access_allowed( op, &d, slap_schema.si_ad_entry, 
-                       NULL, ACL_WRITE, NULL ) )
+                       NULL, ACL_WDEL, NULL ) )
        {
                Debug( LDAP_DEBUG_TRACE, "   backsql_delete(): "
                        "no write access to entry\n", 
@@ -173,18 +171,21 @@ 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;
                break;
 
        case LDAP_COMPARE_TRUE:
+               if ( get_treeDelete( op ) ) {
+                       /* not supported yet */ ;
+               }
                Debug( LDAP_DEBUG_TRACE, "   backsql_delete(): "
                        "entry \"%s\" has children\n",
                        op->o_req_dn.bv_val, 0, 0 );
                rs->sr_err = LDAP_NOT_ALLOWED_ON_NONLEAF;
-               rs->sr_text = "subtree delete not supported";
+               rs->sr_text = "subordinate objects must be deleted first";
                /* fallthru */
 
        default:
@@ -216,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_WRITE, 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 ... */
@@ -285,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 );
@@ -472,11 +473,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;