1
/* filterindex.c - generate the list of candidate entries from a filter */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/filterindex.c,v 1.64.2.5 2008/02/11 23:26:45 kurt Exp $ */
3
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5
* Copyright 2000-2008 The OpenLDAP Foundation.
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted only as authorized by the OpenLDAP
12
* A copy of this license is available in the file LICENSE in the
13
* top-level directory of the distribution or, alternatively, at
14
* <http://www.OpenLDAP.org/license.html>.
20
#include <ac/string.h>
24
#ifdef LDAP_COMP_MATCH
25
#include <component.h>
28
static int presence_candidates(
31
AttributeDescription *desc,
34
static int equality_candidates(
37
AttributeAssertion *ava,
40
static int inequality_candidates(
43
AttributeAssertion *ava,
47
static int approx_candidates(
50
AttributeAssertion *ava,
53
static int substring_candidates(
56
SubstringsAssertion *sub,
60
static int list_candidates(
73
MatchingRuleAssertion *mra,
78
#ifdef LDAP_COMP_MATCH
83
MatchingRuleAssertion *mra,
93
AttributeAssertion *ava,
94
AttributeAliasing *aa,
101
bdb_filter_candidates(
110
#ifdef LDAP_COMP_MATCH
111
AttributeAliasing *aa;
113
Debug( LDAP_DEBUG_FILTER, "=> bdb_filter_candidates\n", 0, 0, 0 );
115
if ( f->f_choice & SLAPD_FILTER_UNDEFINED ) {
120
switch ( f->f_choice ) {
121
case SLAPD_FILTER_COMPUTED:
122
switch( f->f_result ) {
123
case SLAPD_COMPARE_UNDEFINED:
124
/* This technically is not the same as FALSE, but it
125
* certainly will produce no matches.
128
case LDAP_COMPARE_FALSE:
131
case LDAP_COMPARE_TRUE: {
132
struct bdb_info *bdb = (struct bdb_info *)op->o_bd->be_private;
133
BDB_IDL_ALL( bdb, ids );
136
/* this is a pre-computed scope, leave it alone */
140
case LDAP_FILTER_PRESENT:
141
Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );
142
rc = presence_candidates( op, locker, f->f_desc, ids );
145
case LDAP_FILTER_EQUALITY:
146
Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 );
147
#ifdef LDAP_COMP_MATCH
148
if ( is_aliased_attribute && ( aa = is_aliased_attribute ( f->f_ava->aa_desc ) ) ) {
149
rc = ava_comp_candidates ( op, locker, f->f_ava, aa, ids, tmp, stack );
154
rc = equality_candidates( op, locker, f->f_ava, ids, tmp );
158
case LDAP_FILTER_APPROX:
159
Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 );
160
rc = approx_candidates( op, locker, f->f_ava, ids, tmp );
163
case LDAP_FILTER_SUBSTRINGS:
164
Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 );
165
rc = substring_candidates( op, locker, f->f_sub, ids, tmp );
169
/* if no GE index, use pres */
170
Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 );
171
if( f->f_ava->aa_desc->ad_type->sat_ordering &&
172
( f->f_ava->aa_desc->ad_type->sat_ordering->smr_usage & SLAP_MR_ORDERED_INDEX ) )
173
rc = inequality_candidates( op, locker, f->f_ava, ids, tmp, LDAP_FILTER_GE );
175
rc = presence_candidates( op, locker, f->f_ava->aa_desc, ids );
179
/* if no LE index, use pres */
180
Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 );
181
if( f->f_ava->aa_desc->ad_type->sat_ordering &&
182
( f->f_ava->aa_desc->ad_type->sat_ordering->smr_usage & SLAP_MR_ORDERED_INDEX ) )
183
rc = inequality_candidates( op, locker, f->f_ava, ids, tmp, LDAP_FILTER_LE );
185
rc = presence_candidates( op, locker, f->f_ava->aa_desc, ids );
188
case LDAP_FILTER_NOT:
189
/* no indexing to support NOT filters */
190
Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 );
191
{ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
192
BDB_IDL_ALL( bdb, ids );
196
case LDAP_FILTER_AND:
197
Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );
198
rc = list_candidates( op, locker,
199
f->f_and, LDAP_FILTER_AND, ids, tmp, stack );
203
Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 );
204
rc = list_candidates( op, locker,
205
f->f_or, LDAP_FILTER_OR, ids, tmp, stack );
207
case LDAP_FILTER_EXT:
208
Debug( LDAP_DEBUG_FILTER, "\tEXT\n", 0, 0, 0 );
209
rc = ext_candidates( op, locker, f->f_mra, ids, tmp, stack );
212
Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n",
213
(unsigned long) f->f_choice, 0, 0 );
214
/* Must not return NULL, otherwise extended filters break */
215
{ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
216
BDB_IDL_ALL( bdb, ids );
221
Debug( LDAP_DEBUG_FILTER,
222
"<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
224
(long) BDB_IDL_FIRST( ids ),
225
(long) BDB_IDL_LAST( ids ) );
230
#ifdef LDAP_COMP_MATCH
232
comp_list_candidates(
235
MatchingRuleAssertion* mra,
236
ComponentFilter *flist,
245
Debug( LDAP_DEBUG_FILTER, "=> comp_list_candidates 0x%x\n", ftype, 0, 0 );
246
for ( f = flist; f != NULL; f = f->cf_next ) {
247
/* ignore precomputed scopes */
248
if ( f->cf_choice == SLAPD_FILTER_COMPUTED &&
249
f->cf_result == LDAP_SUCCESS ) {
252
BDB_IDL_ZERO( save );
253
rc = comp_candidates( op, locker, mra, f, save, tmp, save+BDB_IDL_UM_SIZE );
256
if ( ftype == LDAP_COMP_FILTER_AND ) {
263
if ( ftype == LDAP_COMP_FILTER_AND ) {
265
BDB_IDL_CPY( ids, save );
267
bdb_idl_intersection( ids, save );
269
if( BDB_IDL_IS_ZERO( ids ) )
273
BDB_IDL_CPY( ids, save );
275
bdb_idl_union( ids, save );
280
if( rc == LDAP_SUCCESS ) {
281
Debug( LDAP_DEBUG_FILTER,
282
"<= comp_list_candidates: id=%ld first=%ld last=%ld\n",
284
(long) BDB_IDL_FIRST(ids),
285
(long) BDB_IDL_LAST(ids) );
288
Debug( LDAP_DEBUG_FILTER,
289
"<= comp_list_candidates: undefined rc=%d\n",
297
comp_equality_candidates (
300
MatchingRuleAssertion *mra,
301
ComponentAssertion *ca,
306
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
311
struct berval prefix = {0, NULL};
312
struct berval *keys = NULL;
313
MatchingRule *mr = mra->ma_rule;
315
ComponentReference* cr_list, *cr;
318
BDB_IDL_ALL( bdb, ids );
320
if ( !ca->ca_comp_ref )
323
ai = bdb_attr_mask( op->o_bd->be_private, mra->ma_desc );
330
/* find a component reference to be indexed */
331
sat_syntax = ca->ca_ma_rule->smr_syntax;
332
for ( cr = cr_list ; cr ; cr = cr->cr_next ) {
333
if ( cr->cr_string.bv_len == ca->ca_comp_ref->cr_string.bv_len &&
334
strncmp( cr->cr_string.bv_val, ca->ca_comp_ref->cr_string.bv_val,cr->cr_string.bv_len ) == 0 )
341
rc = bdb_index_param( op->o_bd, mra->ma_desc, LDAP_FILTER_EQUALITY,
342
&db, &mask, &prefix );
344
if( rc != LDAP_SUCCESS ) {
352
if( !mr->smr_filter ) {
356
rc = (ca->ca_ma_rule->smr_filter)(
357
LDAP_FILTER_EQUALITY,
363
&keys, op->o_tmpmemctx );
365
if( rc != LDAP_SUCCESS ) {
372
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
373
rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
375
if( rc == DB_NOTFOUND ) {
379
} else if( rc != LDAP_SUCCESS ) {
383
if( BDB_IDL_IS_ZERO( tmp ) ) {
389
BDB_IDL_CPY( ids, tmp );
391
bdb_idl_intersection( ids, tmp );
394
if( BDB_IDL_IS_ZERO( ids ) )
397
ber_bvarray_free_x( keys, op->o_tmpmemctx );
399
Debug( LDAP_DEBUG_TRACE,
400
"<= comp_equality_candidates: id=%ld, first=%ld, last=%ld\n",
402
(long) BDB_IDL_FIRST(ids),
403
(long) BDB_IDL_LAST(ids) );
408
ava_comp_candidates (
411
AttributeAssertion *ava,
412
AttributeAliasing *aa,
417
MatchingRuleAssertion mra;
419
mra.ma_rule = ava->aa_desc->ad_type->sat_equality;
420
if ( !mra.ma_rule ) {
421
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
422
BDB_IDL_ALL( bdb, ids );
425
mra.ma_desc = aa->aa_aliased_ad;
426
mra.ma_rule = ava->aa_desc->ad_type->sat_equality;
428
return comp_candidates ( op, locker, &mra, ava->aa_cf, ids, tmp, stack );
435
MatchingRuleAssertion *mra,
443
if ( !f ) return LDAP_PROTOCOL_ERROR;
445
Debug( LDAP_DEBUG_FILTER, "comp_candidates\n", 0, 0, 0 );
446
switch ( f->cf_choice ) {
447
case SLAPD_FILTER_COMPUTED:
450
case LDAP_COMP_FILTER_AND:
451
rc = comp_list_candidates( op, locker, mra, f->cf_and, LDAP_COMP_FILTER_AND, ids, tmp, stack );
453
case LDAP_COMP_FILTER_OR:
454
rc = comp_list_candidates( op, locker, mra, f->cf_or, LDAP_COMP_FILTER_OR, ids, tmp, stack );
456
case LDAP_COMP_FILTER_NOT:
457
/* No component indexing supported for NOT filter */
458
Debug( LDAP_DEBUG_FILTER, "\tComponent NOT\n", 0, 0, 0 );
460
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
461
BDB_IDL_ALL( bdb, ids );
463
rc = LDAP_PROTOCOL_ERROR;
465
case LDAP_COMP_FILTER_ITEM:
466
rc = comp_equality_candidates( op, locker, mra, f->cf_ca, ids, tmp, stack );
470
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
471
BDB_IDL_ALL( bdb, ids );
473
rc = LDAP_PROTOCOL_ERROR;
484
MatchingRuleAssertion *mra,
489
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
491
#ifdef LDAP_COMP_MATCH
493
* Currently Only Component Indexing for componentFilterMatch is supported
494
* Indexing for an extensible filter is not supported yet
497
return comp_candidates ( op, locker, mra, mra->ma_cf, ids, tmp, stack);
500
if ( mra->ma_desc == slap_schema.si_ad_entryDN ) {
505
if ( mra->ma_rule == slap_schema.si_mr_distinguishedNameMatch ) {
507
rc = bdb_cache_find_ndn( op, locker, &mra->ma_value, &ei );
508
if ( rc == LDAP_SUCCESS )
509
bdb_idl_insert( ids, ei->bei_id );
511
bdb_cache_entryinfo_unlock( ei );
513
} else if ( mra->ma_rule && mra->ma_rule->smr_match ==
514
dnRelativeMatch && dnIsSuffix( &mra->ma_value,
515
op->o_bd->be_nsuffix )) {
517
if ( mra->ma_rule == slap_schema.si_mr_dnSuperiorMatch ) {
520
dnParent( &mra->ma_value, &pdn );
521
bdb_cache_find_ndn( op, locker, &pdn, &ei );
523
bdb_cache_entryinfo_unlock( ei );
524
while ( ei && ei->bei_id ) {
525
bdb_idl_insert( ids, ei->bei_id );
531
if ( mra->ma_rule == slap_schema.si_mr_dnSubtreeMatch )
532
scope = LDAP_SCOPE_SUBTREE;
533
else if ( mra->ma_rule == slap_schema.si_mr_dnOneLevelMatch )
534
scope = LDAP_SCOPE_ONELEVEL;
535
else if ( mra->ma_rule == slap_schema.si_mr_dnSubordinateMatch )
536
scope = LDAP_SCOPE_SUBORDINATE;
538
scope = LDAP_SCOPE_BASE;
539
if ( scope > LDAP_SCOPE_BASE ) {
541
rc = bdb_cache_find_ndn( op, locker, &mra->ma_value, &ei );
543
bdb_cache_entryinfo_unlock( ei );
544
if ( rc == LDAP_SUCCESS ) {
545
int sc = op->ors_scope;
546
op->ors_scope = scope;
547
rc = bdb_dn2idl( op, locker, &mra->ma_value, ei, ids,
556
BDB_IDL_ALL( bdb, ids );
573
Debug( LDAP_DEBUG_FILTER, "=> bdb_list_candidates 0x%x\n", ftype, 0, 0 );
574
for ( f = flist; f != NULL; f = f->f_next ) {
575
/* ignore precomputed scopes */
576
if ( f->f_choice == SLAPD_FILTER_COMPUTED &&
577
f->f_result == LDAP_SUCCESS ) {
580
BDB_IDL_ZERO( save );
581
rc = bdb_filter_candidates( op, locker, f, save, tmp,
582
save+BDB_IDL_UM_SIZE );
585
if ( ftype == LDAP_FILTER_AND ) {
593
if ( ftype == LDAP_FILTER_AND ) {
595
BDB_IDL_CPY( ids, save );
597
bdb_idl_intersection( ids, save );
599
if( BDB_IDL_IS_ZERO( ids ) )
603
BDB_IDL_CPY( ids, save );
605
bdb_idl_union( ids, save );
610
if( rc == LDAP_SUCCESS ) {
611
Debug( LDAP_DEBUG_FILTER,
612
"<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
614
(long) BDB_IDL_FIRST(ids),
615
(long) BDB_IDL_LAST(ids) );
618
Debug( LDAP_DEBUG_FILTER,
619
"<= bdb_list_candidates: undefined rc=%d\n",
630
AttributeDescription *desc,
633
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
637
struct berval prefix = {0, NULL};
639
Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates (%s)\n",
640
desc->ad_cname.bv_val, 0, 0 );
642
BDB_IDL_ALL( bdb, ids );
644
if( desc == slap_schema.si_ad_objectClass ) {
648
rc = bdb_index_param( op->o_bd, desc, LDAP_FILTER_PRESENT,
649
&db, &mask, &prefix );
651
if( rc == LDAP_INAPPROPRIATE_MATCHING ) {
653
Debug( LDAP_DEBUG_TRACE,
654
"<= bdb_presence_candidates: (%s) not indexed\n",
655
desc->ad_cname.bv_val, 0, 0 );
659
if( rc != LDAP_SUCCESS ) {
660
Debug( LDAP_DEBUG_TRACE,
661
"<= bdb_presence_candidates: (%s) index_param "
663
desc->ad_cname.bv_val, rc, 0 );
667
if( prefix.bv_val == NULL ) {
668
Debug( LDAP_DEBUG_TRACE,
669
"<= bdb_presence_candidates: (%s) no prefix\n",
670
desc->ad_cname.bv_val, 0, 0 );
674
rc = bdb_key_read( op->o_bd, db, locker, &prefix, ids, NULL, 0 );
676
if( rc == DB_NOTFOUND ) {
679
} else if( rc != LDAP_SUCCESS ) {
680
Debug( LDAP_DEBUG_TRACE,
681
"<= bdb_presense_candidates: (%s) "
682
"key read failed (%d)\n",
683
desc->ad_cname.bv_val, rc, 0 );
687
Debug(LDAP_DEBUG_TRACE,
688
"<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
690
(long) BDB_IDL_FIRST(ids),
691
(long) BDB_IDL_LAST(ids) );
701
AttributeAssertion *ava,
705
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
710
struct berval prefix = {0, NULL};
711
struct berval *keys = NULL;
714
Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n",
715
ava->aa_desc->ad_cname.bv_val, 0, 0 );
717
BDB_IDL_ALL( bdb, ids );
719
rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY,
720
&db, &mask, &prefix );
722
if ( rc == LDAP_INAPPROPRIATE_MATCHING ) {
723
Debug( LDAP_DEBUG_ANY,
724
"<= bdb_equality_candidates: (%s) not indexed\n",
725
ava->aa_desc->ad_cname.bv_val, 0, 0 );
729
if( rc != LDAP_SUCCESS ) {
730
Debug( LDAP_DEBUG_ANY,
731
"<= bdb_equality_candidates: (%s) "
732
"index_param failed (%d)\n",
733
ava->aa_desc->ad_cname.bv_val, rc, 0 );
737
mr = ava->aa_desc->ad_type->sat_equality;
742
if( !mr->smr_filter ) {
746
rc = (mr->smr_filter)(
747
LDAP_FILTER_EQUALITY,
749
ava->aa_desc->ad_type->sat_syntax,
753
&keys, op->o_tmpmemctx );
755
if( rc != LDAP_SUCCESS ) {
756
Debug( LDAP_DEBUG_TRACE,
757
"<= bdb_equality_candidates: (%s, %s) "
758
"MR filter failed (%d)\n",
759
prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
764
Debug( LDAP_DEBUG_TRACE,
765
"<= bdb_equality_candidates: (%s) no keys\n",
766
ava->aa_desc->ad_cname.bv_val, 0, 0 );
770
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
771
rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
773
if( rc == DB_NOTFOUND ) {
777
} else if( rc != LDAP_SUCCESS ) {
778
Debug( LDAP_DEBUG_TRACE,
779
"<= bdb_equality_candidates: (%s) "
780
"key read failed (%d)\n",
781
ava->aa_desc->ad_cname.bv_val, rc, 0 );
785
if( BDB_IDL_IS_ZERO( tmp ) ) {
786
Debug( LDAP_DEBUG_TRACE,
787
"<= bdb_equality_candidates: (%s) NULL\n",
788
ava->aa_desc->ad_cname.bv_val, 0, 0 );
794
BDB_IDL_CPY( ids, tmp );
796
bdb_idl_intersection( ids, tmp );
799
if( BDB_IDL_IS_ZERO( ids ) )
803
ber_bvarray_free_x( keys, op->o_tmpmemctx );
805
Debug( LDAP_DEBUG_TRACE,
806
"<= bdb_equality_candidates: id=%ld, first=%ld, last=%ld\n",
808
(long) BDB_IDL_FIRST(ids),
809
(long) BDB_IDL_LAST(ids) );
818
AttributeAssertion *ava,
822
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
827
struct berval prefix = {0, NULL};
828
struct berval *keys = NULL;
831
Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
832
ava->aa_desc->ad_cname.bv_val, 0, 0 );
834
BDB_IDL_ALL( bdb, ids );
836
rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX,
837
&db, &mask, &prefix );
839
if ( rc == LDAP_INAPPROPRIATE_MATCHING ) {
840
Debug( LDAP_DEBUG_ANY,
841
"<= bdb_approx_candidates: (%s) not indexed\n",
842
ava->aa_desc->ad_cname.bv_val, 0, 0 );
846
if( rc != LDAP_SUCCESS ) {
847
Debug( LDAP_DEBUG_ANY,
848
"<= bdb_approx_candidates: (%s) "
849
"index_param failed (%d)\n",
850
ava->aa_desc->ad_cname.bv_val, rc, 0 );
854
mr = ava->aa_desc->ad_type->sat_approx;
856
/* no approx matching rule, try equality matching rule */
857
mr = ava->aa_desc->ad_type->sat_equality;
864
if( !mr->smr_filter ) {
868
rc = (mr->smr_filter)(
871
ava->aa_desc->ad_type->sat_syntax,
875
&keys, op->o_tmpmemctx );
877
if( rc != LDAP_SUCCESS ) {
878
Debug( LDAP_DEBUG_TRACE,
879
"<= bdb_approx_candidates: (%s, %s) "
880
"MR filter failed (%d)\n",
881
prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
886
Debug( LDAP_DEBUG_TRACE,
887
"<= bdb_approx_candidates: (%s) no keys (%s)\n",
888
prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
892
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
893
rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
895
if( rc == DB_NOTFOUND ) {
899
} else if( rc != LDAP_SUCCESS ) {
900
Debug( LDAP_DEBUG_TRACE,
901
"<= bdb_approx_candidates: (%s) "
902
"key read failed (%d)\n",
903
ava->aa_desc->ad_cname.bv_val, rc, 0 );
907
if( BDB_IDL_IS_ZERO( tmp ) ) {
908
Debug( LDAP_DEBUG_TRACE,
909
"<= bdb_approx_candidates: (%s) NULL\n",
910
ava->aa_desc->ad_cname.bv_val, 0, 0 );
916
BDB_IDL_CPY( ids, tmp );
918
bdb_idl_intersection( ids, tmp );
921
if( BDB_IDL_IS_ZERO( ids ) )
925
ber_bvarray_free_x( keys, op->o_tmpmemctx );
927
Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
929
(long) BDB_IDL_FIRST(ids),
930
(long) BDB_IDL_LAST(ids) );
935
substring_candidates(
938
SubstringsAssertion *sub,
942
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
947
struct berval prefix = {0, NULL};
948
struct berval *keys = NULL;
951
Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
952
sub->sa_desc->ad_cname.bv_val, 0, 0 );
954
BDB_IDL_ALL( bdb, ids );
956
rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
957
&db, &mask, &prefix );
959
if ( rc == LDAP_INAPPROPRIATE_MATCHING ) {
960
Debug( LDAP_DEBUG_ANY,
961
"<= bdb_substring_candidates: (%s) not indexed\n",
962
sub->sa_desc->ad_cname.bv_val, 0, 0 );
966
if( rc != LDAP_SUCCESS ) {
967
Debug( LDAP_DEBUG_ANY,
968
"<= bdb_substring_candidates: (%s) "
969
"index_param failed (%d)\n",
970
sub->sa_desc->ad_cname.bv_val, rc, 0 );
974
mr = sub->sa_desc->ad_type->sat_substr;
980
if( !mr->smr_filter ) {
984
rc = (mr->smr_filter)(
985
LDAP_FILTER_SUBSTRINGS,
987
sub->sa_desc->ad_type->sat_syntax,
991
&keys, op->o_tmpmemctx );
993
if( rc != LDAP_SUCCESS ) {
994
Debug( LDAP_DEBUG_TRACE,
995
"<= bdb_substring_candidates: (%s) "
996
"MR filter failed (%d)\n",
997
sub->sa_desc->ad_cname.bv_val, rc, 0 );
1001
if( keys == NULL ) {
1002
Debug( LDAP_DEBUG_TRACE,
1003
"<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
1004
mask, sub->sa_desc->ad_cname.bv_val, 0 );
1008
for ( i= 0; keys[i].bv_val != NULL; i++ ) {
1009
rc = bdb_key_read( op->o_bd, db, locker, &keys[i], tmp, NULL, 0 );
1011
if( rc == DB_NOTFOUND ) {
1012
BDB_IDL_ZERO( ids );
1015
} else if( rc != LDAP_SUCCESS ) {
1016
Debug( LDAP_DEBUG_TRACE,
1017
"<= bdb_substring_candidates: (%s) "
1018
"key read failed (%d)\n",
1019
sub->sa_desc->ad_cname.bv_val, rc, 0 );
1023
if( BDB_IDL_IS_ZERO( tmp ) ) {
1024
Debug( LDAP_DEBUG_TRACE,
1025
"<= bdb_substring_candidates: (%s) NULL\n",
1026
sub->sa_desc->ad_cname.bv_val, 0, 0 );
1027
BDB_IDL_ZERO( ids );
1032
BDB_IDL_CPY( ids, tmp );
1034
bdb_idl_intersection( ids, tmp );
1037
if( BDB_IDL_IS_ZERO( ids ) )
1041
ber_bvarray_free_x( keys, op->o_tmpmemctx );
1043
Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
1045
(long) BDB_IDL_FIRST(ids),
1046
(long) BDB_IDL_LAST(ids) );
1051
inequality_candidates(
1054
AttributeAssertion *ava,
1059
struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
1063
struct berval prefix = {0, NULL};
1064
struct berval *keys = NULL;
1066
DBC * cursor = NULL;
1068
Debug( LDAP_DEBUG_TRACE, "=> bdb_inequality_candidates (%s)\n",
1069
ava->aa_desc->ad_cname.bv_val, 0, 0 );
1071
BDB_IDL_ALL( bdb, ids );
1073
rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY,
1074
&db, &mask, &prefix );
1076
if ( rc == LDAP_INAPPROPRIATE_MATCHING ) {
1077
Debug( LDAP_DEBUG_ANY,
1078
"<= bdb_inequality_candidates: (%s) not indexed\n",
1079
ava->aa_desc->ad_cname.bv_val, 0, 0 );
1083
if( rc != LDAP_SUCCESS ) {
1084
Debug( LDAP_DEBUG_ANY,
1085
"<= bdb_inequality_candidates: (%s) "
1086
"index_param failed (%d)\n",
1087
ava->aa_desc->ad_cname.bv_val, rc, 0 );
1091
mr = ava->aa_desc->ad_type->sat_equality;
1096
if( !mr->smr_filter ) {
1100
rc = (mr->smr_filter)(
1101
LDAP_FILTER_EQUALITY,
1103
ava->aa_desc->ad_type->sat_syntax,
1107
&keys, op->o_tmpmemctx );
1109
if( rc != LDAP_SUCCESS ) {
1110
Debug( LDAP_DEBUG_TRACE,
1111
"<= bdb_inequality_candidates: (%s, %s) "
1112
"MR filter failed (%d)\n",
1113
prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
1117
if( keys == NULL ) {
1118
Debug( LDAP_DEBUG_TRACE,
1119
"<= bdb_inequality_candidates: (%s) no keys\n",
1120
ava->aa_desc->ad_cname.bv_val, 0, 0 );
1124
BDB_IDL_ZERO( ids );
1126
rc = bdb_key_read( op->o_bd, db, locker, &keys[0], tmp, &cursor, gtorlt );
1128
if( rc == DB_NOTFOUND ) {
1131
} else if( rc != LDAP_SUCCESS ) {
1132
Debug( LDAP_DEBUG_TRACE,
1133
"<= bdb_inequality_candidates: (%s) "
1134
"key read failed (%d)\n",
1135
ava->aa_desc->ad_cname.bv_val, rc, 0 );
1139
if( BDB_IDL_IS_ZERO( tmp ) ) {
1140
Debug( LDAP_DEBUG_TRACE,
1141
"<= bdb_inequality_candidates: (%s) NULL\n",
1142
ava->aa_desc->ad_cname.bv_val, 0, 0 );
1146
bdb_idl_union( ids, tmp );
1148
if( op->ors_limit && op->ors_limit->lms_s_unchecked != -1 &&
1149
BDB_IDL_N( ids ) >= (unsigned) op->ors_limit->lms_s_unchecked ) {
1150
cursor->c_close( cursor );
1154
ber_bvarray_free_x( keys, op->o_tmpmemctx );
1156
Debug( LDAP_DEBUG_TRACE,
1157
"<= bdb_inequality_candidates: id=%ld, first=%ld, last=%ld\n",
1159
(long) BDB_IDL_FIRST(ids),
1160
(long) BDB_IDL_LAST(ids) );