X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Ffilterindex.c;h=d5a3108d8f59fea2622560960f26aea141c732b4;hb=9e4a4bc5e3a349f6609e0cec70cd898205d4b2f4;hp=07b269fb29dafd5abd5a9a99d03fb65d3d6c6f6f;hpb=e48f72c1b5a7ce571c7ced749aed473d20b32526;p=openldap diff --git a/servers/slapd/back-bdb/filterindex.c b/servers/slapd/back-bdb/filterindex.c index 07b269fb29..d5a3108d8f 100644 --- a/servers/slapd/back-bdb/filterindex.c +++ b/servers/slapd/back-bdb/filterindex.c @@ -27,59 +27,59 @@ static int presence_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeDescription *desc, ID *ids ); static int equality_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, ID *ids, ID *tmp ); static int inequality_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, ID *ids, ID *tmp, int gtorlt ); static int approx_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, ID *ids, ID *tmp ); static int substring_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, SubstringsAssertion *sub, ID *ids, ID *tmp ); static int list_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, Filter *flist, int ftype, ID *ids, ID *tmp, ID *stack ); -#ifdef LDAP_COMP_MATCH static int ext_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, MatchingRuleAssertion *mra, ID *ids, ID *tmp, ID *stack); +#ifdef LDAP_COMP_MATCH static int comp_candidates ( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, MatchingRuleAssertion *mra, ComponentFilter *f, ID *ids, @@ -89,7 +89,7 @@ comp_candidates ( static int ava_comp_candidates ( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, AttributeAliasing *aa, ID *ids, @@ -100,7 +100,7 @@ ava_comp_candidates ( int bdb_filter_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, Filter *f, ID *ids, ID *tmp, @@ -204,12 +204,10 @@ bdb_filter_candidates( rc = list_candidates( op, locker, f->f_or, LDAP_FILTER_OR, ids, tmp, stack ); break; -#ifdef LDAP_COMP_MATCH case LDAP_FILTER_EXT: Debug( LDAP_DEBUG_FILTER, "\tEXT\n", 0, 0, 0 ); rc = ext_candidates( op, locker, f->f_mra, ids, tmp, stack ); break; -#endif default: Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n", (unsigned long) f->f_choice, 0, 0 ); @@ -233,7 +231,7 @@ out: static int comp_list_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, MatchingRuleAssertion* mra, ComponentFilter *flist, int ftype, @@ -298,7 +296,7 @@ comp_list_candidates( static int comp_equality_candidates ( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, MatchingRuleAssertion *mra, ComponentAssertion *ca, ID *ids, @@ -346,9 +344,6 @@ comp_equality_candidates ( if( rc != LDAP_SUCCESS ) { return 0; } - if ( db == NULL ) { - return 0; - } if( !mr ) { return 0; @@ -412,7 +407,7 @@ comp_equality_candidates ( static int ava_comp_candidates ( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, AttributeAliasing *aa, ID *ids, @@ -436,7 +431,7 @@ ava_comp_candidates ( static int comp_candidates ( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, MatchingRuleAssertion *mra, ComponentFilter *f, ID *ids, @@ -480,34 +475,92 @@ comp_candidates ( return( rc ); } +#endif static int ext_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, 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 ) { - struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private; - BDB_IDL_ALL( bdb, ids ); - return 0; + if ( mra->ma_cf ) { + return comp_candidates ( op, locker, 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, locker, &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, locker, &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, locker, &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, locker, &mra->ma_value, ei, ids, + stack ); + op->ors_scope = sc; + } + return 0; + } + } } - return comp_candidates ( op, locker, mra, mra->ma_cf, ids, tmp, stack); + BDB_IDL_ALL( bdb, ids ); + return 0; } -#endif static int list_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, Filter *flist, int ftype, ID *ids, @@ -573,7 +626,7 @@ list_candidates( static int presence_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeDescription *desc, ID *ids ) { @@ -595,19 +648,19 @@ presence_candidates( rc = bdb_index_param( op->o_bd, desc, LDAP_FILTER_PRESENT, &db, &mask, &prefix ); - if( rc != LDAP_SUCCESS ) { + if( rc == LDAP_INAPPROPRIATE_MATCHING ) { + /* not indexed */ Debug( LDAP_DEBUG_TRACE, - "<= bdb_presence_candidates: (%s) index_param " - "returned=%d\n", - desc->ad_cname.bv_val, rc, 0 ); + "<= bdb_presence_candidates: (%s) not indexed\n", + desc->ad_cname.bv_val, 0, 0 ); return 0; } - if( db == NULL ) { - /* not indexed */ + if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, - "<= bdb_presence_candidates: (%s) not indexed\n", - desc->ad_cname.bv_val, 0, 0 ); + "<= bdb_presence_candidates: (%s) index_param " + "returned=%d\n", + desc->ad_cname.bv_val, rc, 0 ); return 0; } @@ -644,7 +697,7 @@ done: static int equality_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, ID *ids, ID *tmp ) @@ -666,18 +719,18 @@ equality_candidates( rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY, &db, &mask, &prefix ); - if( rc != LDAP_SUCCESS ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_equality_candidates: (%s) " - "index_param failed (%d)\n", - ava->aa_desc->ad_cname.bv_val, rc, 0 ); + "<= bdb_equality_candidates: (%s) not indexed\n", + ava->aa_desc->ad_cname.bv_val, 0, 0 ); return 0; } - if ( db == NULL ) { + if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_equality_candidates: (%s) not indexed\n", - ava->aa_desc->ad_cname.bv_val, 0, 0 ); + "<= bdb_equality_candidates: (%s) " + "index_param failed (%d)\n", + ava->aa_desc->ad_cname.bv_val, rc, 0 ); return 0; } @@ -761,7 +814,7 @@ equality_candidates( static int approx_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, ID *ids, ID *tmp ) @@ -783,18 +836,18 @@ approx_candidates( rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX, &db, &mask, &prefix ); - if( rc != LDAP_SUCCESS ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_approx_candidates: (%s) " - "index_param failed (%d)\n", - ava->aa_desc->ad_cname.bv_val, rc, 0 ); + "<= bdb_approx_candidates: (%s) not indexed\n", + ava->aa_desc->ad_cname.bv_val, 0, 0 ); return 0; } - if ( db == NULL ) { + if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_approx_candidates: (%s) not indexed\n", - ava->aa_desc->ad_cname.bv_val, 0, 0 ); + "<= bdb_approx_candidates: (%s) " + "index_param failed (%d)\n", + ava->aa_desc->ad_cname.bv_val, rc, 0 ); return 0; } @@ -881,7 +934,7 @@ approx_candidates( static int substring_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, SubstringsAssertion *sub, ID *ids, ID *tmp ) @@ -903,18 +956,18 @@ substring_candidates( rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS, &db, &mask, &prefix ); - if( rc != LDAP_SUCCESS ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_substring_candidates: (%s) " - "index_param failed (%d)\n", - sub->sa_desc->ad_cname.bv_val, rc, 0 ); + "<= bdb_substring_candidates: (%s) not indexed\n", + sub->sa_desc->ad_cname.bv_val, 0, 0 ); return 0; } - if ( db == NULL ) { + if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_substring_candidates: (%s) not indexed\n", - sub->sa_desc->ad_cname.bv_val, 0, 0 ); + "<= bdb_substring_candidates: (%s) " + "index_param failed (%d)\n", + sub->sa_desc->ad_cname.bv_val, rc, 0 ); return 0; } @@ -997,7 +1050,7 @@ substring_candidates( static int inequality_candidates( Operation *op, - u_int32_t locker, + BDB_LOCKER locker, AttributeAssertion *ava, ID *ids, ID *tmp, @@ -1020,18 +1073,18 @@ inequality_candidates( rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY, &db, &mask, &prefix ); - if( rc != LDAP_SUCCESS ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_inequality_candidates: (%s) " - "index_param failed (%d)\n", - ava->aa_desc->ad_cname.bv_val, rc, 0 ); + "<= bdb_inequality_candidates: (%s) not indexed\n", + ava->aa_desc->ad_cname.bv_val, 0, 0 ); return 0; } - if ( db == NULL ) { + if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, - "<= bdb_inequality_candidates: (%s) not indexed\n", - ava->aa_desc->ad_cname.bv_val, 0, 0 ); + "<= bdb_inequality_candidates: (%s) " + "index_param failed (%d)\n", + ava->aa_desc->ad_cname.bv_val, rc, 0 ); return 0; }