]> git.sur5r.net Git - openldap/commitdiff
ITS#6373 more for subentry creation
authorHoward Chu <hyc@openldap.org>
Wed, 11 Nov 2009 04:03:27 +0000 (04:03 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 11 Nov 2009 04:03:27 +0000 (04:03 +0000)
servers/slapd/overlays/syncprov.c
servers/slapd/slapadd.c
servers/slapd/syncrepl.c

index 3486cfa6d378df038579d0f6c6c95047fa8f4b9a..354867ee6531a9a9021d5c96a07d4f7bc51b7cca 100644 (file)
@@ -1400,8 +1400,8 @@ syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on )
        opm.o_no_schema_check = 1;
        opm.o_bd->be_modify( &opm, &rsm );
 
-       /* Should only happen with SYNC_USE_SUBENTRY */
-       if ( rsm.sr_err == LDAP_NO_SUCH_OBJECT ) {
+       if ( rsm.sr_err == LDAP_NO_SUCH_OBJECT &&
+               SLAP_SYNC_SUBENTRY( opm.o_bd )) {
                const char      *text;
                char txtbuf[SLAP_TEXT_BUFLEN];
                size_t textlen = sizeof txtbuf;
index 1c39b45eed36aa712a59d30e2cb417ae07ba8738..8dcd79cc173707b31aa45ca8ca875ef456c1bc62 100644 (file)
@@ -438,10 +438,32 @@ slapadd( int argc, char **argv )
        }
 
        if ( rc == EXIT_SUCCESS && update_ctxcsn && !dryrun && sid != SLAP_SYNC_SID_MAX + 1 ) {
-               ctxcsn_id = be->be_dn2id_get( be, be->be_nsuffix );
+               struct berval ctxdn;
+               if ( SLAP_SYNC_SUBENTRY( be )) {
+                       build_new_dn( &ctxdn, &be->be_nsuffix[0],
+                               (struct berval *)&slap_ldapsync_cn_bv, NULL );
+               } else {
+                       ctxdn = be->be_nsuffix[0];
+               }
+               ctxcsn_id = be->be_dn2id_get( be, &ctxdn );
                if ( ctxcsn_id == NOID ) {
-                       fprintf( stderr, "%s: context entry is missing\n", progname );
-                       rc = EXIT_FAILURE;
+                       if ( SLAP_SYNC_SUBENTRY( be )) {
+                               ctxcsn_e = slap_create_context_csn_entry( be, NULL );
+                               for ( sid = 0; sid <= SLAP_SYNC_SID_MAX; sid++ ) {
+                                       if ( maxcsn[ sid ].bv_len ) {
+                                               attr_merge_one( ctxcsn_e, slap_schema.si_ad_contextCSN,
+                                                       &maxcsn[ sid ], NULL );
+                                       }
+                               }
+                               ctxcsn_id = be->be_entry_put( be, ctxcsn_e, &bvtext );
+                               if ( ctxcsn_id == NOID ) {
+                                       fprintf( stderr, "%s: couldn't create context entry\n", progname );
+                                       rc = EXIT_FAILURE;
+                               }
+                       } else {
+                               fprintf( stderr, "%s: context entry is missing\n", progname );
+                               rc = EXIT_FAILURE;
+                       }
                } else {
                        ctxcsn_e = be->be_entry_get( be, ctxcsn_id );
                        if ( ctxcsn_e != NULL ) {
index ac0379c8eaf363e725387d307fe42f100d3b53b7..dc765f97774340224928e6d511dc2c9990c79c1e 100644 (file)
@@ -3062,8 +3062,8 @@ syncrepl_updateCookie(
        op->orm_no_opattrs = 1;
        rc = op->o_bd->be_modify( op, &rs_modify );
 
-       /* Should only happen when SYNC_USE_SUBENTRY */
-       if ( rs_modify.sr_err == LDAP_NO_SUCH_OBJECT ) {
+       if ( rs_modify.sr_err == LDAP_NO_SUCH_OBJECT &&
+               SLAP_SYNC_SUBENTRY( op->o_bd )) {
                const char      *text;
                char txtbuf[SLAP_TEXT_BUFLEN];
                size_t textlen = sizeof txtbuf;