From a3ded4782e30182875ca26ade6dafa437b109cec Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Fri, 16 Nov 2001 08:18:58 +0000 Subject: [PATCH] Changed AttributeType.sat_cname from char * to struct berval. Forced SLAP_USE_AD code, removed ifdefs of old code. filterindex.c is still badly broken when BDB_FILTER_INDICES is defined, working on that... --- servers/slapd/back-bdb/attr.c | 46 ++------------ servers/slapd/back-bdb/config.c | 2 +- servers/slapd/back-bdb/filterindex.c | 38 ++++-------- servers/slapd/back-bdb/index.c | 93 ++++++++++++++++------------ servers/slapd/back-bdb/proto-bdb.h | 7 +-- 5 files changed, 72 insertions(+), 114 deletions(-) diff --git a/servers/slapd/back-bdb/attr.c b/servers/slapd/back-bdb/attr.c index dd1fe3b851..c4d9ef7831 100644 --- a/servers/slapd/back-bdb/attr.c +++ b/servers/slapd/back-bdb/attr.c @@ -17,29 +17,17 @@ /* for the cache of attribute information (which are indexed, etc.) */ typedef struct bdb_attrinfo { -#ifdef SLAPD_USE_AD - AttributeDescription *ai_desc; /* attribute description cn;lang-en */ -#else - char *ai_desc; -#endif + AttributeDescription *ai_desc; /* attribute description cn;lang-en */ slap_mask_t ai_indexmask; /* how the attr is indexed */ } AttrInfo; static int ainfo_type_cmp( -#ifdef SLAPD_USE_AD AttributeDescription *desc, -#else - char *desc, -#endif AttrInfo *a ) { -#ifdef SLAPD_USE_AD - return ad_cmp( desc, a->ai_desc ); -#else - return( strcasecmp( desc, a->ai_desc ) ); -#endif + return desc - a->ai_desc; } static int @@ -48,21 +36,13 @@ ainfo_cmp( AttrInfo *b ) { -#ifdef SLAPD_USE_AD - return ad_cmp( a->ai_desc, b->ai_desc ); -#else - return( strcasecmp( a->ai_desc, b->ai_desc ) ); -#endif + return a->ai_desc - b->ai_desc; } void bdb_attr_mask( struct bdb_info *bdb, -#ifdef SLAPD_USE_AD - AttributeDescription *desc, -#else - const char *desc, -#endif + AttributeDescription *desc, slap_mask_t *indexmask ) { AttrInfo *a; @@ -210,12 +190,7 @@ bdb_attr_index_config( #endif -#ifdef SLAPD_USE_AD a->ai_desc = ad; -#else - a->ai_desc = ch_strdup( ad->ad_cname.bv_val ); -#endif - a->ai_indexmask = mask; rc = avl_insert( &bdb->bi_attrs, (caddr_t) a, @@ -236,20 +211,9 @@ bdb_attr_index_config( return LDAP_SUCCESS; } - -static void -ainfo_free( void *attr ) -{ - AttrInfo *ai = attr; -#ifndef SLAPD_USE_AD - free( ai->ai_desc ); -#endif - free( ai ); -} - void bdb_attr_index_destroy( Avlnode *tree ) { - avl_free( tree, ainfo_free ); + avl_free( tree, free ); } diff --git a/servers/slapd/back-bdb/config.c b/servers/slapd/back-bdb/config.c index c22a847239..46a5da0273 100644 --- a/servers/slapd/back-bdb/config.c +++ b/servers/slapd/back-bdb/config.c @@ -111,7 +111,7 @@ bdb_db_config( } bdb->bi_dbenv_mode = strtol( argv[1], NULL, 0 ); -#if BDB_CONFIG_INDICES +#if BDB_FILTER_INDICES /* attribute to index */ } else if ( strcasecmp( argv[0], "index" ) == 0 ) { int rc; diff --git a/servers/slapd/back-bdb/filterindex.c b/servers/slapd/back-bdb/filterindex.c index 3ea8a06cb1..929f0b2d37 100644 --- a/servers/slapd/back-bdb/filterindex.c +++ b/servers/slapd/back-bdb/filterindex.c @@ -203,7 +203,7 @@ presence_candidates( DB *db; int rc; slap_mask_t mask; - struct berval *prefix; + struct berval prefix = {0}; Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates\n", 0, 0, 0 ); BDB_IDL_ZERO( ids ); @@ -227,7 +227,7 @@ presence_candidates( goto done; } - if( prefix == NULL ) { + if( prefix.bv_val == NULL ) { Debug( LDAP_DEBUG_TRACE, "<= bdb_presense_candidates: no prefix\n", 0, 0, 0 ); @@ -235,7 +235,7 @@ presence_candidates( goto done; } - rc = bdb_key_read( be, db, prefix, ids ); + rc = bdb_key_read( be, db, NULL, &prefix, ids ); if( rc == DB_NOTFOUND ) { rc = 0; @@ -254,7 +254,6 @@ presence_candidates( (long) BDB_IDL_LAST(ids) ); done: - ber_bvfree( prefix ); return rc; } @@ -270,7 +269,7 @@ equality_candidates( int rc; char *dbname; slap_mask_t mask; - struct berval *prefix; + struct berval prefix = {0}; struct berval **keys = NULL; MatchingRule *mr; @@ -290,12 +289,10 @@ equality_candidates( mr = ava->aa_desc->ad_type->sat_equality; if( !mr ) { - ber_bvfree( prefix ); return 0; } if( !mr->smr_filter ) { - ber_bvfree( prefix ); return 0; } @@ -304,12 +301,10 @@ equality_candidates( mask, ava->aa_desc->ad_type->sat_syntax, mr, - prefix, + &prefix, ava->aa_value, &keys ); - ber_bvfree( prefix ); - if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, "<= bdb_equality_candidates: MR filter failed (%d)\n", @@ -328,7 +323,7 @@ equality_candidates( ID save[BDB_IDL_UM_SIZE]; ID tmp[BDB_IDL_UM_SIZE]; - rc = bdb_key_read( be, db, keys[i], tmp ); + rc = bdb_key_read( be, db, NULL, keys[i], tmp ); if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, @@ -376,7 +371,7 @@ approx_candidates( int rc; char *dbname; slap_mask_t mask; - struct berval *prefix; + struct berval prefix = {0}; struct berval **keys = NULL; MatchingRule *mr; @@ -399,12 +394,10 @@ approx_candidates( } if( !mr ) { - ber_bvfree( prefix ); return idl; } if( !mr->smr_filter ) { - ber_bvfree( prefix ); return idl; } @@ -413,12 +406,10 @@ approx_candidates( mask, ava->aa_desc->ad_type->sat_syntax, mr, - prefix, + &prefix, ava->aa_value, &keys ); - ber_bvfree( prefix ); - if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, "<= approx_candidates: (%s) MR filter failed (%d)\n", @@ -444,7 +435,7 @@ approx_candidates( ID_BLOCK *save; ID_BLOCK *tmp; - rc = bdb_key_read( be, db, keys[i], tmp ); + rc = bdb_key_read( be, db, NULL, keys[i], tmp ); if( rc != LDAP_SUCCESS ) { idl_free( idl ); @@ -491,7 +482,7 @@ substring_candidates( int i; int rc; slap_mask_t mask; - struct berval *prefix; + struct berval prefix = {0}; struct berval **keys = NULL; MatchingRule *mr; @@ -514,19 +505,16 @@ substring_candidates( Debug( LDAP_DEBUG_ANY, "<= substrings_candidates: not indexed\n", 0, 0, 0 ); - 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; } @@ -535,12 +523,10 @@ substring_candidates( mask, sub->sa_desc->ad_type->sat_syntax, mr, - prefix, + &prefix, sub, &keys ); - ber_bvfree( prefix ); - if( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, "<= substrings_candidates: (%s) MR filter failed (%d)\n", @@ -568,7 +554,7 @@ substring_candidates( ID_BLOCK *save; ID_BLOCK *tmp; - rc = bdb_key_read( be, db, keys[i], &tmp ); + rc = bdb_key_read( be, db, NULL, keys[i], &tmp ); if( rc != LDAP_SUCCESS ) { idl_free( idl ); diff --git a/servers/slapd/back-bdb/index.c b/servers/slapd/back-bdb/index.c index aea035d431..25f4c98f7b 100644 --- a/servers/slapd/back-bdb/index.c +++ b/servers/slapd/back-bdb/index.c @@ -19,47 +19,54 @@ static slap_mask_t index_mask( Backend *be, AttributeDescription *desc, char **dbname, - char **atname ) + struct berval *atname ) { AttributeType *at; slap_mask_t mask = 0; - bdb_attr_mask( be->be_private, desc->ad_cname.bv_val, &mask ); + bdb_attr_mask( be->be_private, desc, &mask ); if( mask ) { - *atname = desc->ad_cname.bv_val; + *atname = desc->ad_cname; *dbname = desc->ad_cname.bv_val; return mask; } - if( slap_ad_is_lang( desc ) ) { + /* If there is a language tag, did we ever index the base + * type? If so, check for mask, otherwise it's not there. + */ + if( slap_ad_is_lang( desc ) && desc != desc->ad_type->sat_ad ) { /* has language tag */ - bdb_attr_mask( be->be_private, desc->ad_type->sat_cname, &mask ); + bdb_attr_mask( be->be_private, desc->ad_type->sat_ad, &mask ); if( mask & SLAP_INDEX_AUTO_LANG ) { - *atname = desc->ad_cname.bv_val; - *dbname = desc->ad_type->sat_cname; + *atname = desc->ad_cname; + *dbname = desc->ad_type->sat_cname.bv_val; return mask; } if( mask & SLAP_INDEX_LANG ) { *atname = desc->ad_type->sat_cname; - *dbname = desc->ad_type->sat_cname; + *dbname = desc->ad_type->sat_cname.bv_val; return mask; } } /* see if supertype defined mask for its subtypes */ for( at = desc->ad_type; at != NULL ; at = at->sat_sup ) { - bdb_attr_mask( be->be_private, at->sat_cname, &mask ); + /* If no AD, we've never indexed this type */ + if (!at->sat_ad) + continue; + + bdb_attr_mask( be->be_private, at->sat_ad, &mask ); if( mask & SLAP_INDEX_AUTO_SUBTYPES ) { *atname = desc->ad_type->sat_cname; - *dbname = at->sat_cname; + *dbname = at->sat_cname.bv_val; return mask; } if( mask & SLAP_INDEX_SUBTYPES ) { *atname = at->sat_cname; - *dbname = at->sat_cname; + *dbname = at->sat_cname.bv_val; return mask; } @@ -75,15 +82,14 @@ int bdb_index_param( int ftype, DB **dbp, slap_mask_t *maskp, - struct berval **prefixp ) + struct berval *prefixp ) { int rc; slap_mask_t mask; DB *db; char *dbname; - char *atname; - mask = index_mask( be, desc, &dbname, &atname ); + mask = index_mask( be, desc, &dbname, prefixp ); if( mask == 0 ) { return LDAP_INAPPROPRIATE_MATCHING; @@ -128,7 +134,6 @@ int bdb_index_param( done: *dbp = db; - *prefixp = ber_bvstrdup( atname ); *maskp = mask; return LDAP_SUCCESS; } @@ -137,7 +142,7 @@ static int indexer( Backend *be, DB_TXN *txn, char *dbname, - char *atname, + struct berval *atname, struct berval **vals, ID id, int op, @@ -148,7 +153,6 @@ static int indexer( DB *db; AttributeDescription *ad = NULL; struct berval **keys; - struct berval prefix; assert( mask ); @@ -166,14 +170,11 @@ static int indexer( return LDAP_OTHER; } - rc = slap_str2ad( atname, &ad, &text ); + rc = slap_bv2ad( atname, &ad, &text ); if( rc != LDAP_SUCCESS ) return rc; - prefix.bv_val = atname; - prefix.bv_len = strlen( atname ); - if( IS_SLAP_INDEX( mask, SLAP_INDEX_PRESENT ) ) { - rc = bdb_key_change( be, db, txn, &prefix, id, op ); + rc = bdb_key_change( be, db, txn, atname, id, op ); if( rc ) { goto done; } @@ -185,7 +186,7 @@ static int indexer( mask, ad->ad_type->sat_syntax, ad->ad_type->sat_equality, - &prefix, vals, &keys ); + atname, vals, &keys ); if( rc == LDAP_SUCCESS && keys != NULL ) { for( i=0; keys[i] != NULL; i++ ) { @@ -206,7 +207,7 @@ static int indexer( mask, ad->ad_type->sat_syntax, ad->ad_type->sat_approx, - &prefix, vals, &keys ); + atname, vals, &keys ); if( rc == LDAP_SUCCESS && keys != NULL ) { for( i=0; keys[i] != NULL; i++ ) { @@ -228,7 +229,7 @@ static int indexer( mask, ad->ad_type->sat_syntax, ad->ad_type->sat_substr, - &prefix, vals, &keys ); + atname, vals, &keys ); if( rc == LDAP_SUCCESS && keys != NULL ) { for( i=0; keys[i] != NULL; i++ ) { @@ -260,7 +261,7 @@ static int index_at_values( slap_mask_t *maskp ) { int rc; - slap_mask_t mask; + slap_mask_t mask = 0; slap_mask_t tmpmask = 0; int lindex = 0; @@ -274,17 +275,19 @@ static int index_at_values( if( rc ) return rc; } - bdb_attr_mask( be->be_private, type->sat_cname, &mask ); + /* If this type has no AD, we've never used it before */ + if (type->sat_ad) + bdb_attr_mask( be->be_private, type->sat_ad, &mask ); if( mask ) { - *dbnamep = type->sat_cname; + *dbnamep = type->sat_cname.bv_val; } else if ( tmpmask & SLAP_INDEX_AUTO_SUBTYPES ) { mask = tmpmask; } if( mask ) { rc = indexer( be, txn, *dbnamep, - type->sat_cname, + &type->sat_cname, vals, id, op, mask ); @@ -293,33 +296,41 @@ static int index_at_values( if( lang->bv_len ) { char *dbname = NULL; - size_t tlen = strlen( type->sat_cname ); - size_t llen = lang->bv_len; - char *lname = ch_malloc( tlen + llen + sizeof(";") ); + struct berval lname; + AttributeDescription *desc; - sprintf( lname, "%s;%s", type->sat_cname, lang->bv_val ); + tmpmask = 0; + lname.bv_val = NULL; - bdb_attr_mask( be->be_private, lname, &tmpmask ); + desc = ad_find_lang( type, lang ); + if (desc) + bdb_attr_mask( be->be_private, desc, &tmpmask ); if( tmpmask ) { - dbname = lname; + dbname = desc->ad_cname.bv_val; + lname = desc->ad_cname; + mask = tmpmask; } else if ( mask & SLAP_INDEX_AUTO_LANG ) { dbname = *dbnamep; - tmpmask = mask; + lname.bv_len = type->sat_cname.bv_len+lang->bv_len + 1; + lname.bv_val = ch_malloc( lname.bv_len + 1 ); + strcpy(lname.bv_val, type->sat_cname.bv_val); + lname.bv_val[type->sat_cname.bv_len] = ';'; + strcpy(lname.bv_val+type->sat_cname.bv_len+1, + lang->bv_val); } if( dbname != NULL ) { - rc = indexer( be, txn, dbname, lname, + rc = indexer( be, txn, dbname, &lname, vals, id, op, - tmpmask ); + mask ); + if (!tmpmask) + ch_free( lname.bv_val ); if( rc ) { - ch_free( lname ); return rc; } } - - ch_free( lname ); } return LDAP_SUCCESS; diff --git a/servers/slapd/back-bdb/proto-bdb.h b/servers/slapd/back-bdb/proto-bdb.h index ed16d8c505..66a3015d1f 100644 --- a/servers/slapd/back-bdb/proto-bdb.h +++ b/servers/slapd/back-bdb/proto-bdb.h @@ -30,11 +30,7 @@ Entry *bdb_deref_internal_r LDAP_P(( */ void bdb_attr_mask( struct bdb_info *bdb, -#ifdef SLAPD_USE_AD AttributeDescription *desc, -#else - const char *desc, -#endif slap_mask_t *indexmask ); int bdb_attr_index_config LDAP_P(( struct bdb_info *bdb, @@ -122,6 +118,7 @@ void bdb_errcall( const char *pfx, char * msg ); */ int bdb_filter_candidates( Backend *be, + ID *range, Filter *f, ID *ids ); @@ -221,7 +218,7 @@ bdb_index_param LDAP_P(( int ftype, DB **db, slap_mask_t *mask, - struct berval **prefix )); + struct berval *prefix )); extern int bdb_index_values LDAP_P(( -- 2.39.5