Diff for /servers/slapd/back-bdb/modrdn.c between versions 1.185 and 1.185.2.15

version 1.185, 2006/03/30 15:59:27 version 1.185.2.15, 2010/04/13 20:23:25
Line 1 Line 1
 /* modrdn.c - bdb backend modrdn routine */  /* modrdn.c - bdb backend modrdn routine */
 /* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/modrdn.c,v 1.184 2006/03/30 15:56:57 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/modrdn.c,v 1.185.2.14 2009/01/22 00:01:05 kurt Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2000-2006 The OpenLDAP Foundation.   * Copyright 2000-2010 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 36  bdb_modrdn( Operation *op, SlapReply *rs Line 36  bdb_modrdn( Operation *op, SlapReply *rs
         char textbuf[SLAP_TEXT_BUFLEN];          char textbuf[SLAP_TEXT_BUFLEN];
         size_t textlen = sizeof textbuf;          size_t textlen = sizeof textbuf;
         DB_TXN          *ltid = NULL, *lt2;          DB_TXN          *ltid = NULL, *lt2;
         struct bdb_op_info opinfo = {0};          struct bdb_op_info opinfo = {{{ 0 }}};
         Entry dummy = {0};          Entry dummy = {0};
   
         Entry           *np = NULL;                     /* newSuperior Entry */          Entry           *np = NULL;                     /* newSuperior Entry */
Line 46  bdb_modrdn( Operation *op, SlapReply *rs Line 46  bdb_modrdn( Operation *op, SlapReply *rs
   
         int             manageDSAit = get_manageDSAit( op );          int             manageDSAit = get_manageDSAit( op );
   
         u_int32_t       locker = 0;  
         DB_LOCK         lock, plock, nplock;          DB_LOCK         lock, plock, nplock;
   
         int             num_retries = 0;          int             num_retries = 0;
Line 134  retry: /* transaction retry */ Line 133  retry: /* transaction retry */
   
                 rs->sr_err = TXN_ABORT( ltid );                  rs->sr_err = TXN_ABORT( ltid );
                 ltid = NULL;                  ltid = NULL;
                 op->o_private = NULL;                  LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next );
                   opinfo.boi_oe.oe_key = NULL;
                 op->o_do_not_cache = opinfo.boi_acl_cache;                  op->o_do_not_cache = opinfo.boi_acl_cache;
                 if( rs->sr_err != 0 ) {                  if( rs->sr_err != 0 ) {
                         rs->sr_err = LDAP_OTHER;                          rs->sr_err = LDAP_OTHER;
Line 163  retry: /* transaction retry */ Line 163  retry: /* transaction retry */
                 goto return_results;                  goto return_results;
         }          }
   
         locker = TXN_ID ( ltid );          opinfo.boi_oe.oe_key = bdb;
   
         opinfo.boi_bdb = op->o_bd;  
         opinfo.boi_txn = ltid;          opinfo.boi_txn = ltid;
         opinfo.boi_locker = locker;  
         opinfo.boi_err = 0;          opinfo.boi_err = 0;
         opinfo.boi_acl_cache = op->o_do_not_cache;          opinfo.boi_acl_cache = op->o_do_not_cache;
         op->o_private = &opinfo;          LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next );
   
         /* get entry */          /* get entry */
         rs->sr_err = bdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1,          rs->sr_err = bdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1,
                 locker, &lock );                  &lock );
   
         switch( rs->sr_err ) {          switch( rs->sr_err ) {
         case 0:          case 0:
Line 303  retry: /* transaction retry */ Line 300  retry: /* transaction retry */
                 dnParent( &e->e_nname, &p_ndn );                  dnParent( &e->e_nname, &p_ndn );
         }          }
         np_ndn = &p_ndn;          np_ndn = &p_ndn;
         if ( p_ndn.bv_len != 0 ) {          eip = ei->bei_parent;
           if ( eip && eip->bei_id ) {
                 /* Make sure parent entry exist and we can write its                   /* Make sure parent entry exist and we can write its 
                  * children.                   * children.
                  */                   */
                 eip = ei->bei_parent;  
                 rs->sr_err = bdb_cache_find_id( op, ltid,                  rs->sr_err = bdb_cache_find_id( op, ltid,
                         eip->bei_id, &eip, 0, locker, &plock );                          eip->bei_id, &eip, 0, &plock );
   
                 switch( rs->sr_err ) {                  switch( rs->sr_err ) {
                 case 0:                  case 0:
Line 418  retry: /* transaction retry */ Line 415  retry: /* transaction retry */
                         /* Get Entry with dn=newSuperior. Does newSuperior exist? */                          /* Get Entry with dn=newSuperior. Does newSuperior exist? */
   
                         rs->sr_err = bdb_dn2entry( op, ltid, np_ndn,                          rs->sr_err = bdb_dn2entry( op, ltid, np_ndn,
                                 &neip, 0, locker, &nplock );                                  &neip, 0, &nplock );
   
                         switch( rs->sr_err ) {                          switch( rs->sr_err ) {
                         case 0: np = neip->bei_e;                          case 0: np = neip->bei_e;
Line 542  retry: /* transaction retry */ Line 539  retry: /* transaction retry */
                 struct berval bv = {0, NULL};                  struct berval bv = {0, NULL};
                 dnNormalize( 0, NULL, NULL, &new_dn, &bv, op->o_tmpmemctx );                  dnNormalize( 0, NULL, NULL, &new_dn, &bv, op->o_tmpmemctx );
                 ber_dupbv( &new_ndn, &bv );                  ber_dupbv( &new_ndn, &bv );
                   /* FIXME: why not call dnNormalize() w/o ctx? */
                   op->o_tmpfree( bv.bv_val, op->o_tmpmemctx );
         }          }
   
         Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(bdb_modrdn) ": new ndn=%s\n",          Debug( LDAP_DEBUG_TRACE, LDAP_XSTRING(bdb_modrdn) ": new ndn=%s\n",
Line 558  retry: /* transaction retry */ Line 557  retry: /* transaction retry */
         case DB_NOTFOUND:          case DB_NOTFOUND:
                 break;                  break;
         case 0:          case 0:
                   /* Allow rename to same DN */
                   if ( nei == ei )
                           break;
                 rs->sr_err = LDAP_ALREADY_EXISTS;                  rs->sr_err = LDAP_ALREADY_EXISTS;
                 goto return_results;                  goto return_results;
         default:          default:
Line 578  retry: /* transaction retry */ Line 580  retry: /* transaction retry */
                 {                  {
                         Debug( LDAP_DEBUG_TRACE,                                  Debug( LDAP_DEBUG_TRACE,        
                                 "<=- " LDAP_XSTRING(bdb_modrdn)                                  "<=- " LDAP_XSTRING(bdb_modrdn)
                                 ": post-read failed!\n", 0, 0, 0 );                                  ": pre-read failed!\n", 0, 0, 0 );
                         goto return_results;                          if ( op->o_preread & SLAP_CONTROL_CRITICAL ) {
                                   /* FIXME: is it correct to abort
                                    * operation if control fails? */
                                   goto return_results;
                           }
                 }                                     }                   
         }          }
   
Line 717  retry: /* transaction retry */ Line 723  retry: /* transaction retry */
                         Debug( LDAP_DEBUG_TRACE,                                  Debug( LDAP_DEBUG_TRACE,        
                                 "<=- " LDAP_XSTRING(bdb_modrdn)                                  "<=- " LDAP_XSTRING(bdb_modrdn)
                                 ": post-read failed!\n", 0, 0, 0 );                                  ": post-read failed!\n", 0, 0, 0 );
                         goto return_results;                          if ( op->o_postread & SLAP_CONTROL_CRITICAL ) {
                                   /* FIXME: is it correct to abort
                                    * operation if control fails? */
                                   goto return_results;
                           }
                 }                                     }                   
         }          }
   
Line 727  retry: /* transaction retry */ Line 737  retry: /* transaction retry */
                 } else {                  } else {
                         rs->sr_err = LDAP_X_NO_OPERATION;                          rs->sr_err = LDAP_X_NO_OPERATION;
                         ltid = NULL;                          ltid = NULL;
                           /* Only free attrs if they were dup'd.  */
                           if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL;
                         goto return_results;                          goto return_results;
                 }                  }
   
         } else {          } else {
                 rc = bdb_cache_modrdn( bdb, e, &op->orr_nnewrdn, &dummy, neip,                  rc = bdb_cache_modrdn( bdb, e, &op->orr_nnewrdn, &dummy, neip,
                         locker, &lock );                          ltid, &lock );
                 switch( rc ) {                  switch( rc ) {
                 case DB_LOCK_DEADLOCK:                  case DB_LOCK_DEADLOCK:
                 case DB_LOCK_NOTGRANTED:                  case DB_LOCK_NOTGRANTED:
Line 750  retry: /* transaction retry */ Line 762  retry: /* transaction retry */
         }          }
     
         ltid = NULL;          ltid = NULL;
         op->o_private = NULL;          LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next );
           opinfo.boi_oe.oe_key = NULL;
     
         if( rs->sr_err != LDAP_SUCCESS ) {          if( rs->sr_err != LDAP_SUCCESS ) {
                 Debug( LDAP_DEBUG_TRACE,                  Debug( LDAP_DEBUG_TRACE,
Line 775  return_results: Line 788  return_results:
         }          }
         send_ldap_result( op, rs );          send_ldap_result( op, rs );
   
         if( rs->sr_err == LDAP_SUCCESS && bdb->bi_txn_cp ) {          if( rs->sr_err == LDAP_SUCCESS && bdb->bi_txn_cp_kbyte ) {
                 TXN_CHECKPOINT( bdb->bi_dbenv,                  TXN_CHECKPOINT( bdb->bi_dbenv,
                         bdb->bi_txn_cp_kbyte, bdb->bi_txn_cp_min, 0 );                          bdb->bi_txn_cp_kbyte, bdb->bi_txn_cp_min, 0 );
         }          }
Line 809  done: Line 822  done:
         if( ltid != NULL ) {          if( ltid != NULL ) {
                 TXN_ABORT( ltid );                  TXN_ABORT( ltid );
         }          }
         op->o_private = NULL;          if ( opinfo.boi_oe.oe_key ) {
                   LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next );
           }
   
         if( preread_ctrl != NULL ) {          if( preread_ctrl != NULL && (*preread_ctrl) != NULL ) {
                 slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );                  slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );
                 slap_sl_free( *preread_ctrl, op->o_tmpmemctx );                  slap_sl_free( *preread_ctrl, op->o_tmpmemctx );
         }          }
         if( postread_ctrl != NULL ) {          if( postread_ctrl != NULL && (*postread_ctrl) != NULL ) {
                 slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );                  slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx );
                 slap_sl_free( *postread_ctrl, op->o_tmpmemctx );                  slap_sl_free( *postread_ctrl, op->o_tmpmemctx );
         }          }

Removed from v.1.185  
changed lines
  Added in v.1.185.2.15


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org