]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/modrdn.c
Cleanup prev commit
[openldap] / servers / slapd / back-bdb / modrdn.c
index 23d28810af3d4262c9c234a5a1bcab458ef72d71..1497a19822f5ac2c82003eea9f37171ce3635837 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2006 The OpenLDAP Foundation.
+ * Copyright 2000-2007 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -61,6 +61,10 @@ bdb_modrdn( Operation        *op, SlapReply *rs )
        int parent_is_glue = 0;
        int parent_is_leaf = 0;
 
+#ifdef LDAP_X_TXN
+       int settle = 0;
+#endif
+
        Debug( LDAP_DEBUG_TRACE, "==>" LDAP_XSTRING(bdb_modrdn) "(%s,%s,%s)\n",
                op->o_req_dn.bv_val,op->oq_modrdn.rs_newrdn.bv_val,
                op->oq_modrdn.rs_newSup ? op->oq_modrdn.rs_newSup->bv_val : "NULL" );
@@ -69,11 +73,15 @@ bdb_modrdn( Operation       *op, SlapReply *rs )
        if( op->o_txnSpec ) {
                /* acquire connection lock */
                ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
-               if( op->o_conn->c_txn == 0 ) {
+               if( op->o_conn->c_txn == CONN_TXN_INACTIVE ) {
                        rs->sr_text = "invalid transaction identifier";
                        rs->sr_err = LDAP_X_TXN_ID_INVALID;
                        goto txnReturn;
+               } else if( op->o_conn->c_txn == CONN_TXN_SETTLE ) {
+                       settle=1;
+                       goto txnReturn;
                }
+
                if( op->o_conn->c_txn_backend == NULL ) {
                        op->o_conn->c_txn_backend = op->o_bd;
 
@@ -86,14 +94,16 @@ bdb_modrdn( Operation       *op, SlapReply *rs )
                /* insert operation into transaction */
 
                rs->sr_text = "transaction specified";
-               rs->sr_err = LDAP_SUCCESS;
+               rs->sr_err = LDAP_X_TXN_SPECIFY_OKAY;
 
 txnReturn:
                /* release connection lock */
                ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
 
-               send_ldap_result( op, rs );
-               return rs->sr_err;
+               if( !settle ) {
+                       send_ldap_result( op, rs );
+                       return rs->sr_err;
+               }
        }
 #endif
 
@@ -568,8 +578,12 @@ retry:     /* transaction retry */
                {
                        Debug( LDAP_DEBUG_TRACE,        
                                "<=- " LDAP_XSTRING(bdb_modrdn)
-                               ": post-read failed!\n", 0, 0, 0 );
-                       goto return_results;
+                               ": pre-read failed!\n", 0, 0, 0 );
+                       if ( op->o_preread & SLAP_CONTROL_CRITICAL ) {
+                               /* FIXME: is it correct to abort
+                                * operation if control fails? */
+                               goto return_results;
+                       }
                }                   
        }
 
@@ -707,7 +721,11 @@ retry:     /* transaction retry */
                        Debug( LDAP_DEBUG_TRACE,        
                                "<=- " LDAP_XSTRING(bdb_modrdn)
                                ": 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;
+                       }
                }                   
        }
 
@@ -765,7 +783,7 @@ return_results:
        }
        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,
                        bdb->bi_txn_cp_kbyte, bdb->bi_txn_cp_min, 0 );
        }
@@ -801,11 +819,11 @@ done:
        }
        op->o_private = NULL;
 
-       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, 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, op->o_tmpmemctx );
        }