]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/modrdn.c
ITS#3576 use actual backend (not glue instance) for restriction and
[openldap] / servers / slapd / back-sql / modrdn.c
index a722e9f39882326423bc703617c188de3c1cadc5..a1578e565d8749d6c399feea9a62c11211a6f858 100644 (file)
@@ -83,9 +83,8 @@ backsql_modrdn( 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;
@@ -291,32 +290,11 @@ backsql_modrdn( Operation *op, SlapReply *rs )
        Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): new entry dn is \"%s\"\n",
                        new_dn.bv_val, 0, 0 );
 
-       Debug(  LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
-               "executing delentry_stmt\n", 0, 0, 0 );
-
-       rc = backsql_Prepare( dbh, &sth, bi->sql_delentry_stmt, 0 );
-       if ( rc != SQL_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "   backsql_modrdn(): "
-                       "error preparing delentry_stmt\n", 0, 0, 0 );
-               backsql_PrintErrors( bi->sql_db_env, dbh, 
-                               sth, rc );
-
-               rs->sr_text = "SQL-backend error";
-               rs->sr_err = LDAP_OTHER;
-               e = NULL;
-               goto done;
-       }
-
-       rc = backsql_BindParamID( sth, 1, SQL_PARAM_INPUT, &e_id.eid_id );
-       if ( rc != SQL_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "   backsql_delete(): "
-                       "error binding entry ID parameter "
-                       "for objectClass %s\n",
-                       oc->bom_oc->soc_cname.bv_val, 0, 0 );
-               backsql_PrintErrors( bi->sql_db_env, dbh, sth, rc );
+       realnew_dn = new_dn;
+       if ( backsql_api_dn2odbc( op, rs, &realnew_dn ) ) {
+               Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(\"%s\"): "
+                       "backsql_api_dn2odbc(\"%s\") failed\n", 
+                       op->o_req_dn.bv_val, realnew_dn.bv_val, 0 );
                SQLFreeStmt( sth, SQL_DROP );
 
                rs->sr_text = "SQL-backend error";
@@ -325,29 +303,14 @@ backsql_modrdn( Operation *op, SlapReply *rs )
                goto done;
        }
 
-       rc = SQLExecute( sth );
-       if ( rc != SQL_SUCCESS ) {
-               Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
-                       "failed to delete record from ldap_entries\n",
-                       0, 0, 0 );
-               backsql_PrintErrors( bi->sql_db_env, dbh, sth, rc );
-               SQLFreeStmt( sth, SQL_DROP );
-               rs->sr_err = LDAP_OTHER;
-               rs->sr_text = "SQL-backend error";
-               e = NULL;
-               goto done;
-       }
-
-       SQLFreeStmt( sth, SQL_DROP );
-
        Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
-               "executing insentry_stmt\n", 0, 0, 0 );
+               "executing renentry_stmt\n", 0, 0, 0 );
 
-       rc = backsql_Prepare( dbh, &sth, bi->sql_insentry_stmt, 0 );
+       rc = backsql_Prepare( dbh, &sth, bi->sql_renentry_stmt, 0 );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE,
                        "   backsql_modrdn(): "
-                       "error preparing insentry_stmt\n", 0, 0, 0 );
+                       "error preparing renentry_stmt\n", 0, 0, 0 );
                backsql_PrintErrors( bi->sql_db_env, dbh, 
                                sth, rc );
 
@@ -357,19 +320,6 @@ backsql_modrdn( Operation *op, SlapReply *rs )
                goto done;
        }
 
-       realnew_dn = new_dn;
-       if ( backsql_api_dn2odbc( op, rs, &realnew_dn ) ) {
-               Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(\"%s\"): "
-                       "backsql_api_dn2odbc(\"%s\") failed\n", 
-                       op->o_req_dn.bv_val, realnew_dn.bv_val, 0 );
-               SQLFreeStmt( sth, SQL_DROP );
-
-               rs->sr_text = "SQL-backend error";
-               rs->sr_err = LDAP_OTHER;
-               e = NULL;
-               goto done;
-       }
-
        rc = backsql_BindParamBerVal( sth, 1, SQL_PARAM_INPUT, &realnew_dn );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE,
@@ -386,11 +336,11 @@ backsql_modrdn( Operation *op, SlapReply *rs )
                goto done;
        }
 
-       rc = backsql_BindParamInt( sth, 2, SQL_PARAM_INPUT, &e_id.eid_oc_id );
+       rc = backsql_BindParamID( sth, 2, SQL_PARAM_INPUT, &n_id.eid_id );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE,
                        "   backsql_add_attr(): "
-                       "error binding objectClass ID parameter for objectClass %s\n",
+                       "error binding parent ID parameter for objectClass %s\n",
                        oc->bom_oc->soc_cname.bv_val, 0, 0 );
                backsql_PrintErrors( bi->sql_db_env, dbh, 
                        sth, rc );
@@ -402,11 +352,11 @@ backsql_modrdn( Operation *op, SlapReply *rs )
                goto done;
        }
 
-       rc = backsql_BindParamID( sth, 3, SQL_PARAM_INPUT, &n_id.eid_id );
+       rc = backsql_BindParamID( sth, 3, SQL_PARAM_INPUT, &e_id.eid_keyval );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE,
                        "   backsql_add_attr(): "
-                       "error binding parent ID parameter for objectClass %s\n",
+                       "error binding entry ID parameter for objectClass %s\n",
                        oc->bom_oc->soc_cname.bv_val, 0, 0 );
                backsql_PrintErrors( bi->sql_db_env, dbh, 
                        sth, rc );
@@ -418,11 +368,11 @@ backsql_modrdn( Operation *op, SlapReply *rs )
                goto done;
        }
 
-       rc = backsql_BindParamID( sth, 4, SQL_PARAM_INPUT, &e_id.eid_keyval );
+       rc = backsql_BindParamID( sth, 4, SQL_PARAM_INPUT, &e_id.eid_id );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE,
                        "   backsql_add_attr(): "
-                       "error binding entry ID parameter for objectClass %s\n",
+                       "error binding ID parameter for objectClass %s\n",
                        oc->bom_oc->soc_cname.bv_val, 0, 0 );
                backsql_PrintErrors( bi->sql_db_env, dbh, 
                        sth, rc );
@@ -437,7 +387,7 @@ backsql_modrdn( Operation *op, SlapReply *rs )
        rc = SQLExecute( sth );
        if ( rc != SQL_SUCCESS ) {
                Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
-                       "could not insert ldap_entries record\n", 0, 0, 0 );
+                       "could not rename ldap_entries record\n", 0, 0, 0 );
                backsql_PrintErrors( bi->sql_db_env, dbh, sth, rc );
                SQLFreeStmt( sth, SQL_DROP );
                rs->sr_err = LDAP_OTHER;
@@ -490,7 +440,71 @@ backsql_modrdn( Operation *op, SlapReply *rs )
 
        oc = backsql_id2oc( bi, e_id.eid_oc_id );
        rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, mod );
-       e = &r;
+       if ( rs->sr_err != LDAP_SUCCESS ) {
+               e = &r;
+               goto done;
+       }
+
+       if ( global_schemacheck ) {
+               char            textbuf[ SLAP_TEXT_BUFLEN ] = { '\0' };
+
+               entry_clean( &r );
+               (void)backsql_free_entryID( op, &e_id, 0 );
+
+               bsi.bsi_e = &r;
+               rs->sr_err = backsql_init_search( &bsi, &new_ndn,
+                               LDAP_SCOPE_BASE, 
+                               SLAP_NO_LIMIT, SLAP_NO_LIMIT,
+                               (time_t)(-1), NULL, dbh, op, rs,
+                               slap_anlist_all_attributes,
+                               ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
+               switch ( rs->sr_err ) {
+               case LDAP_SUCCESS:
+                       break;
+
+               case LDAP_REFERRAL:
+                       if ( manageDSAit && !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
+                                       dn_match( &new_ndn, &bsi.bsi_e->e_nname ) )
+                       {
+                               rs->sr_err = LDAP_SUCCESS;
+                               rs->sr_text = NULL;
+                               rs->sr_matched = NULL;
+                               if ( rs->sr_ref ) {
+                                       ber_bvarray_free( rs->sr_ref );
+                                       rs->sr_ref = NULL;
+                               }
+                               break;
+                       }
+                       e = &r;
+                       /* fallthru */
+
+               default:
+                       Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
+                               "could not retrieve modrdnDN ID - no such entry\n", 
+                               0, 0, 0 );
+                       if ( !BER_BVISNULL( &r.e_nname ) ) {
+                               /* FIXME: should always be true! */
+                               e = &r;
+
+                       } else {
+                               e = NULL;
+                       }
+                       goto done;
+               }
+
+               e_id = bsi.bsi_base_id;
+
+               rs->sr_err = entry_schema_check( op->o_bd, &r,
+                               NULL,
+                               &rs->sr_text, textbuf, sizeof( textbuf ) );
+               if ( rs->sr_err != LDAP_SUCCESS ) {
+                       Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "
+                               "entry failed schema check -- aborting\n",
+                               r.e_name.bv_val, 0, 0 );
+                       e = NULL;
+                       goto done;
+               }
+       }
 
 done:;
 #ifdef SLAP_ACL_HONOR_DISCLOSE