1 /* attr.c - backend routines for dealing with attributes */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
12 #include <ac/socket.h>
13 #include <ac/string.h>
16 #include "back-ldbm.h"
18 /* for the cache of attribute information (which are indexed, etc.) */
19 typedef struct ldbm_attrinfo {
20 char *ai_type; /* type name (cn, sn, ...) */
21 int ai_indexmask; /* how the attr is indexed */
30 return( strcasecmp( type, a->ai_type ) );
39 return( strcasecmp( a->ai_type, b->ai_type ) );
43 * Called when a duplicate "index" line is encountered.
45 * returns 1 => original from init code, indexmask updated
46 * 2 => original not from init code, warn the user
56 * if the duplicate definition is because we initialized the attr,
57 * just add what came from the config file. otherwise, complain.
59 if ( a->ai_indexmask & SLAP_INDEX_FROMINIT ) {
60 a->ai_indexmask |= b->ai_indexmask;
77 if ( (a = (AttrInfo *) avl_find( li->li_attrs, type,
78 (AVL_CMP) ainfo_type_cmp )) == NULL ) {
79 if ( (a = (AttrInfo *) avl_find( li->li_attrs, "default",
80 (AVL_CMP) ainfo_type_cmp )) == NULL ) {
84 *indexmask = a->ai_indexmask;
98 char **attrs, **indexes;
101 attrs = str2charray( argv[0], "," );
103 indexes = str2charray( argv[1], "," );
105 for ( i = 0; attrs[i] != NULL; i++ ) {
106 a = (AttrInfo *) ch_malloc( sizeof(AttrInfo) );
107 a->ai_type = ch_strdup( attrs[i] );
111 SLAP_INDEX_PRESENCE | SLAP_INDEX_EQUALITY |
112 SLAP_INDEX_APPROX | SLAP_INDEX_SUBSTR);
115 for ( j = 0; indexes[j] != NULL; j++ ) {
116 if ( strncasecmp( indexes[j],
117 "pres", sizeof("pres")-1 ) == 0 )
119 a->ai_indexmask |= SLAP_INDEX_PRESENCE;
121 } else if ( strncasecmp( indexes[j],
122 "eq", sizeof("eq")-1 ) == 0 )
124 a->ai_indexmask |= SLAP_INDEX_EQUALITY;
126 } else if ( strncasecmp( indexes[j],
127 "approx", sizeof("approx")-1 ) == 0 )
129 a->ai_indexmask |= SLAP_INDEX_APPROX;
131 } else if ( strncasecmp( indexes[j],
132 "sub", sizeof("sub")-1 ) == 0 )
134 a->ai_indexmask |= SLAP_INDEX_SUBSTR;
136 } else if ( strncasecmp( indexes[j],
137 "none", sizeof("none")-1 ) == 0 )
139 if ( a->ai_indexmask != 0 ) {
140 fprintf( stderr, "%s: line %d: "
141 "index type \"none\" cannot be combined with other types\n",
147 fprintf( stderr, "%s: line %d: "
148 "unknown index type \"%s\" (ignored)\n",
149 fname, lineno, indexes[j] );
150 fprintf( stderr, "\tvalid index types are "
151 "\"pres\", \"eq\", \"approx\", or \"sub\"\n" );
157 a->ai_indexmask |= SLAP_INDEX_FROMINIT;
160 switch (avl_insert( &li->li_attrs, (caddr_t) a,
161 (AVL_CMP) ainfo_cmp, (AVL_DUP) ainfo_dup ))
163 case 1: /* duplicate - updating init version */
168 case 2: /* user duplicate - ignore and warn */
170 "%s: line %d: duplicate index definition for attr \"%s\" (ignored)\n",
171 fname, lineno, a->ai_type );
176 default:; /* inserted ok */
180 charray_free( attrs );
182 charray_free( indexes );
187 ainfo_free( void *attr )
195 attr_index_destroy( Avlnode *tree )
197 avl_free( tree, ainfo_free );