]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/filterindex.c
Remove abandon cruft
[openldap] / servers / slapd / back-ldbm / filterindex.c
index 1d74d15bec972745924f6a31b4b9880bea7ad1fc..9b5db4549291189ddd85d3449416734de4c75d41 100644 (file)
@@ -36,7 +36,7 @@ filter_candidates(
     Filter     *f
 )
 {
-       ID_BLOCK        *result, *tmp1, *tmp2;
+       ID_BLOCK        *result;
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY, "filter_candidates: enter\n"));
@@ -55,7 +55,12 @@ filter_candidates(
                Debug( LDAP_DEBUG_FILTER, "\tDN ONE\n", 0, 0, 0 );
 #endif
 
-               result = dn2idl( be, f->f_dn, DN_ONE_PREFIX );
+               /* an error is treated as an empty list */
+               if ( dn2idl( be, f->f_dn, DN_ONE_PREFIX, &result ) != 0
+                               && result != NULL ) {
+                       idl_free( result );
+                       result = NULL;
+               }
                break;
 
        case SLAPD_FILTER_DN_SUBTREE:
@@ -66,13 +71,18 @@ filter_candidates(
                Debug( LDAP_DEBUG_FILTER, "\tDN SUBTREE\n", 0, 0, 0 );
 #endif
 
-               result = dn2idl( be, f->f_dn, DN_SUBTREE_PREFIX );
+               /* an error is treated as an empty list */
+               if ( dn2idl( be, f->f_dn, DN_SUBTREE_PREFIX, &result ) != 0
+                               && result != NULL ) {
+                       idl_free( result );
+                       result = NULL;
+               }
                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 ));
+                          "filter_candidates:  Present (%s)\n", f->f_desc->ad_cname.bv_val ));
 #else
                Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );
 #endif
@@ -84,8 +94,8 @@ filter_candidates(
 #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 ));
+                          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
@@ -97,8 +107,8 @@ filter_candidates(
 #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 ));
+                          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
@@ -125,7 +135,7 @@ filter_candidates(
                Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 );
 #endif
 
-               result = idl_allids( be );
+               result = presence_candidates( be, f->f_desc );
                break;
 
        case LDAP_FILTER_LE:
@@ -136,7 +146,7 @@ filter_candidates(
                Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 );
 #endif
 
-               result = idl_allids( be );
+               result = presence_candidates( be, f->f_desc );
                break;
 
        case LDAP_FILTER_AND:
@@ -169,11 +179,13 @@ filter_candidates(
                Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 );
 #endif
 
-               tmp1 = idl_allids( be );
-               tmp2 = filter_candidates( be, f->f_not );
-               result = idl_notin( be, tmp1, tmp2 );
-               idl_free( tmp2 );
-               idl_free( tmp1 );
+               /*
+                * As candidates lists may contain entries which do
+                * not match the assertion, negation of the inner candidate
+                * list could result in matching entries be excluded from
+                * the returned candidate list.
+                */
+               result = idl_allids( be );
                break;
        }
 
@@ -200,7 +212,7 @@ presence_candidates(
        int rc;
        char *dbname;
        slap_mask_t mask;
-       struct berval *prefix;
+       struct berval prefix = {0};
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY,
@@ -209,9 +221,12 @@ presence_candidates(
        Debug( LDAP_DEBUG_TRACE, "=> presence_candidates\n", 0, 0, 0 );
 #endif
 
-
        idl = idl_allids( be );
 
+       if( desc == slap_schema.si_ad_objectClass ) {
+               return idl;
+       }
+
        rc = index_param( be, desc, LDAP_FILTER_PRESENT,
                &dbname, &mask, &prefix );
 
@@ -240,11 +255,10 @@ presence_candidates(
                        0, 0, 0 );
 #endif
 
-               ber_bvfree( prefix );
                return idl;
        }
 
-       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_READER );
+       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT );
        
        if ( db == NULL ) {
 #ifdef NEW_LOGGING
@@ -257,15 +271,14 @@ presence_candidates(
                        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( be, db, &prefix, &idl );
 
                if( rc != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
@@ -292,7 +305,6 @@ presence_candidates(
        }
 
        ldbm_cache_close( be, db );
-       ber_bvfree( prefix );
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "filter", LDAP_LEVEL_ENTRY,
@@ -318,8 +330,8 @@ equality_candidates(
        int rc;
        char *dbname;
        slap_mask_t mask;
-       struct berval *prefix;
-       struct berval **keys = NULL;
+       struct berval prefix = {0};
+       struct berval *keys = NULL;
        MatchingRule *mr;
 
 #ifdef NEW_LOGGING
@@ -359,18 +371,15 @@ equality_candidates(
                        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;
        }
 
@@ -379,12 +388,10 @@ equality_candidates(
                mask,
                ava->aa_desc->ad_type->sat_syntax,
                mr,
-               prefix,
-               ava->aa_value,
+               &prefix,
+               &ava->aa_value,
                &keys );
 
-       ber_bvfree( prefix );
-
        if( rc != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
                LDAP_LOG(( "filter", LDAP_LEVEL_ERR,
@@ -413,7 +420,7 @@ equality_candidates(
                return idl;
        }
 
-       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_READER );
+       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT );
        
        if ( db == NULL ) {
 #ifdef NEW_LOGGING
@@ -429,11 +436,11 @@ equality_candidates(
                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( be, db, &keys[i], &tmp );
 
                if( rc != LDAP_SUCCESS ) {
                        idl_free( idl );
@@ -473,7 +480,7 @@ equality_candidates(
                if( idl == NULL ) break;
        }
 
-       ber_bvecfree( keys );
+       bvarray_free( keys );
 
        ldbm_cache_close( be, db );
 
@@ -502,8 +509,8 @@ approx_candidates(
        int rc;
        char *dbname;
        slap_mask_t mask;
-       struct berval *prefix;
-       struct berval **keys = NULL;
+       struct berval prefix = {0};
+       struct berval *keys = NULL;
        MatchingRule *mr;
 
 #ifdef NEW_LOGGING
@@ -543,7 +550,6 @@ approx_candidates(
                        0, 0, 0 );
 #endif
 
-               ber_bvfree( prefix );
                return idl;
        }
 
@@ -554,12 +560,10 @@ approx_candidates(
        }
 
        if( !mr ) {
-               ber_bvfree( prefix );
                return idl;
        }
 
        if( !mr->smr_filter ) {
-               ber_bvfree( prefix );
                return idl;
        }
 
@@ -568,12 +572,10 @@ approx_candidates(
                mask,
                ava->aa_desc->ad_type->sat_syntax,
                mr,
-               prefix,
-               ava->aa_value,
+               &prefix,
+               &ava->aa_value,
                &keys );
 
-       ber_bvfree( prefix );
-
        if( rc != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
                LDAP_LOG(( "filter", LDAP_LEVEL_ERR,
@@ -602,7 +604,7 @@ approx_candidates(
                return idl;
        }
 
-       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_READER );
+       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT );
        
        if ( db == NULL ) {
 #ifdef NEW_LOGGING
@@ -618,11 +620,11 @@ approx_candidates(
                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( be, db, &keys[i], &tmp );
 
                if( rc != LDAP_SUCCESS ) {
                        idl_free( idl );
@@ -655,11 +657,12 @@ approx_candidates(
                save = idl;
                idl = idl_intersection( be, idl, tmp );
                idl_free( save );
+               idl_free( tmp );
 
                if( idl == NULL ) break;
        }
 
-       ber_bvecfree( keys );
+       bvarray_free( keys );
 
        ldbm_cache_close( be, db );
 
@@ -747,8 +750,8 @@ substring_candidates(
        int rc;
        char *dbname;
        slap_mask_t mask;
-       struct berval *prefix;
-       struct berval **keys = NULL;
+       struct berval prefix = {0};
+       struct berval *keys = NULL;
        MatchingRule *mr;
 
 #ifdef NEW_LOGGING
@@ -788,19 +791,16 @@ substring_candidates(
                        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;
        }
 
@@ -809,12 +809,10 @@ substring_candidates(
                mask,
                sub->sa_desc->ad_type->sat_syntax,
                mr,
-               prefix,
+               &prefix,
                sub,
                &keys );
 
-       ber_bvfree( prefix );
-
        if( rc != LDAP_SUCCESS ) {
 #ifdef NEW_LOGGING
                LDAP_LOG(( "filter", LDAP_LEVEL_ERR,
@@ -843,7 +841,7 @@ substring_candidates(
                return idl;
        }
 
-       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_READER );
+       db = ldbm_cache_open( be, dbname, LDBM_SUFFIX, LDBM_WRCREAT );
        
        if ( db == NULL ) {
 #ifdef NEW_LOGGING
@@ -859,11 +857,11 @@ substring_candidates(
                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( be, db, &keys[i], &tmp );
 
                if( rc != LDAP_SUCCESS ) {
                        idl_free( idl );
@@ -897,11 +895,12 @@ substring_candidates(
                save = idl;
                idl = idl_intersection( be, idl, tmp );
                idl_free( save );
+               idl_free( tmp );
 
                if( idl == NULL ) break;
        }
 
-       ber_bvecfree( keys );
+       bvarray_free( keys );
 
        ldbm_cache_close( be, db );