]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/compare.c
Added bdb_attribute and bdb_group ACL support routines
[openldap] / servers / slapd / back-bdb / compare.c
index ece33d08b91f0fafc82701b57a306e61f52780c5..42164ac577c8525334fc7e044280e9b2043715e7 100644 (file)
 #include <ac/string.h>
 
 #include "back-bdb.h"
+#include "external.h"
 
 int
 bdb_compare(
-    Backend    *be,
-    Connection *conn,
-    Operation  *op,
-    const char *dn,
-    const char *ndn,
+       BackendDB       *be,
+       Connection      *conn,
+       Operation       *op,
+       const char      *dn,
+       const char      *ndn,
        AttributeAssertion *ava
 )
 {
@@ -31,10 +32,11 @@ bdb_compare(
        int             manageDSAit = get_manageDSAit( op );
 
        /* get entry */
-       rc = dn2entry_r( be, NULL, ndn, &e, &matched );
+       rc = bdb_dn2entry( be, NULL, ndn, &e, &matched, 0 );
 
        switch( rc ) {
        case DB_NOTFOUND:
+       case 0:
                break;
        default:
                rc = LDAP_OTHER;
@@ -44,25 +46,27 @@ bdb_compare(
 
        if ( e == NULL ) {
                char *matched_dn = NULL;
-               struct berval **refs = NULL;
+               struct berval **refs;
 
                if ( matched != NULL ) {
                        matched_dn = ch_strdup( matched->e_dn );
                        refs = is_entry_referral( matched )
-                               ? get_entry_referrals( be, conn, op, matched )
+                               ? get_entry_referrals( be, conn, op, matched,
+                                       dn, LDAP_SCOPE_DEFAULT )
                                : NULL;
                        bdb_entry_return( be, matched );
+                       matched = NULL;
+
                } else {
-                       refs = default_referral;
+                       refs = referral_rewrite( default_referral,
+                               NULL, dn, LDAP_SCOPE_DEFAULT );
                }
 
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        matched_dn, NULL, refs, NULL );
 
-               if( matched != NULL ) {
-                       ber_bvecfree( refs );
-                       free( matched_dn );
-               }
+               ber_bvecfree( refs );
+               free( matched_dn );
 
                goto done;
        }
@@ -70,13 +74,13 @@ bdb_compare(
        if (!manageDSAit && is_entry_referral( e ) ) {
                /* entry is a referral, don't allow add */
                struct berval **refs = get_entry_referrals( be,
-                       conn, op, e );
+                       conn, op, e, dn, LDAP_SCOPE_DEFAULT );
 
                Debug( LDAP_DEBUG_TRACE, "entry is referral\n", 0,
-                   0, 0 );
+                       0, 0 );
 
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
-                   e->e_dn, NULL, refs, NULL );
+                       e->e_dn, NULL, refs, NULL );
 
                ber_bvecfree( refs );
                goto done;
@@ -97,7 +101,9 @@ bdb_compare(
        {
                rc = LDAP_COMPARE_FALSE;
 
-               if ( value_find( ava->aa_desc, a->a_vals, ava->aa_value ) == 0 )
+               if ( value_find_ex( ava->aa_desc,
+                                   SLAP_MR_VALUE_IS_IN_MR_SYNTAX,
+                                   a->a_vals, ava->aa_value ) == 0 )
                {
                        rc = LDAP_COMPARE_TRUE;
                        break;
@@ -116,7 +122,9 @@ return_results:
 
 done:
        /* free entry */
-       if( e != NULL ) bdb_entry_return( be, e );
+       if( e != NULL ) {
+               bdb_entry_return( be, e );
+       }
 
        return rc;
-}
\ No newline at end of file
+}