1 /* compare.c - mdb backend compare routine */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 * Copyright 2000-2011 The OpenLDAP Foundation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
12 * A copy of this license is available in the file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
20 #include <ac/string.h>
25 mdb_compare( Operation *op, SlapReply *rs )
27 struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
29 int manageDSAit = get_manageDSAit( op );
33 rs->sr_err = mdb_reader_get(op, mdb->mi_dbenv, &rtxn);
38 send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
43 rs->sr_err = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &e, 1 );
44 switch( rs->sr_err ) {
49 rs->sr_text = "ldap server busy";
52 rs->sr_err = LDAP_OTHER;
53 rs->sr_text = "internal error";
57 if ( rs->sr_err == MDB_NOTFOUND ) {
59 /* return referral only if "disclose" is granted on the object */
60 if ( ! access_allowed( op, e, slap_schema.si_ad_entry,
61 NULL, ACL_DISCLOSE, NULL ) )
63 rs->sr_err = LDAP_NO_SUCH_OBJECT;
66 rs->sr_matched = ch_strdup( e->e_dn );
67 rs->sr_ref = is_entry_referral( e )
68 ? get_entry_referrals( op, e )
70 rs->sr_err = LDAP_REFERRAL;
73 mdb_entry_return( e );
77 rs->sr_ref = referral_rewrite( default_referral,
78 NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
79 rs->sr_err = rs->sr_ref ? LDAP_REFERRAL : LDAP_NO_SUCH_OBJECT;
82 rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED;
83 send_ldap_result( op, rs );
87 if (!manageDSAit && is_entry_referral( e ) ) {
88 /* return referral only if "disclose" is granted on the object */
89 if ( !access_allowed( op, e, slap_schema.si_ad_entry,
90 NULL, ACL_DISCLOSE, NULL ) )
92 rs->sr_err = LDAP_NO_SUCH_OBJECT;
94 /* entry is a referral, don't allow compare */
95 rs->sr_ref = get_entry_referrals( op, e );
96 rs->sr_err = LDAP_REFERRAL;
97 rs->sr_matched = e->e_name.bv_val;
100 Debug( LDAP_DEBUG_TRACE, "entry is referral\n", 0, 0, 0 );
102 send_ldap_result( op, rs );
104 ber_bvarray_free( rs->sr_ref );
106 rs->sr_matched = NULL;
110 rs->sr_err = slap_compare_entry( op, e, op->orc_ava );
113 send_ldap_result( op, rs );
115 switch ( rs->sr_err ) {
116 case LDAP_COMPARE_FALSE:
117 case LDAP_COMPARE_TRUE:
118 rs->sr_err = LDAP_SUCCESS;
125 mdb_entry_return( e );