1 /* mr.c - routines to manage matching rule definitions */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/string.h>
14 #include <ac/socket.h>
25 static Avlnode *mr_index = NULL;
26 static MatchingRule *mr_list = NULL;
30 struct mindexrec *mir1,
31 struct mindexrec *mir2
34 return (strcmp( mir1->mir_name, mir2->mir_name ));
43 return (strcmp( name, mir->mir_name ));
47 mr_find( const char *mrname )
49 struct mindexrec *mir = NULL;
51 if ( (mir = (struct mindexrec *) avl_find( mr_index, mrname,
52 (AVL_CMP) mr_index_name_cmp )) != NULL ) {
53 return( mir->mir_mr );
65 struct mindexrec *mir;
69 while ( *mrp != NULL ) {
70 mrp = &(*mrp)->smr_next;
75 mir = (struct mindexrec *)
76 ch_calloc( 1, sizeof(struct mindexrec) );
77 mir->mir_name = smr->smr_oid;
79 if ( avl_insert( &mr_index, (caddr_t) mir,
80 (AVL_CMP) mr_index_cmp,
81 (AVL_DUP) avl_dup_error ) ) {
84 return SLAP_SCHERR_DUP_RULE;
86 /* FIX: temporal consistency check */
87 mr_find(mir->mir_name);
89 if ( (names = smr->smr_names) ) {
91 mir = (struct mindexrec *)
92 ch_calloc( 1, sizeof(struct mindexrec) );
93 mir->mir_name = ch_strdup(*names);
95 if ( avl_insert( &mr_index, (caddr_t) mir,
96 (AVL_CMP) mr_index_cmp,
97 (AVL_DUP) avl_dup_error ) ) {
100 return SLAP_SCHERR_DUP_RULE;
102 /* FIX: temporal consistency check */
103 mr_find(mir->mir_name);
112 LDAP_MATCHING_RULE *mr,
114 slap_mr_convert_func *convert,
115 slap_mr_normalize_func *normalize,
116 slap_mr_match_func *match,
117 slap_mr_indexer_func *indexer,
118 slap_mr_filter_func *filter,
126 smr = (MatchingRule *) ch_calloc( 1, sizeof(MatchingRule) );
127 memcpy( &smr->smr_mrule, mr, sizeof(LDAP_MATCHING_RULE));
129 smr->smr_usage = usage;
130 smr->smr_convert = convert;
131 smr->smr_normalize = normalize;
132 smr->smr_match = match;
133 smr->smr_indexer = indexer;
134 smr->smr_filter = filter;
136 if ( smr->smr_syntax_oid ) {
137 if ( (syn = syn_find(smr->smr_syntax_oid)) ) {
138 smr->smr_syntax = syn;
140 *err = smr->smr_syntax_oid;
141 return SLAP_SCHERR_SYN_NOT_FOUND;
145 return SLAP_SCHERR_MR_INCOMPLETE;
147 code = mr_insert(smr,err);
153 register_matching_rule(
156 slap_mr_convert_func *convert,
157 slap_mr_normalize_func *normalize,
158 slap_mr_match_func *match,
159 slap_mr_indexer_func *indexer,
160 slap_mr_filter_func *filter )
162 LDAP_MATCHING_RULE *mr;
166 if( usage == SLAP_MR_NONE ) {
167 Debug( LDAP_DEBUG_ANY, "register_matching_rule: not usable %s\n",
172 mr = ldap_str2matchingrule( desc, &code, &err);
174 Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n",
175 ldap_scherr2str(code), err, desc );
179 code = mr_add( mr, usage, convert, normalize, match, indexer, filter, &err );
181 Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s for %s in %s\n",
182 scherr2str(code), err, desc );
189 #if defined( SLAPD_SCHEMA_DN )
191 int mr_schema_info( Entry *e )
194 struct berval *vals[2];
200 for ( mr = mr_list; mr; mr = mr->smr_next ) {
201 val.bv_val = ldap_matchingrule2str( &mr->smr_mrule );
203 val.bv_len = strlen( val.bv_val );
204 Debug( LDAP_DEBUG_TRACE, "Merging mr [%ld] %s\n",
205 (long) val.bv_len, val.bv_val, 0 );
206 attr_merge( e, "matchingRules", vals );
207 ldap_memfree( val.bv_val );