]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/compare.c
Entry caching. Based on ITS#1545 from Jong Hyuk Choi, jongchoi@us.ibm.com
[openldap] / servers / slapd / back-bdb / compare.c
index 71b072ae3b68e0e7d48c79a6759e51608f037aad..d8abfd40f75f71b65a65400df76f3d6fcc8a371f 100644 (file)
@@ -1,7 +1,7 @@
 /* compare.c - bdb backend compare routine */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -32,7 +32,7 @@ bdb_compare(
        int             manageDSAit = get_manageDSAit( op );
 
        /* get entry */
-       rc = bdb_dn2entry( be, NULL, ndn->bv_val, &e, &matched, 0 );
+       rc = bdb_dn2entry_r( be, NULL, ndn, &e, &matched, 0 );
 
        switch( rc ) {
        case DB_NOTFOUND:
@@ -46,26 +46,25 @@ bdb_compare(
 
        if ( e == NULL ) {
                char *matched_dn = NULL;
-               struct berval **refs;
+               BerVarray refs;
 
                if ( matched != NULL ) {
                        matched_dn = ch_strdup( matched->e_dn );
                        refs = is_entry_referral( matched )
-                               ? get_entry_referrals( be, conn, op, matched,
-                                       dn->bv_val, LDAP_SCOPE_DEFAULT )
+                               ? get_entry_referrals( be, conn, op, matched )
                                : NULL;
-                       bdb_entry_return( be, matched );
+                       bdb_cache_return_entry_r( &bdb->bi_cache, matched );
                        matched = NULL;
 
                } else {
                        refs = referral_rewrite( default_referral,
-                               NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
+                               NULL, dn, LDAP_SCOPE_DEFAULT );
                }
 
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        matched_dn, NULL, refs, NULL );
 
-               ber_bvecfree( refs );
+               ber_bvarray_free( refs );
                free( matched_dn );
 
                goto done;
@@ -73,8 +72,8 @@ 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, dn->bv_val, LDAP_SCOPE_DEFAULT );
+               BerVarray refs = get_entry_referrals( be,
+                       conn, op, e );
 
                Debug( LDAP_DEBUG_TRACE, "entry is referral\n", 0,
                        0, 0 );
@@ -82,12 +81,12 @@ bdb_compare(
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
                        e->e_dn, NULL, refs, NULL );
 
-               ber_bvecfree( refs );
+               ber_bvarray_free( refs );
                goto done;
        }
 
        if ( ! access_allowed( be, conn, op, e,
-               ava->aa_desc, ava->aa_value, ACL_COMPARE ) )
+               ava->aa_desc, &ava->aa_value, ACL_COMPARE ) )
        {
                rc = LDAP_INSUFFICIENT_ACCESS;
                goto return_results;
@@ -101,7 +100,7 @@ bdb_compare(
        {
                rc = LDAP_COMPARE_FALSE;
 
-               if ( value_find( ava->aa_desc, a->a_vals, ava->aa_value ) == 0 ) {
+               if ( value_find( ava->aa_desc, a->a_vals, &ava->aa_value ) == 0 ) {
                        rc = LDAP_COMPARE_TRUE;
                        break;
                }
@@ -120,7 +119,7 @@ return_results:
 done:
        /* free entry */
        if( e != NULL ) {
-               bdb_entry_return( be, e );
+               bdb_cache_return_entry_r( &bdb->bi_cache, e );
        }
 
        return rc;