/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2000-2006 The OpenLDAP Foundation.
+ * Copyright 2000-2007 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
static int presence_candidates(
Operation *op,
+ u_int32_t locker,
AttributeDescription *desc,
ID *ids );
static int equality_candidates(
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
ID *ids,
ID *tmp );
static int inequality_candidates(
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
ID *ids,
ID *tmp,
int gtorlt );
static int approx_candidates(
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
ID *ids,
ID *tmp );
static int substring_candidates(
Operation *op,
+ u_int32_t locker,
SubstringsAssertion *sub,
ID *ids,
ID *tmp );
static int list_candidates(
Operation *op,
+ u_int32_t locker,
Filter *flist,
int ftype,
ID *ids,
static int
ext_candidates(
Operation *op,
+ u_int32_t locker,
MatchingRuleAssertion *mra,
ID *ids,
ID *tmp,
static int
comp_candidates (
Operation *op,
+ u_int32_t locker,
MatchingRuleAssertion *mra,
ComponentFilter *f,
ID *ids,
static int
ava_comp_candidates (
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
AttributeAliasing *aa,
ID *ids,
int
bdb_filter_candidates(
Operation *op,
+ u_int32_t locker,
Filter *f,
ID *ids,
ID *tmp,
#endif
Debug( LDAP_DEBUG_FILTER, "=> bdb_filter_candidates\n", 0, 0, 0 );
+ if ( f->f_choice & SLAPD_FILTER_UNDEFINED ) {
+ BDB_IDL_ZERO( ids );
+ goto out;
+ }
+
switch ( f->f_choice ) {
case SLAPD_FILTER_COMPUTED:
switch( f->f_result ) {
break;
case LDAP_FILTER_PRESENT:
Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );
- rc = presence_candidates( op, f->f_desc, ids );
+ rc = presence_candidates( op, locker, 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, f->f_ava, aa, ids, tmp, stack );
+ rc = ava_comp_candidates ( op, locker, f->f_ava, aa, ids, tmp, stack );
}
else
#endif
{
- rc = equality_candidates( op, f->f_ava, ids, tmp );
+ rc = equality_candidates( op, locker, f->f_ava, ids, tmp );
}
break;
case LDAP_FILTER_APPROX:
Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 );
- rc = approx_candidates( op, f->f_ava, ids, tmp );
+ rc = approx_candidates( op, locker, f->f_ava, ids, tmp );
break;
case LDAP_FILTER_SUBSTRINGS:
Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 );
- rc = substring_candidates( op, f->f_sub, ids, tmp );
+ rc = substring_candidates( op, locker, f->f_sub, ids, tmp );
break;
case LDAP_FILTER_GE:
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, f->f_ava, ids, tmp, LDAP_FILTER_GE );
+ rc = inequality_candidates( op, locker, f->f_ava, ids, tmp, LDAP_FILTER_GE );
else
- rc = presence_candidates( op, f->f_ava->aa_desc, ids );
+ rc = presence_candidates( op, locker, f->f_ava->aa_desc, ids );
break;
case LDAP_FILTER_LE:
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, f->f_ava, ids, tmp, LDAP_FILTER_LE );
+ rc = inequality_candidates( op, locker, f->f_ava, ids, tmp, LDAP_FILTER_LE );
else
- rc = presence_candidates( op, f->f_ava->aa_desc, ids );
+ rc = presence_candidates( op, locker, f->f_ava->aa_desc, ids );
break;
case LDAP_FILTER_NOT:
case LDAP_FILTER_AND:
Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );
- rc = list_candidates( op,
+ rc = list_candidates( op, locker,
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,
+ 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, f->f_mra, ids, tmp, stack );
+ rc = ext_candidates( op, locker, f->f_mra, ids, tmp, stack );
break;
#endif
default:
}
}
+out:
Debug( LDAP_DEBUG_FILTER,
"<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
(long) ids[0],
static int
comp_list_candidates(
Operation *op,
+ u_int32_t locker,
MatchingRuleAssertion* mra,
ComponentFilter *flist,
int ftype,
continue;
}
BDB_IDL_ZERO( save );
- rc = comp_candidates( op, mra, f, save, tmp, save+BDB_IDL_UM_SIZE );
+ rc = comp_candidates( op, locker, mra, f, save, tmp, save+BDB_IDL_UM_SIZE );
if ( rc != 0 ) {
if ( ftype == LDAP_COMP_FILTER_AND ) {
static int
comp_equality_candidates (
Operation *op,
+ u_int32_t locker,
MatchingRuleAssertion *mra,
ComponentAssertion *ca,
ID *ids,
return 0;
}
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
- rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp, NULL, 0 );
+ rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
if( rc == DB_NOTFOUND ) {
BDB_IDL_ZERO( ids );
static int
ava_comp_candidates (
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
AttributeAliasing *aa,
ID *ids,
mra.ma_desc = aa->aa_aliased_ad;
mra.ma_rule = ava->aa_desc->ad_type->sat_equality;
- return comp_candidates ( op, &mra, ava->aa_cf, ids, tmp, stack );
+ return comp_candidates ( op, locker, &mra, ava->aa_cf, ids, tmp, stack );
}
static int
comp_candidates (
Operation *op,
+ u_int32_t locker,
MatchingRuleAssertion *mra,
ComponentFilter *f,
ID *ids,
rc = f->cf_result;
break;
case LDAP_COMP_FILTER_AND:
- rc = comp_list_candidates( op, mra, f->cf_and, LDAP_COMP_FILTER_AND, ids, tmp, stack );
+ rc = comp_list_candidates( op, locker, mra, f->cf_and, LDAP_COMP_FILTER_AND, ids, tmp, stack );
break;
case LDAP_COMP_FILTER_OR:
- rc = comp_list_candidates( op, mra, f->cf_or, LDAP_COMP_FILTER_OR, ids, tmp, stack );
+ rc = comp_list_candidates( op, locker, mra, f->cf_or, LDAP_COMP_FILTER_OR, ids, tmp, stack );
break;
case LDAP_COMP_FILTER_NOT:
/* No component indexing supported for NOT filter */
rc = LDAP_PROTOCOL_ERROR;
break;
case LDAP_COMP_FILTER_ITEM:
- rc = comp_equality_candidates( op, mra, f->cf_ca, ids, tmp, stack );
+ rc = comp_equality_candidates( op, locker, mra, f->cf_ca, ids, tmp, stack );
break;
default:
{
static int
ext_candidates(
Operation *op,
+ u_int32_t locker,
MatchingRuleAssertion *mra,
ID *ids,
ID *tmp,
return 0;
}
- return comp_candidates ( op, mra, mra->ma_cf, ids, tmp, stack);
+ return comp_candidates ( op, locker, mra, mra->ma_cf, ids, tmp, stack);
}
#endif
static int
list_candidates(
Operation *op,
+ u_int32_t locker,
Filter *flist,
int ftype,
ID *ids,
continue;
}
BDB_IDL_ZERO( save );
- rc = bdb_filter_candidates( op, f, save, tmp,
+ rc = bdb_filter_candidates( op, locker, f, save, tmp,
save+BDB_IDL_UM_SIZE );
if ( rc != 0 ) {
static int
presence_candidates(
Operation *op,
+ u_int32_t locker,
AttributeDescription *desc,
ID *ids )
{
return -1;
}
- rc = bdb_key_read( op->o_bd, db, NULL, &prefix, ids, NULL, 0 );
+ rc = bdb_key_read( op->o_bd, db, locker, &prefix, ids, NULL, 0 );
if( rc == DB_NOTFOUND ) {
BDB_IDL_ZERO( ids );
static int
equality_candidates(
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
ID *ids,
ID *tmp )
}
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
- rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp, NULL, 0 );
+ rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
if( rc == DB_NOTFOUND ) {
BDB_IDL_ZERO( ids );
static int
approx_candidates(
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
ID *ids,
ID *tmp )
}
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
- rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp, NULL, 0 );
+ rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
if( rc == DB_NOTFOUND ) {
BDB_IDL_ZERO( ids );
static int
substring_candidates(
Operation *op,
+ u_int32_t locker,
SubstringsAssertion *sub,
ID *ids,
ID *tmp )
}
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
- rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp, NULL, 0 );
+ rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
if( rc == DB_NOTFOUND ) {
BDB_IDL_ZERO( ids );
static int
inequality_candidates(
Operation *op,
+ u_int32_t locker,
AttributeAssertion *ava,
ID *ids,
ID *tmp,
BDB_IDL_ZERO( ids );
while(1) {
- rc = bdb_key_read( op->o_bd, db, NULL, &keys[0], tmp, &cursor, gtorlt );
+ rc = bdb_key_read( op->o_bd, db, locker, &keys[0], tmp, &cursor, gtorlt );
if( rc == DB_NOTFOUND ) {
rc = 0;