1 /* mr.c - routines to manage matching rule definitions */
4 * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/string.h>
14 #include <ac/socket.h>
20 struct berval mir_name;
24 static Avlnode *mr_index = NULL;
25 static MatchingRule *mr_list = NULL;
29 struct mindexrec *mir1,
30 struct mindexrec *mir2
33 int i = mir1->mir_name.bv_len - mir2->mir_name.bv_len;
35 return (strcmp( mir1->mir_name.bv_val, mir2->mir_name.bv_val ));
44 int i = name->bv_len - mir->mir_name.bv_len;
46 return (strncmp( name->bv_val, mir->mir_name.bv_val, name->bv_len ));
50 mr_find( const char *mrname )
54 bv.bv_val = (char *)mrname;
55 bv.bv_len = strlen( mrname );
56 return mr_bvfind( &bv );
60 mr_bvfind( struct berval *mrname )
62 struct mindexrec *mir = NULL;
64 if ( (mir = (struct mindexrec *) avl_find( mr_index, mrname,
65 (AVL_CMP) mr_index_name_cmp )) != NULL ) {
66 return( mir->mir_mr );
76 avl_free(mr_index, ldap_memfree);
77 for (m=mr_list; m; m=n) {
79 ldap_matchingrule_free((LDAPMatchingRule *)m);
90 struct mindexrec *mir;
94 while ( *mrp != NULL ) {
95 mrp = &(*mrp)->smr_next;
100 mir = (struct mindexrec *)
101 ch_calloc( 1, sizeof(struct mindexrec) );
102 mir->mir_name.bv_val = smr->smr_oid;
103 mir->mir_name.bv_len = strlen( smr->smr_oid );
105 if ( avl_insert( &mr_index, (caddr_t) mir,
106 (AVL_CMP) mr_index_cmp,
107 (AVL_DUP) avl_dup_error ) ) {
110 return SLAP_SCHERR_MR_DUP;
112 /* FIX: temporal consistency check */
113 mr_bvfind(&mir->mir_name);
115 if ( (names = smr->smr_names) ) {
117 mir = (struct mindexrec *)
118 ch_calloc( 1, sizeof(struct mindexrec) );
119 mir->mir_name.bv_val = *names;
120 mir->mir_name.bv_len = strlen( *names );
122 if ( avl_insert( &mr_index, (caddr_t) mir,
123 (AVL_CMP) mr_index_cmp,
124 (AVL_DUP) avl_dup_error ) ) {
127 return SLAP_SCHERR_MR_DUP;
129 /* FIX: temporal consistency check */
130 mr_bvfind(&mir->mir_name);
139 LDAPMatchingRule *mr,
141 slap_mr_convert_func *convert,
142 slap_mr_normalize_func *normalize,
143 slap_mr_match_func *match,
144 slap_mr_indexer_func *indexer,
145 slap_mr_filter_func *filter,
154 smr = (MatchingRule *) ch_calloc( 1, sizeof(MatchingRule) );
155 AC_MEMCPY( &smr->smr_mrule, mr, sizeof(LDAPMatchingRule));
157 smr->smr_oidlen = strlen( mr->mr_oid );
158 smr->smr_usage = usage;
159 smr->smr_convert = convert;
160 smr->smr_normalize = normalize;
161 smr->smr_match = match;
162 smr->smr_indexer = indexer;
163 smr->smr_filter = filter;
164 smr->smr_associated = amr;
166 if ( smr->smr_syntax_oid ) {
167 if ( (syn = syn_find(smr->smr_syntax_oid)) ) {
168 smr->smr_syntax = syn;
170 *err = smr->smr_syntax_oid;
171 return SLAP_SCHERR_SYN_NOT_FOUND;
175 return SLAP_SCHERR_MR_INCOMPLETE;
177 code = mr_insert(smr,err);
183 register_matching_rule(
186 slap_mr_convert_func *convert,
187 slap_mr_normalize_func *normalize,
188 slap_mr_match_func *match,
189 slap_mr_indexer_func *indexer,
190 slap_mr_filter_func *filter,
191 const char* associated )
193 LDAPMatchingRule *mr;
194 MatchingRule *amr = NULL;
198 if( usage == SLAP_MR_NONE ) {
200 LDAP_LOG( OPERATION, ERR,
201 "register_matching_rule: %s not usable\n", desc, 0, 0 );
203 Debug( LDAP_DEBUG_ANY, "register_matching_rule: not usable %s\n",
210 if( associated != NULL ) {
211 amr = mr_find( associated );
218 LDAP_LOG( OPERATION, ERR,
219 "register_matching_rule: could not locate associated "
220 "matching rule %s for %s\n", associated, desc, 0 );
222 Debug( LDAP_DEBUG_ANY, "register_matching_rule: could not locate "
223 "associated matching rule %s for %s\n",
224 associated, desc, 0 );
233 mr = ldap_str2matchingrule( desc, &code, &err, LDAP_SCHEMA_ALLOW_ALL);
236 LDAP_LOG( OPERATION, ERR,
237 "register_matching_rule: %s before %s in %s.\n",
238 ldap_scherr2str(code), err, desc );
240 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n",
241 ldap_scherr2str(code), err, desc );
247 code = mr_add( mr, usage,
248 convert, normalize, match, indexer, filter, amr,
255 LDAP_LOG( OPERATION, ERR,
256 "register_matching_rule: %s for %s in %s.\n",
257 scherr2str(code), err, desc );
259 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s for %s in %s\n",
260 scherr2str(code), err, desc );
270 #if defined( SLAPD_SCHEMA_DN )
272 int mr_schema_info( Entry *e )
274 struct berval vals[2];
277 AttributeDescription *ad_matchingRules = slap_schema.si_ad_matchingRules;
279 vals[1].bv_val = NULL;
281 for ( mr = mr_list; mr; mr = mr->smr_next ) {
282 if ( mr->smr_usage & SLAP_MR_HIDE ) {
283 /* skip hidden rules */
287 if ( ! mr->smr_match ) {
288 /* skip rules without matching functions */
292 if ( ldap_matchingrule2bv( &mr->smr_mrule, vals ) == NULL ) {
296 Debug( LDAP_DEBUG_TRACE, "Merging mr [%ld] %s\n",
297 (long) vals[0].bv_len, vals[0].bv_val, 0 );
299 attr_merge( e, ad_matchingRules, vals );
300 ldap_memfree( vals[0].bv_val );
305 int mru_schema_info( Entry *e )