X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Ffilterindex.c;h=a54ccf7cd16fdcc947eadb8026bac4e4af8edf86;hb=b905811d3c800b6f4031d541e424e5de871aa0c7;hp=d64aa3c024df8abfc552f171b435c3d7e4865367;hpb=88a4ffe5be3e2d913482a2d394daf689d1e85be6;p=openldap diff --git a/servers/slapd/back-bdb/filterindex.c b/servers/slapd/back-bdb/filterindex.c index d64aa3c024..a54ccf7cd1 100644 --- a/servers/slapd/back-bdb/filterindex.c +++ b/servers/slapd/back-bdb/filterindex.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2007 The OpenLDAP Foundation. + * Copyright 2000-2011 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,39 +27,39 @@ static int presence_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeDescription *desc, ID *ids ); static int equality_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, ID *ids, ID *tmp ); static int inequality_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, ID *ids, ID *tmp, int gtorlt ); static int approx_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, ID *ids, ID *tmp ); static int substring_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, SubstringsAssertion *sub, ID *ids, ID *tmp ); static int list_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, Filter *flist, int ftype, ID *ids, @@ -69,7 +69,7 @@ static int list_candidates( static int ext_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, MatchingRuleAssertion *mra, ID *ids, ID *tmp, @@ -79,7 +79,7 @@ ext_candidates( static int comp_candidates ( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, MatchingRuleAssertion *mra, ComponentFilter *f, ID *ids, @@ -89,7 +89,7 @@ comp_candidates ( static int ava_comp_candidates ( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, AttributeAliasing *aa, ID *ids, @@ -100,7 +100,7 @@ ava_comp_candidates ( int bdb_filter_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, Filter *f, ID *ids, ID *tmp, @@ -139,30 +139,30 @@ bdb_filter_candidates( break; case LDAP_FILTER_PRESENT: Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 ); - rc = presence_candidates( op, locker, f->f_desc, ids ); + rc = presence_candidates( op, rtxn, f->f_desc, ids ); break; case LDAP_FILTER_EQUALITY: Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 ); #ifdef LDAP_COMP_MATCH if ( is_aliased_attribute && ( aa = is_aliased_attribute ( f->f_ava->aa_desc ) ) ) { - rc = ava_comp_candidates ( op, locker, f->f_ava, aa, ids, tmp, stack ); + rc = ava_comp_candidates ( op, rtxn, f->f_ava, aa, ids, tmp, stack ); } else #endif { - rc = equality_candidates( op, locker, f->f_ava, ids, tmp ); + rc = equality_candidates( op, rtxn, f->f_ava, ids, tmp ); } break; case LDAP_FILTER_APPROX: Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 ); - rc = approx_candidates( op, locker, f->f_ava, ids, tmp ); + rc = approx_candidates( op, rtxn, f->f_ava, ids, tmp ); break; case LDAP_FILTER_SUBSTRINGS: Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 ); - rc = substring_candidates( op, locker, f->f_sub, ids, tmp ); + rc = substring_candidates( op, rtxn, f->f_sub, ids, tmp ); break; case LDAP_FILTER_GE: @@ -170,9 +170,9 @@ bdb_filter_candidates( Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 ); if( f->f_ava->aa_desc->ad_type->sat_ordering && ( f->f_ava->aa_desc->ad_type->sat_ordering->smr_usage & SLAP_MR_ORDERED_INDEX ) ) - rc = inequality_candidates( op, locker, f->f_ava, ids, tmp, LDAP_FILTER_GE ); + rc = inequality_candidates( op, rtxn, f->f_ava, ids, tmp, LDAP_FILTER_GE ); else - rc = presence_candidates( op, locker, f->f_ava->aa_desc, ids ); + rc = presence_candidates( op, rtxn, f->f_ava->aa_desc, ids ); break; case LDAP_FILTER_LE: @@ -180,9 +180,9 @@ bdb_filter_candidates( Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 ); if( f->f_ava->aa_desc->ad_type->sat_ordering && ( f->f_ava->aa_desc->ad_type->sat_ordering->smr_usage & SLAP_MR_ORDERED_INDEX ) ) - rc = inequality_candidates( op, locker, f->f_ava, ids, tmp, LDAP_FILTER_LE ); + rc = inequality_candidates( op, rtxn, f->f_ava, ids, tmp, LDAP_FILTER_LE ); else - rc = presence_candidates( op, locker, f->f_ava->aa_desc, ids ); + rc = presence_candidates( op, rtxn, f->f_ava->aa_desc, ids ); break; case LDAP_FILTER_NOT: @@ -195,18 +195,18 @@ bdb_filter_candidates( case LDAP_FILTER_AND: Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 ); - rc = list_candidates( op, locker, + rc = list_candidates( op, rtxn, f->f_and, LDAP_FILTER_AND, ids, tmp, stack ); break; case LDAP_FILTER_OR: Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 ); - rc = list_candidates( op, locker, + rc = list_candidates( op, rtxn, f->f_or, LDAP_FILTER_OR, ids, tmp, stack ); break; case LDAP_FILTER_EXT: Debug( LDAP_DEBUG_FILTER, "\tEXT\n", 0, 0, 0 ); - rc = ext_candidates( op, locker, f->f_mra, ids, tmp, stack ); + rc = ext_candidates( op, rtxn, f->f_mra, ids, tmp, stack ); break; default: Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n", @@ -231,7 +231,7 @@ out: static int comp_list_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, MatchingRuleAssertion* mra, ComponentFilter *flist, int ftype, @@ -250,7 +250,7 @@ comp_list_candidates( continue; } BDB_IDL_ZERO( save ); - rc = comp_candidates( op, locker, mra, f, save, tmp, save+BDB_IDL_UM_SIZE ); + rc = comp_candidates( op, rtxn, mra, f, save, tmp, save+BDB_IDL_UM_SIZE ); if ( rc != 0 ) { if ( ftype == LDAP_COMP_FILTER_AND ) { @@ -296,7 +296,7 @@ comp_list_candidates( static int comp_equality_candidates ( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, MatchingRuleAssertion *mra, ComponentAssertion *ca, ID *ids, @@ -341,10 +341,6 @@ comp_equality_candidates ( rc = bdb_index_param( op->o_bd, mra->ma_desc, LDAP_FILTER_EQUALITY, &db, &mask, &prefix ); - if ( db == NULL ) { - return 0; - } - if( rc != LDAP_SUCCESS ) { return 0; } @@ -374,7 +370,7 @@ comp_equality_candidates ( return 0; } for ( i= 0; keys[i].bv_val != NULL; i++ ) { - rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 ); + rc = bdb_key_read( op->o_bd, db, rtxn, &keys[i], tmp, NULL, 0 ); if( rc == DB_NOTFOUND ) { BDB_IDL_ZERO( ids ); @@ -411,7 +407,7 @@ comp_equality_candidates ( static int ava_comp_candidates ( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, AttributeAliasing *aa, ID *ids, @@ -429,13 +425,13 @@ ava_comp_candidates ( mra.ma_desc = aa->aa_aliased_ad; mra.ma_rule = ava->aa_desc->ad_type->sat_equality; - return comp_candidates ( op, locker, &mra, ava->aa_cf, ids, tmp, stack ); + return comp_candidates ( op, rtxn, &mra, ava->aa_cf, ids, tmp, stack ); } static int comp_candidates ( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, MatchingRuleAssertion *mra, ComponentFilter *f, ID *ids, @@ -452,10 +448,10 @@ comp_candidates ( rc = f->cf_result; break; case LDAP_COMP_FILTER_AND: - rc = comp_list_candidates( op, locker, mra, f->cf_and, LDAP_COMP_FILTER_AND, ids, tmp, stack ); + rc = comp_list_candidates( op, rtxn, mra, f->cf_and, LDAP_COMP_FILTER_AND, ids, tmp, stack ); break; case LDAP_COMP_FILTER_OR: - rc = comp_list_candidates( op, locker, mra, f->cf_or, LDAP_COMP_FILTER_OR, ids, tmp, stack ); + rc = comp_list_candidates( op, rtxn, mra, f->cf_or, LDAP_COMP_FILTER_OR, ids, tmp, stack ); break; case LDAP_COMP_FILTER_NOT: /* No component indexing supported for NOT filter */ @@ -467,7 +463,7 @@ comp_candidates ( rc = LDAP_PROTOCOL_ERROR; break; case LDAP_COMP_FILTER_ITEM: - rc = comp_equality_candidates( op, locker, mra, f->cf_ca, ids, tmp, stack ); + rc = comp_equality_candidates( op, rtxn, mra, f->cf_ca, ids, tmp, stack ); break; default: { @@ -484,7 +480,7 @@ comp_candidates ( static int ext_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, MatchingRuleAssertion *mra, ID *ids, ID *tmp, @@ -498,7 +494,7 @@ ext_candidates( * Indexing for an extensible filter is not supported yet */ if ( mra->ma_cf ) { - return comp_candidates ( op, locker, mra, mra->ma_cf, ids, tmp, stack); + return comp_candidates ( op, rtxn, mra, mra->ma_cf, ids, tmp, stack); } #endif if ( mra->ma_desc == slap_schema.si_ad_entryDN ) { @@ -508,7 +504,7 @@ ext_candidates( BDB_IDL_ZERO( ids ); if ( mra->ma_rule == slap_schema.si_mr_distinguishedNameMatch ) { ei = NULL; - rc = bdb_cache_find_ndn( op, NULL, &mra->ma_value, &ei ); + rc = bdb_cache_find_ndn( op, rtxn, &mra->ma_value, &ei ); if ( rc == LDAP_SUCCESS ) bdb_idl_insert( ids, ei->bei_id ); if ( ei ) @@ -522,7 +518,7 @@ ext_candidates( struct berval pdn; ei = NULL; dnParent( &mra->ma_value, &pdn ); - bdb_cache_find_ndn( op, NULL, &pdn, &ei ); + bdb_cache_find_ndn( op, rtxn, &pdn, &ei ); if ( ei ) { bdb_cache_entryinfo_unlock( ei ); while ( ei && ei->bei_id ) { @@ -542,14 +538,15 @@ ext_candidates( scope = LDAP_SCOPE_BASE; if ( scope > LDAP_SCOPE_BASE ) { ei = NULL; - rc = bdb_cache_find_ndn( op, NULL, &mra->ma_value, &ei ); + 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, locker, &mra->ma_value, ei, ids, + rc = bdb_dn2idl( op, rtxn, &mra->ma_value, ei, ids, stack ); + op->ors_scope = sc; } return 0; } @@ -563,7 +560,7 @@ ext_candidates( static int list_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, Filter *flist, int ftype, ID *ids, @@ -581,10 +578,13 @@ list_candidates( continue; } BDB_IDL_ZERO( save ); - rc = bdb_filter_candidates( op, locker, f, save, tmp, + rc = bdb_filter_candidates( op, rtxn, f, save, tmp, save+BDB_IDL_UM_SIZE ); if ( rc != 0 ) { + if ( rc == DB_LOCK_DEADLOCK ) + return rc; + if ( ftype == LDAP_FILTER_AND ) { rc = 0; continue; @@ -629,7 +629,7 @@ list_candidates( static int presence_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeDescription *desc, ID *ids ) { @@ -651,7 +651,7 @@ presence_candidates( rc = bdb_index_param( op->o_bd, desc, LDAP_FILTER_PRESENT, &db, &mask, &prefix ); - if( db == NULL ) { + if( rc == LDAP_INAPPROPRIATE_MATCHING ) { /* not indexed */ Debug( LDAP_DEBUG_TRACE, "<= bdb_presence_candidates: (%s) not indexed\n", @@ -674,7 +674,7 @@ presence_candidates( return -1; } - rc = bdb_key_read( op->o_bd, db, locker, &prefix, ids, NULL, 0 ); + rc = bdb_key_read( op->o_bd, db, rtxn, &prefix, ids, NULL, 0 ); if( rc == DB_NOTFOUND ) { BDB_IDL_ZERO( ids ); @@ -700,7 +700,7 @@ done: static int equality_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, ID *ids, ID *tmp ) @@ -717,12 +717,26 @@ equality_candidates( Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n", ava->aa_desc->ad_cname.bv_val, 0, 0 ); + if ( ava->aa_desc == slap_schema.si_ad_entryDN ) { + EntryInfo *ei = NULL; + rc = bdb_cache_find_ndn( op, rtxn, &ava->aa_value, &ei ); + if ( rc == LDAP_SUCCESS ) { + /* exactly one ID can match */ + ids[0] = 1; + ids[1] = ei->bei_id; + } + if ( ei ) { + bdb_cache_entryinfo_unlock( ei ); + } + return rc; + } + BDB_IDL_ALL( bdb, ids ); rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY, &db, &mask, &prefix ); - if ( db == NULL ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, "<= bdb_equality_candidates: (%s) not indexed\n", ava->aa_desc->ad_cname.bv_val, 0, 0 ); @@ -771,7 +785,7 @@ equality_candidates( } for ( i= 0; keys[i].bv_val != NULL; i++ ) { - rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 ); + rc = bdb_key_read( op->o_bd, db, rtxn, &keys[i], tmp, NULL, 0 ); if( rc == DB_NOTFOUND ) { BDB_IDL_ZERO( ids ); @@ -817,7 +831,7 @@ equality_candidates( static int approx_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, ID *ids, ID *tmp ) @@ -839,7 +853,7 @@ approx_candidates( rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX, &db, &mask, &prefix ); - if ( db == NULL ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, "<= bdb_approx_candidates: (%s) not indexed\n", ava->aa_desc->ad_cname.bv_val, 0, 0 ); @@ -893,7 +907,7 @@ approx_candidates( } for ( i= 0; keys[i].bv_val != NULL; i++ ) { - rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 ); + rc = bdb_key_read( op->o_bd, db, rtxn, &keys[i], tmp, NULL, 0 ); if( rc == DB_NOTFOUND ) { BDB_IDL_ZERO( ids ); @@ -937,7 +951,7 @@ approx_candidates( static int substring_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, SubstringsAssertion *sub, ID *ids, ID *tmp ) @@ -959,7 +973,7 @@ substring_candidates( rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS, &db, &mask, &prefix ); - if ( db == NULL ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, "<= bdb_substring_candidates: (%s) not indexed\n", sub->sa_desc->ad_cname.bv_val, 0, 0 ); @@ -1009,7 +1023,7 @@ substring_candidates( } for ( i= 0; keys[i].bv_val != NULL; i++ ) { - rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 ); + rc = bdb_key_read( op->o_bd, db, rtxn, &keys[i], tmp, NULL, 0 ); if( rc == DB_NOTFOUND ) { BDB_IDL_ZERO( ids ); @@ -1053,7 +1067,7 @@ substring_candidates( static int inequality_candidates( Operation *op, - u_int32_t locker, + DB_TXN *rtxn, AttributeAssertion *ava, ID *ids, ID *tmp, @@ -1076,7 +1090,7 @@ inequality_candidates( rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY, &db, &mask, &prefix ); - if ( db == NULL ) { + if ( rc == LDAP_INAPPROPRIATE_MATCHING ) { Debug( LDAP_DEBUG_ANY, "<= bdb_inequality_candidates: (%s) not indexed\n", ava->aa_desc->ad_cname.bv_val, 0, 0 ); @@ -1126,7 +1140,7 @@ inequality_candidates( BDB_IDL_ZERO( ids ); while(1) { - rc = bdb_key_read( op->o_bd, db, locker, &keys[0], tmp, &cursor, gtorlt ); + rc = bdb_key_read( op->o_bd, db, rtxn, &keys[0], tmp, &cursor, gtorlt ); if( rc == DB_NOTFOUND ) { rc = 0;