From 0135c8dbb1e4b97679a70aa53488f2b5ba8e2ce7 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Wed, 3 Oct 2001 21:11:52 +0000 Subject: [PATCH] Add BDB index config code --- servers/slapd/back-bdb/Makefile.in | 2 + servers/slapd/back-bdb/attr.c | 263 +++++++++++++++++++++++++++++ servers/slapd/back-bdb/back-bdb.h | 7 +- servers/slapd/back-bdb/config.c | 2 +- servers/slapd/back-bdb/proto-bdb.h | 14 ++ 5 files changed, 286 insertions(+), 2 deletions(-) create mode 100644 servers/slapd/back-bdb/attr.c diff --git a/servers/slapd/back-bdb/Makefile.in b/servers/slapd/back-bdb/Makefile.in index cc8452ff69..414c89e486 100644 --- a/servers/slapd/back-bdb/Makefile.in +++ b/servers/slapd/back-bdb/Makefile.in @@ -3,10 +3,12 @@ SRCS = init.c tools.c config.c \ add.c bind.c compare.c delete.c modify.c modrdn.c search.c \ extended.c passwd.c referral.c \ + attr.c \ dn2entry.c dn2id.c error.c id2entry.c idl.c nextid.c OBJS = init.lo tools.lo config.lo \ add.lo bind.lo compare.lo delete.lo modify.lo modrdn.lo search.lo \ extended.lo passwd.lo referral.lo \ + attr.lo \ dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo nextid.lo LDAP_INCDIR= ../../../include diff --git a/servers/slapd/back-bdb/attr.c b/servers/slapd/back-bdb/attr.c new file mode 100644 index 0000000000..732e8b6908 --- /dev/null +++ b/servers/slapd/back-bdb/attr.c @@ -0,0 +1,263 @@ +/* attr.c - backend routines for dealing with attributes */ +/* $OpenLDAP$ */ +/* + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +#include "portable.h" + +#include + +#include +#include + +#include "slap.h" +#include "back-bdb.h" + +#if BDB_CONFIG_INDICES + +/* for the cache of attribute information (which are indexed, etc.) */ +typedef struct ldbm_attrinfo { +#ifdef SLAPD_USE_AD + AttributeDescription *ai_desc; /* attribute description cn;lang-en */ +#else + char *ai_desc; +#endif + 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 +} + +static int +ainfo_cmp( + AttrInfo *a, + 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 +} + +#if 0 +void +bdb_attr_mask( + struct bdb_info *bdb, +#ifdef SLAPD_USE_AD + AttributeDescription *desc, +#else + const char *desc, +#endif + slap_mask_t *indexmask ) +{ + AttrInfo *a; + + a = (AttrInfo *) avl_find( bdb->bi_attrs, desc, + (AVL_CMP) ainfo_type_cmp ); + + *indexmask = a != NULL ? a->ai_indexmask : 0; +} +#endif + +int +bdb_attr_index_config( + struct bdb_info *bdb, + const char *fname, + int lineno, + int argc, + char **argv ) +{ + int rc; + int i; + slap_mask_t mask; + char **attrs; + char **indexes = NULL; + + attrs = str2charray( argv[0], "," ); + + if( attrs == NULL ) { + fprintf( stderr, "%s: line %d: " + "no attributes specified: %s\n", + fname, lineno, argv[0] ); + return LDAP_PARAM_ERROR; + } + + if ( argc > 1 ) { + indexes = str2charray( argv[1], "," ); + + if( indexes == NULL ) { + fprintf( stderr, "%s: line %d: " + "no indexes specified: %s\n", + fname, lineno, argv[1] ); + return LDAP_PARAM_ERROR; + } + } + + if( indexes == NULL ) { + mask = bdb->bi_defaultmask; + + } else { + mask = 0; + + for ( i = 0; indexes[i] != NULL; i++ ) { + slap_mask_t index; + rc = slap_str2index( indexes[i], &index ); + + if( rc != LDAP_SUCCESS ) { + fprintf( stderr, "%s: line %d: " + "index type \"%s\" undefined\n", + fname, lineno, indexes[i] ); + return LDAP_PARAM_ERROR; + } + + mask |= index; + } + } + + if( !mask ) { + fprintf( stderr, "%s: line %d: " + "no indexes selected\n", + fname, lineno ); + return LDAP_PARAM_ERROR; + } + + for ( i = 0; attrs[i] != NULL; i++ ) { + AttrInfo *a; + AttributeDescription *ad; + const char *text; + + if( strcasecmp( attrs[i], "default" ) == 0 ) { + bdb->bi_defaultmask = mask; + continue; + } + + a = (AttrInfo *) ch_malloc( sizeof(AttrInfo) ); + + ad = NULL; + rc = slap_str2ad( attrs[i], &ad, &text ); + + if( rc != LDAP_SUCCESS ) { + fprintf( stderr, "%s: line %d: " + "index attribute \"%s\" undefined\n", + fname, lineno, attrs[i] ); + return rc; + } + + if( slap_ad_is_binary( ad ) ) { + fprintf( stderr, "%s: line %d: " + "index of attribute \"%s\" disallowed\n", + fname, lineno, attrs[i] ); + return LDAP_UNWILLING_TO_PERFORM; + } + + if( IS_SLAP_INDEX( mask, SLAP_INDEX_APPROX ) && !( + ( ad->ad_type->sat_approx + && ad->ad_type->sat_approx->smr_indexer + && ad->ad_type->sat_approx->smr_filter ) + && ( ad->ad_type->sat_equality + && ad->ad_type->sat_equality->smr_indexer + && ad->ad_type->sat_equality->smr_filter ) ) ) + { + fprintf( stderr, "%s: line %d: " + "approx index of attribute \"%s\" disallowed\n", + fname, lineno, attrs[i] ); + return LDAP_INAPPROPRIATE_MATCHING; + } + + if( IS_SLAP_INDEX( mask, SLAP_INDEX_EQUALITY ) && !( + ad->ad_type->sat_equality + && ad->ad_type->sat_equality->smr_indexer + && ad->ad_type->sat_equality->smr_filter ) ) + { + fprintf( stderr, "%s: line %d: " + "equality index of attribute \"%s\" disallowed\n", + fname, lineno, attrs[i] ); + return LDAP_INAPPROPRIATE_MATCHING; + } + + if( IS_SLAP_INDEX( mask, SLAP_INDEX_SUBSTR ) && !( + ad->ad_type->sat_substr + && ad->ad_type->sat_substr->smr_indexer + && ad->ad_type->sat_substr->smr_filter ) ) + { + fprintf( stderr, "%s: line %d: " + "substr index of attribute \"%s\" disallowed\n", + fname, lineno, attrs[i] ); + return LDAP_INAPPROPRIATE_MATCHING; + } + +#ifdef NEW_LOGGING + LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1, + "attr_index_config: index %s 0x%04x\n", + ad->ad_cname->bv_val, mask )); +#else + Debug( LDAP_DEBUG_CONFIG, "index %s 0x%04x\n", + ad->ad_cname->bv_val, mask, 0 ); +#endif + + +#ifdef SLAPD_USE_AD + a->ai_desc = ad; +#else + a->ai_desc = ch_strdup( ad->ad_cname->bv_val ); + ad_free( ad, 1 ); +#endif + + a->ai_indexmask = mask; + + rc = avl_insert( &bdb->bi_attrs, (caddr_t) a, + (AVL_CMP) ainfo_cmp, (AVL_DUP) avl_dup_error ); + + if( rc ) { + fprintf( stderr, "%s: line %d: duplicate index definition " + "for attr \"%s\" (ignored)\n", + fname, lineno, attrs[i] ); + + return LDAP_PARAM_ERROR; + } + } + + charray_free( attrs ); + if ( indexes != NULL ) charray_free( indexes ); + + return LDAP_SUCCESS; +} + + +static void +ainfo_free( void *attr ) +{ + AttrInfo *ai = attr; +#ifdef SLAPD_USE_AD + ad_free( ai->ai_desc, 1 ); +#else + free( ai->ai_desc ); +#endif + free( ai ); +} + +void +bdb_attr_index_destroy( Avlnode *tree ) +{ + avl_free( tree, ainfo_free ); +} + +#endif diff --git a/servers/slapd/back-bdb/back-bdb.h b/servers/slapd/back-bdb/back-bdb.h index fb0b11e5a9..78a54900ed 100644 --- a/servers/slapd/back-bdb/back-bdb.h +++ b/servers/slapd/back-bdb/back-bdb.h @@ -17,7 +17,7 @@ LDAP_BEGIN_DECL #define BBD_INDEX 1 /* #define BDB_FILTER_INDICES 1 */ -/* #define BDB_CONFIG_INDICES 1 */ +#define BDB_CONFIG_INDICES 1 #define DN_BASE_PREFIX SLAP_INDEX_EQUALITY_PREFIX #define DN_ONE_PREFIX '%' @@ -73,6 +73,11 @@ struct bdb_info { ldap_pvt_thread_t bi_lock_detect_tid; #endif +#if BDB_CONFIG_INDICES + slap_mask_t bi_defaultmask; + Avlnode *bi_attrs; +#endif + ID bi_lastid; }; diff --git a/servers/slapd/back-bdb/config.c b/servers/slapd/back-bdb/config.c index d6a691422a..f9a66fcc63 100644 --- a/servers/slapd/back-bdb/config.c +++ b/servers/slapd/back-bdb/config.c @@ -126,7 +126,7 @@ bdb_db_config( "line (ignored)\n", fname, lineno ); } - rc = attr_index_config( li, fname, lineno, argc - 1, &argv[1] ); + rc = bdb_attr_index_config( bdb, fname, lineno, argc - 1, &argv[1] ); if( rc != LDAP_SUCCESS ) return 1; #endif diff --git a/servers/slapd/back-bdb/proto-bdb.h b/servers/slapd/back-bdb/proto-bdb.h index 60d11f2cba..0ee000d280 100644 --- a/servers/slapd/back-bdb/proto-bdb.h +++ b/servers/slapd/back-bdb/proto-bdb.h @@ -25,6 +25,20 @@ Entry *bdb_deref_internal_r LDAP_P(( #define deref_dn_r( be, dn, err, matched, text ) \ bdb_deref_internal_r( be, NULL, dn, err, matched, text) +/* + * attr.c + */ + +void bdb_attr_mask LDAP_P(( struct bdb_info *bdb, + const char *desc, + slap_mask_t *indexmask )); + +int bdb_attr_index_config LDAP_P(( struct bdb_info *bdb, + const char *fname, int lineno, + int argc, char **argv )); + +void bdb_attr_index_destroy LDAP_P(( Avlnode *tree )); + /* * dn2entry.c */ -- 2.39.5