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...
This commit is contained in:
Howard Chu 2001-11-16 08:18:58 +00:00
parent 0bfaa8b4ae
commit a3ded4782e
5 changed files with 72 additions and 114 deletions

View File

@ -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 );
}

View File

@ -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;

View File

@ -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 );

View File

@ -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;

View File

@ -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((