+
+saveit:
+#ifdef SLAP_IDL_CACHE
+ if ( cx->bdb->bi_idl_cache_max_size ) {
+ bdb_idl_cache_put( cx->bdb, cx->db, &cx->key, cx->tmp, cx->rc );
+ }
+#endif
+ ;
+gotit:
+ if ( !BDB_IDL_IS_ZERO( cx->tmp )) {
+ if ( cx->prefix == DN_SUBTREE_PREFIX ) {
+ if (cx->ei->bei_state & CACHE_ENTRY_NO_GRANDKIDS) {
+ bdb_idl_union( cx->ids, cx->tmp );
+ } else {
+ ID *save, idcurs;
+ EntryInfo *ei = cx->ei;
+ int nokids = 1;
+ save = cx->op->o_tmpalloc( BDB_IDL_SIZEOF( cx->tmp ),
+ cx->op->o_tmpmemctx );
+ BDB_IDL_CPY( save, cx->tmp );
+ bdb_idl_union( cx->ids, cx->tmp );
+
+ idcurs = 0;
+ for ( cx->id = bdb_idl_first( save, &idcurs );
+ cx->id != NOID;
+ cx->id = bdb_idl_next( save, &idcurs )) {
+ cx->ei = NULL;
+ hdb_dn2idl_internal( cx );
+ if ( !BDB_IDL_IS_ZERO( cx->tmp ))
+ nokids = 0;
+ }
+ cx->op->o_tmpfree( save, cx->op->o_tmpmemctx );
+ if ( nokids ) ei->bei_state |= CACHE_ENTRY_NO_GRANDKIDS;
+ }
+ /* Make sure caller knows it had kids! */
+ cx->tmp[0]=1;
+
+ cx->rc = 0;
+ } else {
+ BDB_IDL_CPY( cx->ids, cx->tmp );
+ }
+ }
+ return cx->rc;
+}
+
+int
+hdb_dn2idl(
+ Operation *op,
+ Entry *e,
+ ID *ids,
+ ID *stack )
+{
+ struct bdb_info *bdb = (struct bdb_info *)op->o_bd->be_private;
+ struct dn2id_cookie cx;
+
+#ifdef NEW_LOGGING
+ LDAP_LOG ( INDEX, ARGS,
+ "=> hdb_dn2ididl( \"%s\" )\n", e->e_nname.bv_val, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "=> hdb_dn2idl( \"%s\" )\n", e->e_nname.bv_val, 0, 0 );
+#endif
+
+#ifndef BDB_MULTIPLE_SUFFIXES
+ if ( op->ors_scope != LDAP_SCOPE_ONELEVEL &&
+ BEI(e)->bei_parent->bei_id == 0 )
+ {
+ BDB_IDL_ALL( bdb, ids );
+ return 0;
+ }
+#endif
+
+ cx.id = e->e_id;
+ cx.ei = e->e_id ? BEI(e) : &bdb->bi_cache.c_dntree;
+ cx.bdb = bdb;
+ cx.db = cx.bdb->bi_dn2id->bdi_db;
+ cx.prefix = op->ors_scope == LDAP_SCOPE_ONELEVEL
+ ? DN_ONE_PREFIX : DN_SUBTREE_PREFIX;
+ cx.ids = ids;
+ cx.buf = stack;
+ cx.op = op;
+
+ BDB_IDL_ZERO( ids );
+ if ( cx.prefix == DN_SUBTREE_PREFIX ) {
+ bdb_idl_insert( ids, cx.id );
+ }
+
+ DBTzero(&cx.key);
+ cx.key.data = &cx.id;
+ cx.key.ulen = sizeof(ID);
+ cx.key.size = sizeof(ID);
+ cx.key.flags = DB_DBT_USERMEM;
+
+ DBTzero(&cx.data);
+
+ return hdb_dn2idl_internal(&cx);