]> git.sur5r.net Git - openldap/commitdiff
Context CSN Patch (4)
authorJong Hyuk Choi <jongchoi@openldap.org>
Mon, 25 Aug 2003 22:23:49 +0000 (22:23 +0000)
committerJong Hyuk Choi <jongchoi@openldap.org>
Mon, 25 Aug 2003 22:23:49 +0000 (22:23 +0000)
- context csn management for modrdn
- call slap_mods_opattrs() for moved entries as well

servers/slapd/back-bdb/modrdn.c
servers/slapd/modrdn.c

index 76ab5ee9c57272cc7f6aeee08300e3b0ca9ce06f..8f20bd0c4294c4d9d0e3d055b6b53a865ef8f536 100644 (file)
@@ -54,8 +54,12 @@ bdb_modrdn( Operation        *op, SlapReply *rs )
        int             num_retries = 0;
 
 #ifdef LDAP_SYNC
-        Operation *ps_list;
+       Operation *ps_list;
        struct psid_entry *pm_list, *pm_prev;
+       int     rc;
+       EntryInfo       *suffix_ei;
+       Entry           *ctxcsn_e;
+       int                     ctxcsn_added = 0;
 #endif
 
 #ifdef NEW_LOGGING
@@ -89,13 +93,13 @@ retry:      /* transaction retry */
 #endif
 
 #ifdef LDAP_SYNC
-                pm_list = LDAP_LIST_FIRST(&op->o_pm_list);
-                while ( pm_list != NULL ) {
-                        LDAP_LIST_REMOVE ( pm_list, ps_link );
+               pm_list = LDAP_LIST_FIRST(&op->o_pm_list);
+               while ( pm_list != NULL ) {
+                       LDAP_LIST_REMOVE ( pm_list, ps_link );
                        pm_prev = pm_list;
-                        pm_list = LDAP_LIST_NEXT ( pm_list, ps_link );
+                       pm_list = LDAP_LIST_NEXT ( pm_list, ps_link );
                        ch_free( pm_prev );
-                }
+               }
 #endif
 
                rs->sr_err = TXN_ABORT( ltid );
@@ -911,6 +915,16 @@ retry:     /* transaction retry */
                goto return_results;
        }
 
+#ifdef LDAP_SYNC
+       rc = bdb_csn_commit( op, rs, ltid, ei, &suffix_ei, &ctxcsn_e, &ctxcsn_added, locker );
+       switch ( rc ) {
+       case BDB_CSN_ABORT :
+               goto return_results;
+       case BDB_CSN_RETRY :
+               goto retry;
+       }
+#endif
+
        if( op->o_noop ) {
                if(( rs->sr_err=TXN_ABORT( ltid )) != 0 ) {
                        rs->sr_text = "txn_abort (no-op) failed";
@@ -928,8 +942,21 @@ retry:     /* transaction retry */
                if(( rs->sr_err=TXN_PREPARE( ltid, gid )) != 0 ) {
                        rs->sr_text = "txn_prepare failed";
                } else {
+#ifdef LDAP_SYNC
+                       struct berval ctx_nrdn;
+#endif
+
                        bdb_cache_modrdn( save, &op->orr_nnewrdn, e, neip,
                                bdb->bi_dbenv, locker, &lock );
+
+#ifdef LDAP_SYNC
+                       if ( ctxcsn_added ) {
+                               ctx_nrdn.bv_val = "cn=ldapsync";
+                               ctx_nrdn.bv_len = strlen( ctx_nrdn.bv_val );
+                               bdb_cache_add( bdb, suffix_ei, ctxcsn_e, &ctx_nrdn, locker );
+                       }
+#endif
+
                        if(( rs->sr_err=TXN_COMMIT( ltid, 0 )) != 0 ) {
                                rs->sr_text = "txn_commit failed";
                        } else {
index c901dd3434260d6b514823b0ab09bf5f4a167b4f..4f8551a53edde63b1ff546bf39b5d88510cd1c64 100644 (file)
@@ -416,6 +416,11 @@ do_modrdn(
 #endif /* defined( LDAP_SLAPI ) */
 
 cleanup:
+
+#ifdef LDAP_SYNC
+       slap_graduate_commit_csn( op );
+#endif
+
        op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
        op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
 
@@ -438,11 +443,15 @@ slap_modrdn2mods(
        Modifications   **pmod )
 {
        Modifications   *mod = NULL;
+       Modifications   **modtail = &mod;
        int             a_cnt, d_cnt;
+       int repl_user;
 
        assert( new_rdn != NULL );
        assert( !op->orr_deleteoldrdn || old_rdn != NULL );
 
+       repl_user = be_isupdate( op->o_bd, &op->o_ndn );
+
        /* Add new attribute values to the entry */
        for ( a_cnt = 0; new_rdn[a_cnt]; a_cnt++ ) {
                AttributeDescription    *desc = NULL;
@@ -578,6 +587,21 @@ slap_modrdn2mods(
        }
        
 done:
+
+       if ( !repl_user ) {
+               char textbuf[ SLAP_TEXT_BUFLEN ];
+               size_t textlen = sizeof textbuf;
+
+               for( modtail = &mod;
+                       *modtail != NULL;
+                       modtail = &(*modtail)->sml_next )
+               {
+                       /* empty */
+               }
+
+               rs->sr_err = slap_mods_opattrs( op, mod, modtail, &rs->sr_text, textbuf, textlen );
+       }
+
        /* LDAP v2 supporting correct attribute handling. */
        if ( rs->sr_err != LDAP_SUCCESS && mod != NULL ) {
                Modifications *tmp;