static int ava_comp_candidates ( Operation *op, MDB_txn *rtxn, AttributeAssertion *ava, AttributeAliasing *aa, ID *ids, ID *tmp, ID *stack ) { MatchingRuleAssertion mra; mra.ma_rule = ava->aa_desc->ad_type->sat_equality; if ( !mra.ma_rule ) { MDB_IDL_ALL( ids ); return 0; } mra.ma_desc = aa->aa_aliased_ad; mra.ma_rule = ava->aa_desc->ad_type->sat_equality; return comp_candidates ( op, rtxn, &mra, ava->aa_cf, ids, tmp, stack ); }
static int ava_comp_candidates ( Operation *op, DB_TXN *rtxn, AttributeAssertion *ava, AttributeAliasing *aa, ID *ids, ID *tmp, ID *stack ) { MatchingRuleAssertion mra; mra.ma_rule = ava->aa_desc->ad_type->sat_equality; if ( !mra.ma_rule ) { struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private; BDB_IDL_ALL( bdb, ids ); return 0; } mra.ma_desc = aa->aa_aliased_ad; mra.ma_rule = ava->aa_desc->ad_type->sat_equality; return comp_candidates ( op, rtxn, &mra, ava->aa_cf, ids, tmp, stack ); }
static int ext_candidates( Operation *op, MDB_txn *rtxn, MatchingRuleAssertion *mra, ID *ids, ID *tmp, ID *stack) { #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; ID id; MDB_IDL_ZERO( ids ); if ( mra->ma_rule == slap_schema.si_mr_distinguishedNameMatch ) { base: rc = mdb_dn2id( op, rtxn, NULL, &mra->ma_value, &id, NULL, NULL, NULL ); if ( rc == MDB_SUCCESS ) { mdb_idl_insert( ids, id ); } 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 ) { mdb_dn2sups( op, rtxn, &mra->ma_value, ids ); 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 goto base; /* scope = LDAP_SCOPE_BASE; */ #if 0 if ( scope > LDAP_SCOPE_BASE ) { ei = NULL; rc = mdb_cache_find_ndn( op, rtxn, &mra->ma_value, &ei ); if ( ei ) mdb_cache_entryinfo_unlock( ei ); if ( rc == LDAP_SUCCESS ) { int sc = op->ors_scope; op->ors_scope = scope; rc = mdb_dn2idl( op, rtxn, &mra->ma_value, ei, ids, stack ); op->ors_scope = sc; } return 0; } #endif } } MDB_IDL_ALL( ids ); return 0; }
static int comp_list_candidates( Operation *op, MDB_txn *rtxn, MatchingRuleAssertion* mra, ComponentFilter *flist, int ftype, ID *ids, ID *tmp, ID *save ) { int rc = 0; ComponentFilter *f; Debug( LDAP_DEBUG_FILTER, "=> comp_list_candidates 0x%x\n", ftype, 0, 0 ); for ( f = flist; f != NULL; f = f->cf_next ) { /* ignore precomputed scopes */ if ( f->cf_choice == SLAPD_FILTER_COMPUTED && f->cf_result == LDAP_SUCCESS ) { continue; } MDB_IDL_ZERO( save ); rc = comp_candidates( op, rtxn, mra, f, save, tmp, save+MDB_IDL_UM_SIZE ); if ( rc != 0 ) { if ( ftype == LDAP_COMP_FILTER_AND ) { rc = 0; continue; } break; } if ( ftype == LDAP_COMP_FILTER_AND ) { if ( f == flist ) { MDB_IDL_CPY( ids, save ); } else { mdb_idl_intersection( ids, save ); } if( MDB_IDL_IS_ZERO( ids ) ) break; } else { if ( f == flist ) { MDB_IDL_CPY( ids, save ); } else { mdb_idl_union( ids, save ); } } } if( rc == LDAP_SUCCESS ) { Debug( LDAP_DEBUG_FILTER, "<= comp_list_candidates: id=%ld first=%ld last=%ld\n", (long) ids[0], (long) MDB_IDL_FIRST(ids), (long) MDB_IDL_LAST(ids) ); } else { Debug( LDAP_DEBUG_FILTER, "<= comp_list_candidates: undefined rc=%d\n", rc, 0, 0 ); } return rc; }
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; }