X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Ffilterindex.c;h=49b4afb1759e8c55d51f362e3fa414c93bbcde38;hb=324431062bff39a1bd3969bd37d4913526dd583f;hp=0c39ff454a6fd911942c2b7558ea5d16832f2b1d;hpb=a6acc0ff8c95c279552fec9b2ed52ba2cb0b7bd1;p=openldap diff --git a/servers/slapd/back-ldbm/filterindex.c b/servers/slapd/back-ldbm/filterindex.c index 0c39ff454a..49b4afb175 100644 --- a/servers/slapd/back-ldbm/filterindex.c +++ b/servers/slapd/back-ldbm/filterindex.c @@ -1,8 +1,17 @@ /* filterindex.c - generate the list of candidate entries from a filter */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2006 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -16,63 +25,71 @@ #include "back-ldbm.h" static ID_BLOCK *presence_candidates( - Backend *be, + Operation *op, AttributeDescription *desc ); static ID_BLOCK *equality_candidates( - Backend *be, AttributeAssertion *ava ); + Operation *op, AttributeAssertion *ava ); static ID_BLOCK *approx_candidates( - Backend *be, AttributeAssertion *ava ); + Operation *op, AttributeAssertion *ava ); static ID_BLOCK *substring_candidates( - Backend *be, + Operation *op, SubstringsAssertion *sub ); static ID_BLOCK *list_candidates( - Backend *be, + Operation *op, Filter *flist, int ftype ); ID_BLOCK * filter_candidates( - Backend *be, + Operation *op, Filter *f ) { - ID_BLOCK *result, *tmp1, *tmp2; + char *sub = "SUBTREE"; + ID_BLOCK *result; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, "filter_candidates: enter\n")); -#else Debug( LDAP_DEBUG_TRACE, "=> filter_candidates\n", 0, 0, 0 ); -#endif result = NULL; switch ( f->f_choice ) { + case SLAPD_FILTER_COMPUTED: + switch( f->f_result ) { + case SLAPD_COMPARE_UNDEFINED: + /* This technically is not the same as FALSE, but it + * certainly will produce no matches. + */ + /* FALLTHRU */ + case LDAP_COMPARE_FALSE: + result = NULL; + break; + case LDAP_COMPARE_TRUE: + result = idl_allids( op->o_bd ); + break; + } + break; + case SLAPD_FILTER_DN_ONE: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: DN ONE (%s)\n", f->f_dn )); -#else Debug( LDAP_DEBUG_FILTER, "\tDN ONE\n", 0, 0, 0 ); -#endif /* an error is treated as an empty list */ - if ( dn2idl( be, f->f_dn, DN_ONE_PREFIX, &result ) != 0 + if ( dn2idl( op->o_bd, f->f_dn, DN_ONE_PREFIX, &result ) != 0 && result != NULL ) { idl_free( result ); result = NULL; } break; - case SLAPD_FILTER_DN_SUBTREE: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: DN SUBTREE (%s)\n", f->f_dn )); -#else - Debug( LDAP_DEBUG_FILTER, "\tDN SUBTREE\n", 0, 0, 0 ); +#ifdef SLAPD_FILTER_DN_CHILDREN + case SLAPD_FILTER_DN_CHILDREN: + sub = "CHILDREN"; #endif + case SLAPD_FILTER_DN_SUBTREE: + Debug( LDAP_DEBUG_FILTER, + "\tDN %s\n", sub, 0, 0 ); /* an error is treated as an empty list */ - if ( dn2idl( be, f->f_dn, DN_SUBTREE_PREFIX, &result ) != 0 + if ( dn2idl( op->o_bd, f->f_dn, DN_SUBTREE_PREFIX, &result ) != 0 && result != NULL ) { idl_free( result ); result = NULL; @@ -80,104 +97,55 @@ filter_candidates( break; case LDAP_FILTER_PRESENT: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: Present (%s)\n", f->f_desc->ad_cname.bv_val )); -#else Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 ); -#endif - result = presence_candidates( be, f->f_desc ); + result = presence_candidates( op, f->f_desc ); break; case LDAP_FILTER_EQUALITY: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: EQUALITY (%s),(%s)\n", - f->f_ava->aa_desc->ad_cname.bv_val, - f->f_ava->aa_value->bv_val )); -#else Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 ); -#endif - result = equality_candidates( be, f->f_ava ); + result = equality_candidates( op, f->f_ava ); break; case LDAP_FILTER_APPROX: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: APPROX (%s), (%s)\n", - f->f_ava->aa_desc->ad_cname.bv_val, - f->f_ava->aa_value->bv_val )); -#else Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 ); -#endif - result = approx_candidates( be, f->f_ava ); + result = approx_candidates( op, f->f_ava ); break; case LDAP_FILTER_SUBSTRINGS: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: SUBSTRINGS\n")); -#else Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 ); -#endif - result = substring_candidates( be, f->f_sub ); + result = substring_candidates( op, f->f_sub ); break; case LDAP_FILTER_GE: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: GE\n")); -#else Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 ); -#endif - result = presence_candidates( be, f->f_desc ); + result = presence_candidates( op, f->f_ava->aa_desc ); break; case LDAP_FILTER_LE: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: LE\n" )); -#else Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 ); -#endif - result = presence_candidates( be, f->f_desc ); + result = presence_candidates( op, f->f_ava->aa_desc ); break; case LDAP_FILTER_AND: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: AND\n" )); -#else Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 ); -#endif - result = list_candidates( be, f->f_and, LDAP_FILTER_AND ); + result = list_candidates( op, f->f_and, LDAP_FILTER_AND ); break; case LDAP_FILTER_OR: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: OR\n" )); -#else Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 ); -#endif - result = list_candidates( be, f->f_or, LDAP_FILTER_OR ); + result = list_candidates( op, f->f_or, LDAP_FILTER_OR ); break; case LDAP_FILTER_NOT: -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "filter_candidates: NOT\n" )); -#else Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 ); -#endif /* * As candidates lists may contain entries which do @@ -185,25 +153,26 @@ filter_candidates( * list could result in matching entries be excluded from * the returned candidate list. */ - result = idl_allids( be ); + result = idl_allids( op->o_bd ); + break; + default: + Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN\n", 0, 0, 0 ); + /* unknown filters must not return NULL, to allow + * extended filter processing to be done later. + */ + result = idl_allids( op->o_bd ); break; } -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "filter_candidates: return %ld\n", - result ? ID_BLOCK_NIDS(result) : 0 )); -#else Debug( LDAP_DEBUG_TRACE, "<= filter_candidates %ld\n", result ? ID_BLOCK_NIDS(result) : 0, 0, 0 ); -#endif return( result ); } static ID_BLOCK * presence_candidates( - Backend *be, + Operation *op, AttributeDescription *desc ) { @@ -212,115 +181,77 @@ presence_candidates( int rc; char *dbname; slap_mask_t mask; - struct berval *prefix; + struct berval prefix = {0, NULL}; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "presence_candidates: enter\n" )); -#else Debug( LDAP_DEBUG_TRACE, "=> presence_candidates\n", 0, 0, 0 ); -#endif + idl = idl_allids( op->o_bd ); - idl = idl_allids( be ); + if( desc == slap_schema.si_ad_objectClass ) { + return idl; + } - rc = index_param( be, desc, LDAP_FILTER_PRESENT, + rc = index_param( op->o_bd, desc, LDAP_FILTER_PRESENT, &dbname, &mask, &prefix ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "presence_candidates: index_param returned %d\n", - rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= presence_candidates: index_param returned=%d\n", rc, 0, 0 ); -#endif return idl; } if( dbname == NULL ) { /* not indexed */ -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "presence_candidates: not indexed\n" )); -#else Debug( LDAP_DEBUG_TRACE, "<= presense_candidates: not indexed\n", 0, 0, 0 ); -#endif - ber_bvfree( prefix ); return idl; } - db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); + db = ldbm_cache_open( op->o_bd, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); if ( db == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "presence_candidates: db open failed (%s%s)\n", - dbname, LDBM_SUFFIX )); -#else Debug( LDAP_DEBUG_ANY, "<= presense_candidates db open failed (%s%s)\n", dbname, LDBM_SUFFIX, 0 ); -#endif - ber_bvfree( prefix ); return idl; } - if( prefix != NULL ) { + if( prefix.bv_val != NULL ) { idl_free( idl ); idl = NULL; - rc = key_read( be, db, prefix, &idl ); + rc = key_read( op->o_bd, db, &prefix, &idl ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "presence_candidates: key read failed (%d)\n", rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= presense_candidates key read failed (%d)\n", rc, 0, 0 ); -#endif } else if( idl == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_DETAIL1, - "presence_candidates: NULL\n" )); -#else Debug( LDAP_DEBUG_TRACE, "<= presense_candidates NULL\n", 0, 0, 0 ); -#endif } } - ldbm_cache_close( be, db ); - ber_bvfree( prefix ); + ldbm_cache_close( op->o_bd, db ); -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "presence_candidates: return %ld\n", - idl ? ID_BLOCK_NIDS(idl) : 0 )); -#else Debug( LDAP_DEBUG_TRACE, "<= presence_candidates %ld\n", idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 ); -#endif return( idl ); } static ID_BLOCK * equality_candidates( - Backend *be, + Operation *op, AttributeAssertion *ava ) { @@ -330,59 +261,41 @@ equality_candidates( int rc; char *dbname; slap_mask_t mask; - struct berval *prefix; - struct berval **keys = NULL; + struct berval prefix = {0, NULL}; + struct berval *keys = NULL; MatchingRule *mr; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "equality_candidates: enter\n" )); -#else Debug( LDAP_DEBUG_TRACE, "=> equality_candidates\n", 0, 0, 0 ); -#endif - idl = idl_allids( be ); + idl = idl_allids( op->o_bd ); - rc = index_param( be, ava->aa_desc, LDAP_FILTER_EQUALITY, + rc = index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY, &dbname, &mask, &prefix ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "equality_candidates: index_param returned %d\n", rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= equality_candidates: index_param returned=%d\n", rc, 0, 0 ); -#endif return idl; } if( dbname == NULL ) { /* not indexed */ -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "equality_candidates: not indexed\n" )); -#else Debug( LDAP_DEBUG_TRACE, "<= equality_candidates: not indexed\n", 0, 0, 0 ); -#endif - ber_bvfree( prefix ); return idl; } mr = ava->aa_desc->ad_type->sat_equality; if( !mr ) { - ber_bvfree( prefix ); return idl; } if( !mr->smr_filter ) { - ber_bvfree( prefix ); return idl; } @@ -391,73 +304,48 @@ equality_candidates( mask, ava->aa_desc->ad_type->sat_syntax, mr, - prefix, - ava->aa_value, - &keys ); - - ber_bvfree( prefix ); + &prefix, + &ava->aa_value, + &keys, op->o_tmpmemctx ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "equality_candidates: (%s%s) MR filter failed (%d\n", - dbname, LDBM_SUFFIX, rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= equality_candidates: (%s%s) MR filter failed (%d)\n", dbname, LDBM_SUFFIX, rc ); -#endif return idl; } if( keys == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "equality_candidates: no keys (%s%s)\n", - dbname, LDBM_SUFFIX )); -#else Debug( LDAP_DEBUG_TRACE, "<= equality_candidates: no keys (%s%s)\n", dbname, LDBM_SUFFIX, 0 ); -#endif return idl; } - db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); + db = ldbm_cache_open( op->o_bd, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); if ( db == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "equality_candidates: db open failed (%s%s)\n", - dbname, LDBM_SUFFIX )); -#else Debug( LDAP_DEBUG_ANY, "<= equality_candidates db open failed (%s%s)\n", dbname, LDBM_SUFFIX, 0 ); -#endif return idl; } - for ( i= 0; keys[i] != NULL; i++ ) { + for ( i= 0; keys[i].bv_val != NULL; i++ ) { ID_BLOCK *save; ID_BLOCK *tmp; - rc = key_read( be, db, keys[i], &tmp ); + rc = key_read( op->o_bd, db, &keys[i], &tmp ); if( rc != LDAP_SUCCESS ) { idl_free( idl ); idl = NULL; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "equality_candidates: key read failed (%d)\n", rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= equality_candidates key read failed (%d)\n", rc, 0, 0 ); -#endif break; } @@ -465,46 +353,35 @@ equality_candidates( if( tmp == NULL ) { idl_free( idl ); idl = NULL; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "equality_candidates NULL\n" )); -#else Debug( LDAP_DEBUG_TRACE, "<= equality_candidates NULL\n", 0, 0, 0 ); -#endif break; } save = idl; - idl = idl_intersection( be, idl, tmp ); + idl = idl_intersection( op->o_bd, idl, tmp ); idl_free( save ); idl_free( tmp ); if( idl == NULL ) break; } - ber_bvecfree( keys ); + ber_bvarray_free_x( keys, op->o_tmpmemctx ); - ldbm_cache_close( be, db ); + ldbm_cache_close( op->o_bd, db ); -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "equality_candidates: return %ld\n", - idl ? ID_BLOCK_NIDS(idl) : 0 )); -#else Debug( LDAP_DEBUG_TRACE, "<= equality_candidates %ld\n", idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 ); -#endif return( idl ); } static ID_BLOCK * approx_candidates( - Backend *be, + Operation *op, AttributeAssertion *ava ) { @@ -514,48 +391,32 @@ approx_candidates( int rc; char *dbname; slap_mask_t mask; - struct berval *prefix; - struct berval **keys = NULL; + struct berval prefix = {0, NULL}; + struct berval *keys = NULL; MatchingRule *mr; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "approx_candidates: enter\n" )); -#else Debug( LDAP_DEBUG_TRACE, "=> approx_candidates\n", 0, 0, 0 ); -#endif - idl = idl_allids( be ); + idl = idl_allids( op->o_bd ); - rc = index_param( be, ava->aa_desc, LDAP_FILTER_APPROX, + rc = index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX, &dbname, &mask, &prefix ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "approx_candidates: index_param returned %d\n", rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= approx_candidates: index_param returned=%d\n", rc, 0, 0 ); -#endif return idl; } if( dbname == NULL ) { /* not indexed */ -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "approx_candidates: not indexed\n" )); -#else Debug( LDAP_DEBUG_ANY, "<= approx_candidates: not indexed\n", 0, 0, 0 ); -#endif - ber_bvfree( prefix ); return idl; } @@ -566,12 +427,10 @@ approx_candidates( } if( !mr ) { - ber_bvfree( prefix ); return idl; } if( !mr->smr_filter ) { - ber_bvfree( prefix ); return idl; } @@ -580,72 +439,47 @@ approx_candidates( mask, ava->aa_desc->ad_type->sat_syntax, mr, - prefix, - ava->aa_value, - &keys ); - - ber_bvfree( prefix ); + &prefix, + &ava->aa_value, + &keys, op->o_tmpmemctx ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "approx_candidates: (%s%s) MR filter failed (%d)\n", - dbname, LDBM_SUFFIX, rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= approx_candidates: (%s%s) MR filter failed (%d)\n", dbname, LDBM_SUFFIX, rc ); -#endif return idl; } if( keys == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "approx_candidates: no keys (%s%s)\n", - dbname, LDBM_SUFFIX )); -#else Debug( LDAP_DEBUG_TRACE, "<= approx_candidates: no keys (%s%s)\n", dbname, LDBM_SUFFIX, 0 ); -#endif return idl; } - db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); + db = ldbm_cache_open( op->o_bd, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); if ( db == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "approx_candidates db open failed (%s%s)\n", - dbname, LDBM_SUFFIX )); -#else Debug( LDAP_DEBUG_ANY, "<= approx_candidates db open failed (%s%s)\n", dbname, LDBM_SUFFIX, 0 ); -#endif return idl; } - for ( i= 0; keys[i] != NULL; i++ ) { + for ( i= 0; keys[i].bv_val != NULL; i++ ) { ID_BLOCK *save; ID_BLOCK *tmp; - rc = key_read( be, db, keys[i], &tmp ); + rc = key_read( op->o_bd, db, &keys[i], &tmp ); if( rc != LDAP_SUCCESS ) { idl_free( idl ); idl = NULL; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "approx_candidates: key read failed (%d)\n", rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= approx_candidates key read failed (%d)\n", rc, 0, 0 ); -#endif break; } @@ -653,44 +487,33 @@ approx_candidates( if( tmp == NULL ) { idl_free( idl ); idl = NULL; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "approx_candidates: NULL\n" )); -#else Debug( LDAP_DEBUG_TRACE, "<= approx_candidates NULL\n", 0, 0, 0 ); -#endif break; } save = idl; - idl = idl_intersection( be, idl, tmp ); + idl = idl_intersection( op->o_bd, idl, tmp ); idl_free( save ); idl_free( tmp ); if( idl == NULL ) break; } - ber_bvecfree( keys ); + ber_bvarray_free_x( keys, op->o_tmpmemctx ); - ldbm_cache_close( be, db ); + ldbm_cache_close( op->o_bd, db ); -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "approx_candidates: return %ld\n", - idl ? ID_BLOCK_NIDS(idl) : 0 )); -#else Debug( LDAP_DEBUG_TRACE, "<= approx_candidates %ld\n", idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 ); -#endif return( idl ); } static ID_BLOCK * list_candidates( - Backend *be, + Operation *op, Filter *flist, int ftype ) @@ -698,25 +521,15 @@ list_candidates( ID_BLOCK *idl, *tmp, *tmp2; Filter *f; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "list_candidates: 0x%x\n", ftype )); -#else Debug( LDAP_DEBUG_TRACE, "=> list_candidates 0x%x\n", ftype, 0, 0 ); -#endif idl = NULL; for ( f = flist; f != NULL; f = f->f_next ) { - if ( (tmp = filter_candidates( be, f )) == NULL && + if ( (tmp = filter_candidates( op, f )) == NULL && ftype == LDAP_FILTER_AND ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "list_candidates: NULL\n" )); -#else Debug( LDAP_DEBUG_TRACE, "<= list_candidates NULL\n", 0, 0, 0 ); -#endif idl_free( idl ); return( NULL ); @@ -726,31 +539,25 @@ list_candidates( if ( idl == NULL ) { idl = tmp; } else if ( ftype == LDAP_FILTER_AND ) { - idl = idl_intersection( be, idl, tmp ); + idl = idl_intersection( op->o_bd, idl, tmp ); idl_free( tmp ); idl_free( tmp2 ); } else { - idl = idl_union( be, idl, tmp ); + idl = idl_union( op->o_bd, idl, tmp ); idl_free( tmp ); idl_free( tmp2 ); } } -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "list_candidates: return %ld\n", - idl ? ID_BLOCK_NIDS(idl) : 0 )); -#else Debug( LDAP_DEBUG_TRACE, "<= list_candidates %ld\n", idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 ); -#endif return( idl ); } static ID_BLOCK * substring_candidates( - Backend *be, + Operation *op, SubstringsAssertion *sub ) { @@ -760,60 +567,42 @@ substring_candidates( int rc; char *dbname; slap_mask_t mask; - struct berval *prefix; - struct berval **keys = NULL; + struct berval prefix = {0, NULL}; + struct berval *keys = NULL; MatchingRule *mr; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "substrings_candidates: enter\n" )); -#else Debug( LDAP_DEBUG_TRACE, "=> substrings_candidates\n", 0, 0, 0 ); -#endif - idl = idl_allids( be ); + idl = idl_allids( op->o_bd ); - rc = index_param( be, sub->sa_desc, LDAP_FILTER_SUBSTRINGS, + rc = index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS, &dbname, &mask, &prefix ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "substrings_candidates: index_param returned %d\n", rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates: index_param returned=%d\n", rc, 0, 0 ); -#endif return idl; } if( dbname == NULL ) { /* not indexed */ -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "substrings_candidates: not indexed\n" )); -#else Debug( LDAP_DEBUG_ANY, "<= substrings_candidates: not indexed\n", 0, 0, 0 ); -#endif - ber_bvfree( prefix ); return idl; } mr = sub->sa_desc->ad_type->sat_substr; if( !mr ) { - ber_bvfree( prefix ); return idl; } if( !mr->smr_filter ) { - ber_bvfree( prefix ); return idl; } @@ -822,73 +611,47 @@ substring_candidates( mask, sub->sa_desc->ad_type->sat_syntax, mr, - prefix, + &prefix, sub, - &keys ); - - ber_bvfree( prefix ); + &keys, op->o_tmpmemctx ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "substrings_candidates: (%s%s) MR filter failed (%d)\n", - dbname, LDBM_SUFFIX, rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates: (%s%s) MR filter failed (%d)\n", dbname, LDBM_SUFFIX, rc ); -#endif return idl; } if( keys == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "substrings_candidates: (0x%04lx) no keys (%s%s)\n", - mask, dbname, LDBM_SUFFIX )); -#else Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates: (0x%04lx) no keys (%s%s)\n", mask, dbname, LDBM_SUFFIX ); -#endif return idl; } - db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); + db = ldbm_cache_open( op->o_bd, dbname, LDBM_SUFFIX, LDBM_WRCREAT ); if ( db == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "substrings_candidates: db open failed (%s%s)\n", - dbname, LDBM_SUFFIX )); -#else Debug( LDAP_DEBUG_ANY, "<= substrings_candidates db open failed (%s%s)\n", dbname, LDBM_SUFFIX, 0 ); -#endif return idl; } - for ( i= 0; keys[i] != NULL; i++ ) { + for ( i= 0; keys[i].bv_val != NULL; i++ ) { ID_BLOCK *save; ID_BLOCK *tmp; - rc = key_read( be, db, keys[i], &tmp ); + rc = key_read( op->o_bd, db, &keys[i], &tmp ); if( rc != LDAP_SUCCESS ) { idl_free( idl ); idl = NULL; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ERR, - "substrings_candidates: key read failed (%d)\n", - rc )); -#else Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates key read failed (%d)\n", rc, 0, 0 ); -#endif break; } @@ -896,37 +659,26 @@ substring_candidates( if( tmp == NULL ) { idl_free( idl ); idl = NULL; -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_INFO, - "substrings_candidates: NULL\n" )); -#else Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates NULL\n", 0, 0, 0 ); -#endif break; } save = idl; - idl = idl_intersection( be, idl, tmp ); + idl = idl_intersection( op->o_bd, idl, tmp ); idl_free( save ); idl_free( tmp ); if( idl == NULL ) break; } - ber_bvecfree( keys ); + ber_bvarray_free_x( keys, op->o_tmpmemctx ); - ldbm_cache_close( be, db ); + ldbm_cache_close( op->o_bd, db ); -#ifdef NEW_LOGGING - LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, - "substrings_candidates: return %ld\n", - idl ? ID_BLOCK_NIDS(idl) : 0 )); -#else Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates %ld\n", idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 ); -#endif return( idl ); }