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>
21 struct berval mir_name;
25 static Avlnode *mr_index = NULL;
26 static MatchingRule *mr_list = NULL;
30 struct mindexrec *mir1,
31 struct mindexrec *mir2
34 int i = mir1->mir_name.bv_len - mir2->mir_name.bv_len;
36 return (strcmp( mir1->mir_name.bv_val, mir2->mir_name.bv_val ));
45 int i = name->bv_len - mir->mir_name.bv_len;
47 return (strncmp( name->bv_val, mir->mir_name.bv_val, name->bv_len ));
51 mr_find( const char *mrname )
55 bv.bv_val = (char *)mrname;
56 bv.bv_len = strlen( mrname );
57 return mr_bvfind( &bv );
61 mr_bvfind( struct berval *mrname )
63 struct mindexrec *mir = NULL;
65 if ( (mir = (struct mindexrec *) avl_find( mr_index, mrname,
66 (AVL_CMP) mr_index_name_cmp )) != NULL ) {
67 return( mir->mir_mr );
77 avl_free(mr_index, ldap_memfree);
78 for (m=mr_list; m; m=n) {
80 ldap_matchingrule_free((LDAPMatchingRule *)m);
91 struct mindexrec *mir;
95 while ( *mrp != NULL ) {
96 mrp = &(*mrp)->smr_next;
100 if ( smr->smr_oid ) {
101 mir = (struct mindexrec *)
102 ch_calloc( 1, sizeof(struct mindexrec) );
103 mir->mir_name.bv_val = smr->smr_oid;
104 mir->mir_name.bv_len = strlen( smr->smr_oid );
106 if ( avl_insert( &mr_index, (caddr_t) mir,
107 (AVL_CMP) mr_index_cmp,
108 (AVL_DUP) avl_dup_error ) ) {
111 return SLAP_SCHERR_DUP_RULE;
113 /* FIX: temporal consistency check */
114 mr_bvfind(&mir->mir_name);
116 if ( (names = smr->smr_names) ) {
118 mir = (struct mindexrec *)
119 ch_calloc( 1, sizeof(struct mindexrec) );
120 mir->mir_name.bv_val = *names;
121 mir->mir_name.bv_len = strlen( *names );
123 if ( avl_insert( &mr_index, (caddr_t) mir,
124 (AVL_CMP) mr_index_cmp,
125 (AVL_DUP) avl_dup_error ) ) {
128 return SLAP_SCHERR_DUP_RULE;
130 /* FIX: temporal consistency check */
131 mr_bvfind(&mir->mir_name);
140 LDAPMatchingRule *mr,
142 slap_mr_convert_func *convert,
143 slap_mr_normalize_func *normalize,
144 slap_mr_match_func *match,
145 slap_mr_indexer_func *indexer,
146 slap_mr_filter_func *filter,
155 smr = (MatchingRule *) ch_calloc( 1, sizeof(MatchingRule) );
156 AC_MEMCPY( &smr->smr_mrule, mr, sizeof(LDAPMatchingRule));
158 smr->smr_oidlen = strlen( mr->mr_oid );
159 smr->smr_usage = usage;
160 smr->smr_convert = convert;
161 smr->smr_normalize = normalize;
162 smr->smr_match = match;
163 smr->smr_indexer = indexer;
164 smr->smr_filter = filter;
165 smr->smr_associated = amr;
167 if ( smr->smr_syntax_oid ) {
168 if ( (syn = syn_find(smr->smr_syntax_oid)) ) {
169 smr->smr_syntax = syn;
171 *err = smr->smr_syntax_oid;
172 return SLAP_SCHERR_SYN_NOT_FOUND;
176 return SLAP_SCHERR_MR_INCOMPLETE;
178 code = mr_insert(smr,err);
184 register_matching_rule(
187 slap_mr_convert_func *convert,
188 slap_mr_normalize_func *normalize,
189 slap_mr_match_func *match,
190 slap_mr_indexer_func *indexer,
191 slap_mr_filter_func *filter,
192 const char* associated )
194 LDAPMatchingRule *mr;
195 MatchingRule *amr = NULL;
199 if( usage == SLAP_MR_NONE ) {
201 LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
202 "register_matching_rule: %s not usable\n", desc ));
204 Debug( LDAP_DEBUG_ANY, "register_matching_rule: not usable %s\n",
211 if( associated != NULL ) {
212 amr = mr_find( associated );
219 LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
220 "register_matching_rule: could not locate associated matching rule %s for %s\n",
223 Debug( LDAP_DEBUG_ANY, "register_matching_rule: could not locate "
224 "associated matching rule %s for %s\n",
225 associated, desc, 0 );
234 mr = ldap_str2matchingrule( desc, &code, &err, LDAP_SCHEMA_ALLOW_ALL);
237 LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
238 "register_matching_rule: %s before %s in %s.\n",
239 ldap_scherr2str(code), err, desc ));
241 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n",
242 ldap_scherr2str(code), err, desc );
248 code = mr_add( mr, usage,
249 convert, normalize, match, indexer, filter, amr,
256 LDAP_LOG(( "operation", LDAP_LEVEL_ERR,
257 "register_matching_rule: %s for %s in %s.\n",
258 scherr2str(code), err, desc ));
260 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s for %s in %s\n",
261 scherr2str(code), err, desc );
271 #if defined( SLAPD_SCHEMA_DN )
273 int mr_schema_info( Entry *e )
275 struct berval vals[2];
278 AttributeDescription *ad_matchingRules = slap_schema.si_ad_matchingRules;
280 vals[1].bv_val = NULL;
282 for ( mr = mr_list; mr; mr = mr->smr_next ) {
283 if ( ! mr->smr_match ) {
284 /* skip rules without matching functions */
288 if ( ldap_matchingrule2bv( &mr->smr_mrule, vals ) == NULL ) {
292 Debug( LDAP_DEBUG_TRACE, "Merging mr [%ld] %s\n",
293 (long) vals[0].bv_len, vals[0].bv_val, 0 );
295 attr_merge( e, ad_matchingRules, vals );
296 ldap_memfree( vals[0].bv_val );