X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fmodrdn.c;h=4634078fdd57eef891ce375e16b4629c8754abf5;hb=3119bba337c9fbdc2736dc227c5b2df93969baf6;hp=4ad518e3bdceff8264a0d9ff9d95b2618d65d4d6;hpb=a6d9e7d933aac7817a45e5affba8fe6d3090e0f7;p=openldap diff --git a/servers/slapd/back-sql/modrdn.c b/servers/slapd/back-sql/modrdn.c index 4ad518e3bd..4634078fdd 100644 --- a/servers/slapd/back-sql/modrdn.c +++ b/servers/slapd/back-sql/modrdn.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * 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. @@ -44,16 +44,12 @@ backsql_modrdn( Operation *op, SlapReply *rs ) *new_pdn = NULL, *new_npdn = NULL, new_dn = BER_BVNULL, new_ndn = BER_BVNULL, realnew_dn = BER_BVNULL; - LDAPRDN new_rdn = NULL; - LDAPRDN old_rdn = NULL; Entry r = { 0 }, p = { 0 }, n = { 0 }, *e = NULL; int manageDSAit = get_manageDSAit( op ); - Modifications *mod = NULL; struct berval *newSuperior = op->oq_modrdn.rs_newSup; - char *next; Debug( LDAP_DEBUG_TRACE, "==>backsql_modrdn() renaming entry \"%s\", " "newrdn=\"%s\", newSuperior=\"%s\"\n", @@ -74,7 +70,6 @@ backsql_modrdn( Operation *op, SlapReply *rs ) bsi.bsi_e = &r; 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_all_attributes, ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) ); @@ -171,7 +166,6 @@ backsql_modrdn( Operation *op, SlapReply *rs ) e_id = bsi.bsi_base_id; rs->sr_err = backsql_init_search( &bsi, &pndn, LDAP_SCOPE_BASE, - SLAP_NO_LIMIT, SLAP_NO_LIMIT, (time_t)(-1), NULL, dbh, op, rs, slap_anlist_all_attributes, BACKSQL_ISF_GET_ENTRY ); @@ -226,7 +220,6 @@ backsql_modrdn( Operation *op, SlapReply *rs ) bsi.bsi_e = &n; rs->sr_err = backsql_init_search( &bsi, new_npdn, 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 ) ); @@ -398,49 +391,13 @@ backsql_modrdn( Operation *op, SlapReply *rs ) } SQLFreeStmt( sth, SQL_DROP ); - /* - * Get attribute type and attribute value of our new rdn, - * we will need to add that to our new entry - */ - if ( ldap_bv2rdn( &op->oq_modrdn.rs_newrdn, &new_rdn, &next, - LDAP_DN_FORMAT_LDAP ) ) - { - Debug( LDAP_DEBUG_TRACE, - " backsql_modrdn: can't figure out " - "type(s)/values(s) of new_rdn\n", - 0, 0, 0 ); - rs->sr_err = LDAP_INVALID_DN_SYNTAX; - e = &r; - goto done; - } + assert( op->orr_modlist != NULL ); - Debug( LDAP_DEBUG_TRACE, "backsql_modrdn: " - "new_rdn_type=\"%s\", new_rdn_val=\"%s\"\n", - new_rdn[ 0 ]->la_attr.bv_val, - new_rdn[ 0 ]->la_value.bv_val, 0 ); - - if ( op->oq_modrdn.rs_deleteoldrdn ) { - if ( ldap_bv2rdn( &op->o_req_dn, &old_rdn, &next, - LDAP_DN_FORMAT_LDAP ) ) - { - Debug( LDAP_DEBUG_TRACE, - " backsql_modrdn: can't figure out " - "the old_rdn type(s)/value(s)\n", - 0, 0, 0 ); - rs->sr_err = LDAP_OTHER; - e = NULL; - goto done; - } - } - - rs->sr_err = slap_modrdn2mods( op, rs, &r, old_rdn, new_rdn, &mod ); - if ( rs->sr_err != LDAP_SUCCESS ) { - e = &r; - goto done; - } + slap_mods_opattrs( op, &op->orr_modlist, 1 ); oc = backsql_id2oc( bi, e_id.eid_oc_id ); - rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, mod ); + rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, op->orr_modlist ); + slap_graduate_commit_csn( op ); if ( rs->sr_err != LDAP_SUCCESS ) { e = &r; goto done; @@ -455,7 +412,6 @@ backsql_modrdn( Operation *op, SlapReply *rs ) 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 ) ); @@ -495,10 +451,10 @@ backsql_modrdn( Operation *op, SlapReply *rs ) e_id = bsi.bsi_base_id; - rs->sr_err = entry_schema_check( op->o_bd, &r, NULL, 0, + rs->sr_err = entry_schema_check( op, &r, NULL, 0, 0, &rs->sr_text, textbuf, sizeof( textbuf ) ); if ( rs->sr_err != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_TRACE, " backsql_add(\"%s\"): " + Debug( LDAP_DEBUG_TRACE, " backsql_modrdn(\"%s\"): " "entry failed schema check -- aborting\n", r.e_name.bv_val, 0, 0 ); e = NULL; @@ -507,7 +463,6 @@ backsql_modrdn( 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 ) ) @@ -521,9 +476,6 @@ done:; } } } -#endif /* SLAP_ACL_HONOR_DISCLOSE */ - - send_ldap_result( op, rs ); /* * Commit only if all operations succeed @@ -538,6 +490,13 @@ done:; SQLTransact( SQL_NULL_HENV, dbh, CompletionType ); } + if ( op->o_noop && rs->sr_err == LDAP_SUCCESS ) { + rs->sr_err = LDAP_X_NO_OPERATION; + } + + send_ldap_result( op, rs ); + slap_graduate_commit_csn( op ); + if ( !BER_BVISNULL( &realnew_dn ) && realnew_dn.bv_val != new_dn.bv_val ) { ch_free( realnew_dn.bv_val ); } @@ -550,21 +509,6 @@ done:; slap_sl_free( new_ndn.bv_val, op->o_tmpmemctx ); } - /* LDAP v2 supporting correct attribute handling. */ - if ( new_rdn != NULL ) { - ldap_rdnfree( new_rdn ); - } - if ( old_rdn != NULL ) { - ldap_rdnfree( old_rdn ); - } - if ( mod != NULL ) { - Modifications *tmp; - for (; mod; mod = tmp ) { - tmp = mod->sml_next; - free( mod ); - } - } - if ( !BER_BVISNULL( &e_id.eid_ndn ) ) { (void)backsql_free_entryID( op, &e_id, 0 ); } @@ -585,6 +529,11 @@ done:; backsql_entry_clean( op, &n ); } + if ( rs->sr_ref ) { + ber_bvarray_free( rs->sr_ref ); + rs->sr_ref = NULL; + } + Debug( LDAP_DEBUG_TRACE, "<==backsql_modrdn()\n", 0, 0, 0 ); return rs->sr_err;