]> git.sur5r.net Git - openldap/blob - servers/slapd/back-sql/modrdn.c
remove unnecessary data from search_info
[openldap] / servers / slapd / back-sql / modrdn.c
1 /* $OpenLDAP$ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1999-2005 The OpenLDAP Foundation.
5  * Portions Copyright 1999 Dmitry Kovalev.
6  * Portions Copyright 2002 Pierangelo Masarati.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in the file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* ACKNOWLEDGEMENTS:
18  * This work was initially developed by Dmitry Kovalev for inclusion
19  * by OpenLDAP Software.  Additional significant contributors include
20  * Pierangelo Masarati.
21  */
22
23 #include "portable.h"
24
25 #include <stdio.h>
26 #include <sys/types.h>
27 #include "ac/string.h"
28
29 #include "slap.h"
30 #include "proto-sql.h"
31
32 int
33 backsql_modrdn( Operation *op, SlapReply *rs )
34 {
35         backsql_info            *bi = (backsql_info*)op->o_bd->be_private;
36         SQLHDBC                 dbh = SQL_NULL_HDBC;
37         SQLHSTMT                sth = SQL_NULL_HSTMT;
38         RETCODE                 rc;
39         backsql_entryID         e_id = BACKSQL_ENTRYID_INIT,
40                                 n_id = BACKSQL_ENTRYID_INIT;
41         backsql_srch_info       bsi = { 0 };
42         backsql_oc_map_rec      *oc = NULL;
43         struct berval           pdn = BER_BVNULL, pndn = BER_BVNULL,
44                                 *new_pdn = NULL, *new_npdn = NULL,
45                                 new_dn = BER_BVNULL, new_ndn = BER_BVNULL,
46                                 realnew_dn = BER_BVNULL;
47         LDAPRDN                 new_rdn = NULL;
48         LDAPRDN                 old_rdn = NULL;
49         Entry                   r = { 0 },
50                                 p = { 0 },
51                                 n = { 0 },
52                                 *e = NULL;
53         int                     manageDSAit = get_manageDSAit( op );
54         Modifications           *mod = NULL;
55         struct berval           *newSuperior = op->oq_modrdn.rs_newSup;
56         char                    *next;
57  
58         Debug( LDAP_DEBUG_TRACE, "==>backsql_modrdn() renaming entry \"%s\", "
59                         "newrdn=\"%s\", newSuperior=\"%s\"\n",
60                         op->o_req_dn.bv_val, op->oq_modrdn.rs_newrdn.bv_val, 
61                         newSuperior ? newSuperior->bv_val : "(NULL)" );
62
63         rs->sr_err = backsql_get_db_conn( op, &dbh );
64         if ( rs->sr_err != LDAP_SUCCESS ) {
65                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
66                         "could not get connection handle - exiting\n", 
67                         0, 0, 0 );
68                 rs->sr_text = ( rs->sr_err == LDAP_OTHER )
69                         ?  "SQL-backend error" : NULL;
70                 e = NULL;
71                 goto done;
72         }
73
74         bsi.bsi_e = &r;
75         rs->sr_err = backsql_init_search( &bsi, &op->o_req_ndn,
76                         LDAP_SCOPE_BASE, 
77                         (time_t)(-1), NULL, dbh, op, rs,
78                         slap_anlist_all_attributes,
79                         ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
80         switch ( rs->sr_err ) {
81         case LDAP_SUCCESS:
82                 break;
83
84         case LDAP_REFERRAL:
85                 if ( manageDSAit && !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
86                                 dn_match( &op->o_req_ndn, &bsi.bsi_e->e_nname ) )
87                 {
88                         rs->sr_err = LDAP_SUCCESS;
89                         rs->sr_text = NULL;
90                         rs->sr_matched = NULL;
91                         if ( rs->sr_ref ) {
92                                 ber_bvarray_free( rs->sr_ref );
93                                 rs->sr_ref = NULL;
94                         }
95                         break;
96                 }
97                 e = &r;
98                 /* fallthru */
99
100         default:
101                 Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
102                         "could not retrieve modrdnDN ID - no such entry\n", 
103                         0, 0, 0 );
104                 if ( !BER_BVISNULL( &r.e_nname ) ) {
105                         /* FIXME: should always be true! */
106                         e = &r;
107
108                 } else {
109                         e = NULL;
110                 }
111                 goto done;
112         }
113
114 #ifdef BACKSQL_ARBITRARY_KEY
115         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): entry id=%s\n",
116                 e_id.eid_id.bv_val, 0, 0 );
117 #else /* ! BACKSQL_ARBITRARY_KEY */
118         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): entry id=%ld\n",
119                 e_id.eid_id, 0, 0 );
120 #endif /* ! BACKSQL_ARBITRARY_KEY */
121
122         if ( get_assert( op ) &&
123                         ( test_filter( op, &r, get_assertion( op ) )
124                           != LDAP_COMPARE_TRUE ) )
125         {
126                 rs->sr_err = LDAP_ASSERTION_FAILED;
127                 e = &r;
128                 goto done;
129         }
130
131         if ( backsql_has_children( op, dbh, &op->o_req_ndn ) == LDAP_COMPARE_TRUE ) {
132                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
133                         "entry \"%s\" has children\n",
134                         op->o_req_dn.bv_val, 0, 0 );
135                 rs->sr_err = LDAP_NOT_ALLOWED_ON_NONLEAF;
136                 rs->sr_text = "subtree rename not supported";
137                 e = &r;
138                 goto done;
139         }
140
141         /*
142          * Check for entry access to target
143          */
144         if ( !access_allowed( op, &r, slap_schema.si_ad_entry, 
145                                 NULL, ACL_WRITE, NULL ) ) {
146                 Debug( LDAP_DEBUG_TRACE, "   no access to entry\n", 0, 0, 0 );
147                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
148                 goto done;
149         }
150
151         dnParent( &op->o_req_dn, &pdn );
152         dnParent( &op->o_req_ndn, &pndn );
153
154         /*
155          * namingContext "" is not supported
156          */
157         if ( BER_BVISEMPTY( &pdn ) ) {
158                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
159                         "parent is \"\" - aborting\n", 0, 0, 0 );
160                 rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
161                 rs->sr_text = "not allowed within namingContext";
162                 e = NULL;
163                 goto done;
164         }
165
166         /*
167          * Check for children access to parent
168          */
169         bsi.bsi_e = &p;
170         e_id = bsi.bsi_base_id;
171         rs->sr_err = backsql_init_search( &bsi, &pndn,
172                         LDAP_SCOPE_BASE, 
173                         (time_t)(-1), NULL, dbh, op, rs,
174                         slap_anlist_all_attributes,
175                         BACKSQL_ISF_GET_ENTRY );
176
177 #ifdef BACKSQL_ARBITRARY_KEY
178         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
179                 "old parent entry id is %s\n",
180                 bsi.bsi_base_id.eid_id.bv_val, 0, 0 );
181 #else /* ! BACKSQL_ARBITRARY_KEY */
182         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
183                 "old parent entry id is %ld\n",
184                 bsi.bsi_base_id.eid_id, 0, 0 );
185 #endif /* ! BACKSQL_ARBITRARY_KEY */
186
187         if ( rs->sr_err != LDAP_SUCCESS ) {
188                 Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
189                         "could not retrieve renameDN ID - no such entry\n", 
190                         0, 0, 0 );
191                 e = &p;
192                 goto done;
193         }
194
195         if ( !access_allowed( op, &p, slap_schema.si_ad_children, NULL,
196                         newSuperior ? ACL_WDEL : ACL_WRITE, NULL ) )
197         {
198                 Debug( LDAP_DEBUG_TRACE, "   no access to parent\n", 0, 0, 0 );
199                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
200                 goto done;
201         }
202
203         if ( newSuperior ) {
204                 (void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 );
205                 
206                 /*
207                  * namingContext "" is not supported
208                  */
209                 if ( BER_BVISEMPTY( newSuperior ) ) {
210                         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
211                                 "newSuperior is \"\" - aborting\n", 0, 0, 0 );
212                         rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
213                         rs->sr_text = "not allowed within namingContext";
214                         e = NULL;
215                         goto done;
216                 }
217
218                 new_pdn = newSuperior;
219                 new_npdn = op->oq_modrdn.rs_nnewSup;
220
221                 /*
222                  * Check for children access to new parent
223                  */
224                 bsi.bsi_e = &n;
225                 rs->sr_err = backsql_init_search( &bsi, new_npdn,
226                                 LDAP_SCOPE_BASE, 
227                                 (time_t)(-1), NULL, dbh, op, rs,
228                                 slap_anlist_all_attributes,
229                                 ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
230                 if ( rs->sr_err != LDAP_SUCCESS ) {
231                         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
232                                 "could not retrieve renameDN ID - no such entry\n", 
233                                 0, 0, 0 );
234                         e = &n;
235                         goto done;
236                 }
237
238                 n_id = bsi.bsi_base_id;
239
240 #ifdef BACKSQL_ARBITRARY_KEY
241                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
242                         "new parent entry id=%s\n",
243                         n_id.eid_id.bv_val, 0, 0 );
244 #else /* ! BACKSQL_ARBITRARY_KEY */
245                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
246                         "new parent entry id=%ld\n",
247                         n_id.eid_id, 0, 0 );
248 #endif /* ! BACKSQL_ARBITRARY_KEY */
249
250                 if ( !access_allowed( op, &n, slap_schema.si_ad_children, 
251                                         NULL, ACL_WADD, NULL ) ) {
252                         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
253                                         "no access to new parent \"%s\"\n", 
254                                         new_pdn->bv_val, 0, 0 );
255                         rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
256                         e = &n;
257                         goto done;
258                 }
259
260         } else {
261                 n_id = bsi.bsi_base_id;
262                 new_pdn = &pdn;
263                 new_npdn = &pndn;
264         }
265
266         if ( newSuperior && dn_match( &pndn, new_npdn ) ) {
267                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
268                         "newSuperior is equal to old parent - ignored\n",
269                         0, 0, 0 );
270                 newSuperior = NULL;
271         }
272
273         if ( newSuperior && dn_match( &op->o_req_ndn, new_npdn ) ) {
274                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
275                         "newSuperior is equal to entry being moved "
276                         "- aborting\n", 0, 0, 0 );
277                 rs->sr_err = LDAP_OTHER;
278                 rs->sr_text = "newSuperior is equal to old DN";
279                 e = &r;
280                 goto done;
281         }
282
283         build_new_dn( &new_dn, new_pdn, &op->oq_modrdn.rs_newrdn,
284                         op->o_tmpmemctx );
285         build_new_dn( &new_ndn, new_npdn, &op->oq_modrdn.rs_nnewrdn,
286                         op->o_tmpmemctx );
287         
288         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): new entry dn is \"%s\"\n",
289                         new_dn.bv_val, 0, 0 );
290
291         realnew_dn = new_dn;
292         if ( backsql_api_dn2odbc( op, rs, &realnew_dn ) ) {
293                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(\"%s\"): "
294                         "backsql_api_dn2odbc(\"%s\") failed\n", 
295                         op->o_req_dn.bv_val, realnew_dn.bv_val, 0 );
296                 SQLFreeStmt( sth, SQL_DROP );
297
298                 rs->sr_text = "SQL-backend error";
299                 rs->sr_err = LDAP_OTHER;
300                 e = NULL;
301                 goto done;
302         }
303
304         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
305                 "executing renentry_stmt\n", 0, 0, 0 );
306
307         rc = backsql_Prepare( dbh, &sth, bi->sql_renentry_stmt, 0 );
308         if ( rc != SQL_SUCCESS ) {
309                 Debug( LDAP_DEBUG_TRACE,
310                         "   backsql_modrdn(): "
311                         "error preparing renentry_stmt\n", 0, 0, 0 );
312                 backsql_PrintErrors( bi->sql_db_env, dbh, 
313                                 sth, rc );
314
315                 rs->sr_text = "SQL-backend error";
316                 rs->sr_err = LDAP_OTHER;
317                 e = NULL;
318                 goto done;
319         }
320
321         rc = backsql_BindParamBerVal( sth, 1, SQL_PARAM_INPUT, &realnew_dn );
322         if ( rc != SQL_SUCCESS ) {
323                 Debug( LDAP_DEBUG_TRACE,
324                         "   backsql_add_attr(): "
325                         "error binding DN parameter for objectClass %s\n",
326                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
327                 backsql_PrintErrors( bi->sql_db_env, dbh, 
328                         sth, rc );
329                 SQLFreeStmt( sth, SQL_DROP );
330
331                 rs->sr_text = "SQL-backend error";
332                 rs->sr_err = LDAP_OTHER;
333                 e = NULL;
334                 goto done;
335         }
336
337         rc = backsql_BindParamID( sth, 2, SQL_PARAM_INPUT, &n_id.eid_id );
338         if ( rc != SQL_SUCCESS ) {
339                 Debug( LDAP_DEBUG_TRACE,
340                         "   backsql_add_attr(): "
341                         "error binding parent ID parameter for objectClass %s\n",
342                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
343                 backsql_PrintErrors( bi->sql_db_env, dbh, 
344                         sth, rc );
345                 SQLFreeStmt( sth, SQL_DROP );
346
347                 rs->sr_text = "SQL-backend error";
348                 rs->sr_err = LDAP_OTHER;
349                 e = NULL;
350                 goto done;
351         }
352
353         rc = backsql_BindParamID( sth, 3, SQL_PARAM_INPUT, &e_id.eid_keyval );
354         if ( rc != SQL_SUCCESS ) {
355                 Debug( LDAP_DEBUG_TRACE,
356                         "   backsql_add_attr(): "
357                         "error binding entry ID parameter for objectClass %s\n",
358                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
359                 backsql_PrintErrors( bi->sql_db_env, dbh, 
360                         sth, rc );
361                 SQLFreeStmt( sth, SQL_DROP );
362
363                 rs->sr_text = "SQL-backend error";
364                 rs->sr_err = LDAP_OTHER;
365                 e = NULL;
366                 goto done;
367         }
368
369         rc = backsql_BindParamID( sth, 4, SQL_PARAM_INPUT, &e_id.eid_id );
370         if ( rc != SQL_SUCCESS ) {
371                 Debug( LDAP_DEBUG_TRACE,
372                         "   backsql_add_attr(): "
373                         "error binding ID parameter for objectClass %s\n",
374                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
375                 backsql_PrintErrors( bi->sql_db_env, dbh, 
376                         sth, rc );
377                 SQLFreeStmt( sth, SQL_DROP );
378
379                 rs->sr_text = "SQL-backend error";
380                 rs->sr_err = LDAP_OTHER;
381                 e = NULL;
382                 goto done;
383         }
384
385         rc = SQLExecute( sth );
386         if ( rc != SQL_SUCCESS ) {
387                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
388                         "could not rename ldap_entries record\n", 0, 0, 0 );
389                 backsql_PrintErrors( bi->sql_db_env, dbh, sth, rc );
390                 SQLFreeStmt( sth, SQL_DROP );
391                 rs->sr_err = LDAP_OTHER;
392                 rs->sr_text = "SQL-backend error";
393                 e = NULL;
394                 goto done;
395         }
396         SQLFreeStmt( sth, SQL_DROP );
397
398         /*
399          * Get attribute type and attribute value of our new rdn,
400          * we will need to add that to our new entry
401          */
402         if ( ldap_bv2rdn( &op->oq_modrdn.rs_newrdn, &new_rdn, &next, 
403                                 LDAP_DN_FORMAT_LDAP ) )
404         {
405                 Debug( LDAP_DEBUG_TRACE,
406                         "   backsql_modrdn: can't figure out "
407                         "type(s)/values(s) of new_rdn\n", 
408                         0, 0, 0 );
409                 rs->sr_err = LDAP_INVALID_DN_SYNTAX;
410                 e = &r;
411                 goto done;
412         }
413
414         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn: "
415                 "new_rdn_type=\"%s\", new_rdn_val=\"%s\"\n",
416                 new_rdn[ 0 ]->la_attr.bv_val,
417                 new_rdn[ 0 ]->la_value.bv_val, 0 );
418
419         if ( op->oq_modrdn.rs_deleteoldrdn ) {
420                 if ( ldap_bv2rdn( &op->o_req_dn, &old_rdn, &next,
421                                         LDAP_DN_FORMAT_LDAP ) )
422                 {
423                         Debug( LDAP_DEBUG_TRACE,
424                                 "   backsql_modrdn: can't figure out "
425                                 "the old_rdn type(s)/value(s)\n", 
426                                 0, 0, 0 );
427                         rs->sr_err = LDAP_OTHER;
428                         e = NULL;
429                         goto done;
430                 }
431         }
432
433         rs->sr_err = slap_modrdn2mods( op, rs, &r, old_rdn, new_rdn, &mod );
434         if ( rs->sr_err != LDAP_SUCCESS ) {
435                 e = &r;
436                 goto done;
437         }
438
439         oc = backsql_id2oc( bi, e_id.eid_oc_id );
440         rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, mod );
441         if ( rs->sr_err != LDAP_SUCCESS ) {
442                 e = &r;
443                 goto done;
444         }
445
446         if ( BACKSQL_CHECK_SCHEMA( bi ) ) {
447                 char            textbuf[ SLAP_TEXT_BUFLEN ] = { '\0' };
448
449                 backsql_entry_clean( op, &r );
450                 (void)backsql_free_entryID( op, &e_id, 0 );
451
452                 bsi.bsi_e = &r;
453                 rs->sr_err = backsql_init_search( &bsi, &new_ndn,
454                                 LDAP_SCOPE_BASE, 
455                                 (time_t)(-1), NULL, dbh, op, rs,
456                                 slap_anlist_all_attributes,
457                                 ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
458                 switch ( rs->sr_err ) {
459                 case LDAP_SUCCESS:
460                         break;
461
462                 case LDAP_REFERRAL:
463                         if ( manageDSAit && !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
464                                         dn_match( &new_ndn, &bsi.bsi_e->e_nname ) )
465                         {
466                                 rs->sr_err = LDAP_SUCCESS;
467                                 rs->sr_text = NULL;
468                                 rs->sr_matched = NULL;
469                                 if ( rs->sr_ref ) {
470                                         ber_bvarray_free( rs->sr_ref );
471                                         rs->sr_ref = NULL;
472                                 }
473                                 break;
474                         }
475                         e = &r;
476                         /* fallthru */
477
478                 default:
479                         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
480                                 "could not retrieve modrdnDN ID - no such entry\n", 
481                                 0, 0, 0 );
482                         if ( !BER_BVISNULL( &r.e_nname ) ) {
483                                 /* FIXME: should always be true! */
484                                 e = &r;
485
486                         } else {
487                                 e = NULL;
488                         }
489                         goto done;
490                 }
491
492                 e_id = bsi.bsi_base_id;
493
494                 rs->sr_err = entry_schema_check( op, &r, NULL, 0,
495                         &rs->sr_text, textbuf, sizeof( textbuf ) );
496                 if ( rs->sr_err != LDAP_SUCCESS ) {
497                         Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "
498                                 "entry failed schema check -- aborting\n",
499                                 r.e_name.bv_val, 0, 0 );
500                         e = NULL;
501                         goto done;
502                 }
503         }
504
505 done:;
506 #ifdef SLAP_ACL_HONOR_DISCLOSE
507         if ( e != NULL ) {
508                 if ( !access_allowed( op, e, slap_schema.si_ad_entry, NULL,
509                                         ACL_DISCLOSE, NULL ) )
510                 {
511                         rs->sr_err = LDAP_NO_SUCH_OBJECT;
512                         rs->sr_text = NULL;
513                         rs->sr_matched = NULL;
514                         if ( rs->sr_ref ) {
515                                 ber_bvarray_free( rs->sr_ref );
516                                 rs->sr_ref = NULL;
517                         }
518                 }
519         }
520 #endif /* SLAP_ACL_HONOR_DISCLOSE */
521
522         send_ldap_result( op, rs );
523
524         /*
525          * Commit only if all operations succeed
526          */
527         if ( sth != SQL_NULL_HSTMT ) {
528                 SQLUSMALLINT    CompletionType = SQL_ROLLBACK;
529         
530                 if ( rs->sr_err == LDAP_SUCCESS && !op->o_noop ) {
531                         CompletionType = SQL_COMMIT;
532                 }
533
534                 SQLTransact( SQL_NULL_HENV, dbh, CompletionType );
535         }
536
537         if ( !BER_BVISNULL( &realnew_dn ) && realnew_dn.bv_val != new_dn.bv_val ) {
538                 ch_free( realnew_dn.bv_val );
539         }
540
541         if ( !BER_BVISNULL( &new_dn ) ) {
542                 slap_sl_free( new_dn.bv_val, op->o_tmpmemctx );
543         }
544         
545         if ( !BER_BVISNULL( &new_ndn ) ) {
546                 slap_sl_free( new_ndn.bv_val, op->o_tmpmemctx );
547         }
548         
549         /* LDAP v2 supporting correct attribute handling. */
550         if ( new_rdn != NULL ) {
551                 ldap_rdnfree( new_rdn );
552         }
553         if ( old_rdn != NULL ) {
554                 ldap_rdnfree( old_rdn );
555         }
556         if ( mod != NULL ) {
557                 Modifications *tmp;
558                 for (; mod; mod = tmp ) {
559                         tmp = mod->sml_next;
560                         free( mod );
561                 }
562         }
563
564         if ( !BER_BVISNULL( &e_id.eid_ndn ) ) {
565                 (void)backsql_free_entryID( op, &e_id, 0 );
566         }
567
568         if ( !BER_BVISNULL( &n_id.eid_ndn ) ) {
569                 (void)backsql_free_entryID( op, &n_id, 0 );
570         }
571
572         if ( !BER_BVISNULL( &r.e_nname ) ) {
573                 backsql_entry_clean( op, &r );
574         }
575
576         if ( !BER_BVISNULL( &p.e_nname ) ) {
577                 backsql_entry_clean( op, &p );
578         }
579
580         if ( !BER_BVISNULL( &n.e_nname ) ) {
581                 backsql_entry_clean( op, &n );
582         }
583
584         Debug( LDAP_DEBUG_TRACE, "<==backsql_modrdn()\n", 0, 0, 0 );
585
586         return rs->sr_err;
587 }
588