From: Julio Sánchez Fernández Date: Tue, 23 Oct 2001 09:43:20 +0000 (+0000) Subject: Replacement for value_find and compatibility macro. X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~941 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=cb98a604fb463a14c4ca9ad50bdd842db10e9da4;p=openldap Replacement for value_find and compatibility macro. Now we will be able to fix compares. --- diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 05acf2ded5..88cc5e64a8 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -756,10 +756,12 @@ LDAP_SLAPD_F (int) value_match LDAP_P(( struct berval *v1, void *v2, const char ** text )); -LDAP_SLAPD_F (int) value_find LDAP_P(( +LDAP_SLAPD_F (int) value_find_ex LDAP_P(( AttributeDescription *ad, + unsigned flags, struct berval **values, struct berval *value )); +#define value_find(ad, values, value) ( value_find_ex(ad,0,values,value ) ) LDAP_SLAPD_F (int) value_add LDAP_P(( struct berval ***vals, struct berval **addvals )); /* diff --git a/servers/slapd/value.c b/servers/slapd/value.c index 4a34fc0983..3d4e05acd6 100644 --- a/servers/slapd/value.c +++ b/servers/slapd/value.c @@ -168,25 +168,39 @@ value_match( } -int value_find( +int value_find_ex( AttributeDescription *ad, + unsigned flags, struct berval **vals, struct berval *val ) { int i; int rc; struct berval *nval = NULL; + struct berval *nval_tmp = NULL; MatchingRule *mr = ad->ad_type->sat_equality; if( mr == NULL || !mr->smr_match ) { return LDAP_INAPPROPRIATE_MATCHING; } + /* Take care of this here or ssyn_normalize later will hurt */ + if ( !(flags & SLAP_MR_VALUE_IS_IN_MR_SYNTAX) && + mr->smr_convert ) { + rc = (mr->smr_convert)(val,&nval); + if ( rc != LDAP_SUCCESS ) { + return LDAP_INVALID_SYNTAX; + } + } + if( mr->smr_syntax->ssyn_normalize ) { rc = mr->smr_syntax->ssyn_normalize( - mr->smr_syntax, val, &nval ); + mr->smr_syntax, nval == NULL ? val : nval, &nval_tmp ); + ber_bvfree(nval); + nval = nval_tmp; if( rc != LDAP_SUCCESS ) { + ber_bvfree(nval); return LDAP_INAPPROPRIATE_MATCHING; } } @@ -195,7 +209,9 @@ int value_find( int match; const char *text; - rc = value_match( &match, ad, mr, 0, + /* We did convert, so keep value_match from trying */ + rc = value_match( &match, ad, mr, + flags & !SLAP_MR_VALUE_IS_IN_MR_SYNTAX, vals[i], nval == NULL ? val : nval, &text ); if( rc == LDAP_SUCCESS && match == 0 ) {