]> git.sur5r.net Git - openldap/commitdiff
Changed AttributeType.sat_cname from char * to struct berval.
authorHoward Chu <hyc@openldap.org>
Fri, 16 Nov 2001 08:18:58 +0000 (08:18 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 16 Nov 2001 08:18:58 +0000 (08:18 +0000)
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
servers/slapd/back-bdb/config.c
servers/slapd/back-bdb/filterindex.c
servers/slapd/back-bdb/index.c
servers/slapd/back-bdb/proto-bdb.h

index dd1fe3b851c63a2a6e8e4321433bcd9c98041405..c4d9ef7831aec3d152ef6e7e452a3a1bea0c3b24 100644 (file)
 
 /* 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 );
 }
 
index c22a84723974c00de01a35760a0701867a8c9fb2..46a5da0273ad0bb91523c5d9aa95e5866837cb7c 100644 (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;
index 3ea8a06cb1584d304b5667dfa5a222a0ffbd7301..929f0b2d373f913548300aa12634c80d9a2c66e7 100644 (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 );
index aea035d4313b07a10dd9eba8673118cc5ee4cccd..25f4c98f7b246c781e8358caac6db4be2e201c6c 100644 (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;
index ed16d8c50533a7665271a6392cfc7454f01db977..66a3015d1f36d3601e4e47fdb8a024572a167ec9 100644 (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((