]> git.sur5r.net Git - openldap/commitdiff
import fix to ITS#3244
authorPierangelo Masarati <ando@openldap.org>
Sun, 18 Jul 2004 08:35:46 +0000 (08:35 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sun, 18 Jul 2004 08:35:46 +0000 (08:35 +0000)
CHANGES
servers/slapd/slapadd.c
servers/slapd/slapcommon.c

diff --git a/CHANGES b/CHANGES
index 198a77cd43ca5a55bd73e0dd81fd178fba9ef096..99057dac10086fa61c18828c5fe698cf9de0d70c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -15,6 +15,7 @@ OpenLDAP 2.2.15 Engineering
        Fixed slapd abandon/cancel pending bug
        Fixed slapd attribute description syntax bug
        Fixed slapd ACI caching bug (caching disabled, ITS#3215)
+       Fixed slapadd dryrun mode (ITS#3244)
        Fixed libldap SASL re-encode bug
        Fixed libldap sasl_encode 64-bit bug (ITS#3054,3212)
        Fixed libldap matchedValues parsing bug (ITS#3208,3216)
index 54421f5fba8fb877586c8c3ce3fb273735321f8a..a0db92e24d1af7678f636d436fd45f9fc30118e9 100644 (file)
@@ -94,13 +94,15 @@ slapadd( int argc, char **argv )
        {
                fprintf( stderr, "%s: database doesn't support necessary operations.\n",
                        progname );
-               exit( EXIT_FAILURE );
+               if ( !dryrun ) {
+                       exit( EXIT_FAILURE );
+               }
        }
 
        lmax = 0;
        lineno = 0;
 
-       if( be->be_entry_open( be, 1 ) != 0 ) {
+       if( !dryrun && be->be_entry_open( be, 1 ) != 0 ) {
                fprintf( stderr, "%s: could not open database.\n",
                        progname );
                exit( EXIT_FAILURE );
@@ -308,6 +310,13 @@ slapadd( int argc, char **argv )
                        }
                }
 
+               if ( dryrun ) {
+                       if ( verbose ) {
+                               fprintf( stderr, "(dry) added: \"%s\"\n", e->e_dn );
+                       }
+                       goto done;
+               }
+
                if ( update_ctxcsn == SLAP_TOOL_CTXCSN_KEEP &&
                        ( replica_promotion || replica_demotion )) {
                        if ( is_entry_syncProviderSubentry( e )) { 
@@ -404,8 +413,12 @@ slapadd( int argc, char **argv )
                }
 
                if (( !is_entry_syncProviderSubentry( e ) &&
-                        !is_entry_syncConsumerSubentry( e )) ||
-                        ( !replica_promotion && !replica_demotion )) {
+                                !is_entry_syncConsumerSubentry( e )) ||
+                                ( !replica_promotion && !replica_demotion ))
+               {
+                       /* dryrun moved earlier */
+                       assert( !dryrun );
+
                        if (!dryrun) {
                                ID id = be->be_entry_put( be, e, &bvtext );
                                if( id == NOID ) {
@@ -429,6 +442,7 @@ slapadd( int argc, char **argv )
                        }
                }
 
+done:;
                entry_free( e );
        }
 
@@ -471,6 +485,10 @@ slapadd( int argc, char **argv )
                
                        if ( ctxcsn_id == NOID ) {
                                ctxcsn_e = slap_create_context_csn_entry( be, &maxcsn );
+                               
+                               /* dryrun moved earlier */
+                               assert( !dryrun );
+
                                if ( !dryrun ) {
                                        ctxcsn_id = be->be_entry_put( be, ctxcsn_e, &bvtext );
                                        if( ctxcsn_id == NOID ) {
@@ -496,6 +514,10 @@ slapadd( int argc, char **argv )
                                        AC_MEMCPY( attr->a_vals[0].bv_val, maxcsn.bv_val, maxcsn.bv_len );
                                        attr->a_vals[0].bv_val[maxcsn.bv_len] = '\0';
                                        attr->a_vals[0].bv_len = maxcsn.bv_len;
+                               
+                                       /* dryrun moved earlier */
+                                       assert( !dryrun );
+
                                        if ( !dryrun ) {
                                                ctxcsn_id = be->be_entry_modify( be, ctxcsn_e, &bvtext );
                                                if( ctxcsn_id == NOID ) {
@@ -547,8 +569,12 @@ slapadd( int argc, char **argv )
 
                        if ( ctxcsn_id == NOID ) {
                                ctxcsn_e = slap_create_syncrepl_entry( be, &mc,
-                                                                                               &slap_syncrepl_cn_bv,
-                                                                                               &slap_syncrepl_bv );
+                                               &slap_syncrepl_cn_bv,
+                                               &slap_syncrepl_bv );
+
+                               /* dryrun moved earlier */
+                               assert( !dryrun );
+
                                if ( !dryrun ) {
                                        ctxcsn_id = be->be_entry_put( be, ctxcsn_e, &bvtext );
                                        if( ctxcsn_id == NOID ) {
@@ -575,6 +601,10 @@ slapadd( int argc, char **argv )
                                        AC_MEMCPY( attr->a_vals[0].bv_val, mc.bv_val, mc.bv_len );
                                        attr->a_vals[0].bv_val[maxcsn.bv_len] = '\0';
                                        attr->a_vals[0].bv_len = maxcsn.bv_len;
+                               
+                                       /* dryrun moved earlier */
+                                       assert( !dryrun );
+
                                        if ( !dryrun ) {
                                                ctxcsn_id = be->be_entry_modify( be,
                                                                                        ctxcsn_e, &bvtext );
@@ -615,7 +645,11 @@ slapadd( int argc, char **argv )
 
                        if ( ctxcsn_id == NOID ) {
                                ctxcsn_e = slap_create_syncrepl_entry( be, &sei->cookie,
-                                                                                               &sei->rdn, &sei->cn );
+                                               &sei->rdn, &sei->cn );
+
+                               /* dryrun moved earlier */
+                               assert( !dryrun );
+
                                if ( !dryrun ) {
                                        ctxcsn_id = be->be_entry_put( be, ctxcsn_e, &bvtext );
                                        if( ctxcsn_id == NOID ) {
@@ -642,6 +676,10 @@ slapadd( int argc, char **argv )
                                        AC_MEMCPY( attr->a_vals[0].bv_val, sei->cookie.bv_val, sei->cookie.bv_len );
                                        attr->a_vals[0].bv_val[sei->cookie.bv_len] = '\0';
                                        attr->a_vals[0].bv_len = sei->cookie.bv_len;
+                                       
+                                       /* dryrun moved earlier */
+                                       assert( !dryrun );
+
                                        if ( !dryrun ) {
                                                ctxcsn_id = be->be_entry_modify( be,
                                                                                        ctxcsn_e, &bvtext );
@@ -689,10 +727,14 @@ slapadd( int argc, char **argv )
 
        ch_free( buf );
 
-       if( be->be_entry_close( be )) rc = EXIT_FAILURE;
+       if ( !dryrun ) {
+               if( be->be_entry_close( be ) ) {
+                       rc = EXIT_FAILURE;
+               }
 
-       if( be->be_sync ) {
-               be->be_sync( be );
+               if( be->be_sync ) {
+                       be->be_sync( be );
+               }
        }
 
        slap_tool_destroy();
index a04be91af650278b5f438c420c7086b36abf9e00..b81566e0b65a7976bd50af8f741679af728a1cd6 100644 (file)
@@ -448,7 +448,7 @@ slap_tool_init(
        mal_leaktrace(1);
 #endif
 
-       if ( slap_startup( be ) ) {
+       if ( !dryrun && slap_startup( be ) ) {
                fprintf( stderr, "slap_startup failed\n" );
                exit( EXIT_FAILURE );
        }
@@ -456,7 +456,9 @@ slap_tool_init(
 
 void slap_tool_destroy( void )
 {
-       slap_shutdown( be );
+       if ( !dryrun ) {
+               slap_shutdown( be );
+       }
        slap_destroy();
 #ifdef SLAPD_MODULES
        if ( slapMode == SLAP_SERVER_MODE ) {