mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-02-23 14:09:39 +08:00
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:
parent
0bfaa8b4ae
commit
a3ded4782e
@ -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 );
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 );
|
||||
|
@ -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;
|
||||
|
@ -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((
|
||||
|
Loading…
Reference in New Issue
Block a user