MDB_cursor **cursp,
ID id,
struct berval *name,
- struct berval *nname )
+ struct berval *nname,
+ ID *iscopes )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
MDB_dbi dbi = mdb->mi_dn2id;
ptr = data.mv_data;
ptr += data.mv_size - sizeof(ID);
memcpy( &id, ptr, sizeof(ID) );
+ if ( iscopes ) {
+ rc = mdb_idl_search( iscopes, id );
+ if ( iscopes[rc] == id )
+ return MDB_KEYEXIST;
+ }
d = data.mv_data;
nrlen = (d->nrdnlen[0] << 8) | d->nrdnlen[1];
rlen = data.mv_size - sizeof(diskNode) - nrlen;
if (scopes[0].mid > 1) {
cursor = 1;
for (cscope = 1; cscope <= scopes[0].mid; cscope++) {
- /* Ignore the original base */
- if (scopes[cscope].mid == base->e_id)
- continue;
iscopes[cursor++] = scopes[cscope].mid;
}
- iscopes[0] = scopes[0].mid - 1;
+ iscopes[0] = scopes[0].mid;
} else {
iscopes[0] = 0;
}
id = NOID;
else
id = isc.id;
- cscope = 0;
+ cscope = 1; /* skip original base */
} else {
id = mdb_idl_first( candidates, &cursor );
wwctx.mcd = NULL;
pdn = base->e_name;
pndn = base->e_nname;
} else {
- mdb_id2name( op, ltid, &isc.mc, scopes[isc.nscope].mid, &pdn, &pndn );
+ mdb_id2name( op, ltid, &isc.mc, scopes[isc.nscope].mid, &pdn, &pndn, NULL );
}
e->e_name.bv_len = pdn.bv_len;
e->e_nname.bv_len = pndn.bv_len;
mdb_entry_return( op, base );
rs->sr_err = mdb_id2entry(op, mci, isc.id, &base);
if ( !rs->sr_err ) {
- mdb_id2name( op, ltid, &isc.mc, isc.id, &base->e_name, &base->e_nname );
+ rc = mdb_id2name( op, ltid, &isc.mc, isc.id, &base->e_name, &base->e_nname,
+ op->ors_scope == LDAP_SCOPE_SUBTREE ? iscopes : NULL );
+ if ( rc == MDB_KEYEXIST ) {
+ mdb_entry_return( op, base );
+ base = NULL;
+ continue;
+ }
isc.numrdns = 0;
if (isc.oscope == LDAP_SCOPE_ONELEVEL)
isc.oscope = LDAP_SCOPE_BASE;
op.o_tmpmemctx = NULL;
op.o_tmpmfuncs = &ch_mfuncs;
if ( slapMode & SLAP_TOOL_READONLY ) {
- rc = mdb_id2name( &op, mdb_tool_txn, &idcursor, id, &dn, &ndn );
+ rc = mdb_id2name( &op, mdb_tool_txn, &idcursor, id, &dn, &ndn, NULL );
if ( rc ) {
rc = LDAP_OTHER;
if ( e ) {