]> git.sur5r.net Git - openldap/commitdiff
Fix cascading deletes
authorHoward Chu <hyc@openldap.org>
Fri, 14 Jan 2005 05:11:38 +0000 (05:11 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 14 Jan 2005 05:11:38 +0000 (05:11 +0000)
servers/slapd/syncrepl.c

index 93a5d3b35e1218e436c1c1387b603a4d4cd0bd11..035135befc95336149c233c34cd5270bb03c14ec 100644 (file)
@@ -430,10 +430,8 @@ do_syncrep1(
                        slap_sync_cookie_free( sc, 1 );
                }
 
-               if ( !BER_BVISNULL( &si->si_syncCookie.ctxcsn )) {
-                       slap_compose_sync_cookie( NULL, &si->si_syncCookie.octet_str,
-                               &si->si_syncCookie.ctxcsn, si->si_syncCookie.rid );
-               }
+               slap_compose_sync_cookie( NULL, &si->si_syncCookie.octet_str,
+                       &si->si_syncCookie.ctxcsn, si->si_syncCookie.rid );
        }
 
        rc = ldap_sync_search( si, op->o_tmpmemctx );
@@ -1512,11 +1510,6 @@ syncrepl_del_nonpresent(
        SlapReply       rs_modify = {REP_RESULT};
        struct nonpresent_entry *np_list, *np_prev;
        int rc;
-       Modifications *ml;
-       Modifications *mlnext;
-       Modifications *mod;
-       Modifications *modlist = NULL;
-       Modifications **modtail;
        AttributeName   an[2];
 
        struct berval pdn = BER_BVNULL;
@@ -1583,6 +1576,9 @@ syncrepl_del_nonpresent(
        op->o_nocaching = 0;
 
        if ( !LDAP_LIST_EMPTY( &si->si_nonpresentlist ) ) {
+
+               slap_queue_csn( op, &si->si_syncCookie.ctxcsn );
+
                np_list = LDAP_LIST_FIRST( &si->si_nonpresentlist );
                while ( np_list != NULL ) {
                        LDAP_LIST_REMOVE( np_list, npe_link );
@@ -1597,32 +1593,25 @@ syncrepl_del_nonpresent(
                        rc = op->o_bd->be_delete( op, &rs_delete );
 
                        if ( rs_delete.sr_err == LDAP_NOT_ALLOWED_ON_NONLEAF ) {
-                               modtail = &modlist;
-                               mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ));
-                               mod->sml_op = LDAP_MOD_REPLACE;
-                               mod->sml_desc = slap_schema.si_ad_objectClass;
-                               mod->sml_type = mod->sml_desc->ad_cname;
-                               mod->sml_values = &gcbva[0];
-                               *modtail = mod;
-                               modtail = &mod->sml_next;
-
-                               mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ));
-                               mod->sml_op = LDAP_MOD_REPLACE;
-                               mod->sml_desc = slap_schema.si_ad_structuralObjectClass;
-                               mod->sml_type = mod->sml_desc->ad_cname;
-                               mod->sml_values = &gcbva[1];
-                               *modtail = mod;
-                               modtail = &mod->sml_next;
+                               Modifications mod1, mod2;
+                               mod1.sml_op = LDAP_MOD_REPLACE;
+                               mod1.sml_desc = slap_schema.si_ad_objectClass;
+                               mod1.sml_type = mod1.sml_desc->ad_cname;
+                               mod1.sml_values = &gcbva[0];
+                               mod1.sml_nvalues = NULL;
+                               mod1.sml_next = &mod2;
+
+                               mod2.sml_op = LDAP_MOD_REPLACE;
+                               mod2.sml_desc = slap_schema.si_ad_structuralObjectClass;
+                               mod2.sml_type = mod2.sml_desc->ad_cname;
+                               mod2.sml_values = &gcbva[1];
+                               mod2.sml_nvalues = NULL;
+                               mod2.sml_next = NULL;
 
                                op->o_tag = LDAP_REQ_MODIFY;
-                               op->orm_modlist = modlist;
+                               op->orm_modlist = &mod1;
 
                                rc = be->be_modify( op, &rs_modify );
-
-                               for ( ml = modlist; ml != NULL; ml = mlnext ) {
-                                       mlnext = ml->sml_next;
-                                       free( ml );
-                               }
                        }
 
                        org_managedsait = get_manageDSAit( op );
@@ -1656,6 +1645,8 @@ syncrepl_del_nonpresent(
                        BER_BVZERO( &op->o_req_ndn );
                        ch_free( np_prev );
                }
+
+               slap_graduate_commit_csn( op );
        }
 
        return;