/* Since we don't store IDLs for onelevel or subtree, we have to construct * them on the fly... Perhaps the i_kids tree ought to just be an IDL? */ static int insert_one( void *v_n, void *v_ids ) { idNode *n = v_n; ID *ids = v_ids; return bdb_idl_insert(ids, n->i_id); }
static int insert_sub( void *v_n, void *v_ids ) { idNode *n = v_n; ID *ids = v_ids; int rc; rc = bdb_idl_insert(ids, n->i_id); if (rc == 0) { ldap_pvt_thread_rdwr_rlock(&n->i_kids_rdwr); rc = avl_apply(n->i_kids, insert_sub, ids, -1, AVL_INORDER); ldap_pvt_thread_rdwr_runlock(&n->i_kids_rdwr); } return rc; }
void bdb_idl_cache_add_id( struct bdb_info *bdb, DB *db, DBT *key, ID id ) { bdb_idl_cache_entry_t *cache_entry, idl_tmp; DBT2bv( key, &idl_tmp.kstr ); idl_tmp.db = db; ldap_pvt_thread_rdwr_wlock( &bdb->bi_idl_tree_rwlock ); cache_entry = avl_find( bdb->bi_idl_tree, &idl_tmp, bdb_idl_entry_cmp ); if ( cache_entry != NULL ) { if ( !BDB_IDL_IS_RANGE( cache_entry->idl ) && cache_entry->idl[0] < BDB_IDL_DB_MAX ) { size_t s = BDB_IDL_SIZEOF( cache_entry->idl ) + sizeof(ID); cache_entry->idl = ch_realloc( cache_entry->idl, s ); } bdb_idl_insert( cache_entry->idl, id ); } ldap_pvt_thread_rdwr_wunlock( &bdb->bi_idl_tree_rwlock ); }
static int ext_candidates( Operation *op, DB_TXN *rtxn, MatchingRuleAssertion *mra, ID *ids, ID *tmp, ID *stack) { struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private; #ifdef LDAP_COMP_MATCH /* * Currently Only Component Indexing for componentFilterMatch is supported * Indexing for an extensible filter is not supported yet */ if ( mra->ma_cf ) { return comp_candidates ( op, rtxn, mra, mra->ma_cf, ids, tmp, stack); } #endif if ( mra->ma_desc == slap_schema.si_ad_entryDN ) { int rc; EntryInfo *ei; BDB_IDL_ZERO( ids ); if ( mra->ma_rule == slap_schema.si_mr_distinguishedNameMatch ) { ei = NULL; rc = bdb_cache_find_ndn( op, rtxn, &mra->ma_value, &ei ); if ( rc == LDAP_SUCCESS ) bdb_idl_insert( ids, ei->bei_id ); if ( ei ) bdb_cache_entryinfo_unlock( ei ); return 0; } else if ( mra->ma_rule && mra->ma_rule->smr_match == dnRelativeMatch && dnIsSuffix( &mra->ma_value, op->o_bd->be_nsuffix )) { int scope; if ( mra->ma_rule == slap_schema.si_mr_dnSuperiorMatch ) { struct berval pdn; ei = NULL; dnParent( &mra->ma_value, &pdn ); bdb_cache_find_ndn( op, rtxn, &pdn, &ei ); if ( ei ) { bdb_cache_entryinfo_unlock( ei ); while ( ei && ei->bei_id ) { bdb_idl_insert( ids, ei->bei_id ); ei = ei->bei_parent; } } return 0; } if ( mra->ma_rule == slap_schema.si_mr_dnSubtreeMatch ) scope = LDAP_SCOPE_SUBTREE; else if ( mra->ma_rule == slap_schema.si_mr_dnOneLevelMatch ) scope = LDAP_SCOPE_ONELEVEL; else if ( mra->ma_rule == slap_schema.si_mr_dnSubordinateMatch ) scope = LDAP_SCOPE_SUBORDINATE; else scope = LDAP_SCOPE_BASE; if ( scope > LDAP_SCOPE_BASE ) { ei = NULL; rc = bdb_cache_find_ndn( op, rtxn, &mra->ma_value, &ei ); if ( ei ) bdb_cache_entryinfo_unlock( ei ); if ( rc == LDAP_SUCCESS ) { int sc = op->ors_scope; op->ors_scope = scope; rc = bdb_dn2idl( op, rtxn, &mra->ma_value, ei, ids, stack ); op->ors_scope = sc; } return 0; } } } BDB_IDL_ALL( bdb, ids ); return 0; }