- if ( cx->rc == 0 ) {
- /* If eilist is NULL, cx->tmp is empty... */
- if ( cx->prefix == DN_SUBTREE_PREFIX && eilist ) {
- bdb_idl_union( cx->ids, cx->tmp );
- for (ptr = eilist; *ptr; ptr++) {
- cx->ei = *ptr;
- cx->id = cx->ei->bei_id;
- hdb_dn2idl_internal( cx );
- cx->op->o_tmpfree( eilist, cx->op->o_tmpmemctx );
+ 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;
+