From 3f9e8eeeec0abf5cd6d84b6d0656e6d2fe232d5d Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 11 Nov 2009 04:03:27 +0000 Subject: [PATCH] ITS#6373 more for subentry creation --- servers/slapd/overlays/syncprov.c | 4 ++-- servers/slapd/slapadd.c | 28 +++++++++++++++++++++++++--- servers/slapd/syncrepl.c | 4 ++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 3486cfa6d3..354867ee65 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -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; diff --git a/servers/slapd/slapadd.c b/servers/slapd/slapadd.c index 1c39b45eed..8dcd79cc17 100644 --- a/servers/slapd/slapadd.c +++ b/servers/slapd/slapadd.c @@ -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 ) { diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index ac0379c8ea..dc765f9777 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -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; -- 2.39.5