]> git.sur5r.net Git - openldap/commitdiff
Add BDB index config code
authorKurt Zeilenga <kurt@openldap.org>
Wed, 3 Oct 2001 21:11:52 +0000 (21:11 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Wed, 3 Oct 2001 21:11:52 +0000 (21:11 +0000)
servers/slapd/back-bdb/Makefile.in
servers/slapd/back-bdb/attr.c [new file with mode: 0644]
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/config.c
servers/slapd/back-bdb/proto-bdb.h

index cc8452ff6958aff53d83f62f6d5c6d76aa6c0b2f..414c89e486a8c95a0aefac9e52ee7b1ab0476f87 100644 (file)
@@ -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 (file)
index 0000000..732e8b6
--- /dev/null
@@ -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 <stdio.h>
+
+#include <ac/socket.h>
+#include <ac/string.h>
+
+#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
index fb0b11e5a9a05971c58f5380c089c04273637dd1..78a54900edb6e9ca8e519bc653a73a77f4a032fa 100644 (file)
@@ -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;
 };
 
index d6a691422ac723fa17d6a70f0e84a12a65cdb5f0..f9a66fcc638c5a4f5283f75b5087d34bf5e4683a 100644 (file)
@@ -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
index 60d11f2cba7d5ef00b1c9c9e7b876df1a385c524..0ee000d280fa7c17c98fa2f7d5c545f49ffa4b56 100644 (file)
@@ -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
  */