/* 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
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;
#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,
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 );
}
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 );
goto done;
}
- if( prefix == NULL ) {
+ if( prefix.bv_val == NULL ) {
Debug( LDAP_DEBUG_TRACE,
"<= bdb_presense_candidates: no prefix\n",
0, 0, 0 );
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;
(long) BDB_IDL_LAST(ids) );
done:
- ber_bvfree( prefix );
return rc;
}
int rc;
char *dbname;
slap_mask_t mask;
- struct berval *prefix;
+ struct berval prefix = {0};
struct berval **keys = NULL;
MatchingRule *mr;
mr = ava->aa_desc->ad_type->sat_equality;
if( !mr ) {
- ber_bvfree( prefix );
return 0;
}
if( !mr->smr_filter ) {
- ber_bvfree( prefix );
return 0;
}
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",
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,
int rc;
char *dbname;
slap_mask_t mask;
- struct berval *prefix;
+ struct berval prefix = {0};
struct berval **keys = NULL;
MatchingRule *mr;
}
if( !mr ) {
- ber_bvfree( prefix );
return idl;
}
if( !mr->smr_filter ) {
- ber_bvfree( prefix );
return idl;
}
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",
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 );
int i;
int rc;
slap_mask_t mask;
- struct berval *prefix;
+ struct berval prefix = {0};
struct berval **keys = NULL;
MatchingRule *mr;
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;
}
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",
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 );
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;
}
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;
done:
*dbp = db;
- *prefixp = ber_bvstrdup( atname );
*maskp = mask;
return LDAP_SUCCESS;
}
Backend *be,
DB_TXN *txn,
char *dbname,
- char *atname,
+ struct berval *atname,
struct berval **vals,
ID id,
int op,
DB *db;
AttributeDescription *ad = NULL;
struct berval **keys;
- struct berval prefix;
assert( mask );
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;
}
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++ ) {
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++ ) {
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++ ) {
slap_mask_t *maskp )
{
int rc;
- slap_mask_t mask;
+ slap_mask_t mask = 0;
slap_mask_t tmpmask = 0;
int lindex = 0;
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 );
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;