X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Foverlays%2Fpcache.c;h=6971694282bcf848b42882deb94b1a581245157c;hb=c6b5abbfd20567116846ebc38f0005c429284c98;hp=d27dcb7a0a7e176279f2e84aef65f980d8aec045;hpb=6018fe9671dcbb90e3845bc14851858c5d9fdf2a;p=openldap diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index d27dcb7a0a..6971694282 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2003-2011 The OpenLDAP Foundation. + * Copyright 2003-2012 The OpenLDAP Foundation. * Portions Copyright 2003 IBM Corporation. * Portions Copyright 2003-2009 Symas Corporation. * All rights reserved. @@ -2343,62 +2343,6 @@ pcache_op_cleanup( Operation *op, SlapReply *rs ) { cache_manager *cm = on->on_bi.bi_private; query_manager* qm = cm->qm; - if ( rs->sr_type == REP_SEARCH ) { - Entry *e; - - /* don't return more entries than requested by the client */ - if ( si->slimit > 0 && rs->sr_nentries >= si->slimit ) { - si->slimit_exceeded = 1; - } - - /* If we haven't exceeded the limit for this query, - * build a chain of answers to store. If we hit the - * limit, empty the chain and ignore the rest. - */ - if ( !si->over ) { - /* check if the entry contains undefined - * attributes/objectClasses (ITS#5680) */ - if ( cm->check_cacheability && test_filter( op, rs->sr_entry, si->query.filter ) != LDAP_COMPARE_TRUE ) { - Debug( pcache_debug, "%s: query not cacheable because of schema issues in DN \"%s\"\n", - op->o_log_prefix, rs->sr_entry->e_name.bv_val, 0 ); - goto over; - } - - /* check for malformed entries: attrs with no values */ - { - Attribute *a = rs->sr_entry->e_attrs; - for (; a; a=a->a_next) { - if ( !a->a_numvals ) { - Debug( pcache_debug, "%s: query not cacheable because of attrs without values in DN \"%s\" (%s)\n", - op->o_log_prefix, rs->sr_entry->e_name.bv_val, - a->a_desc->ad_cname.bv_val ); - goto over; - } - } - } - - if ( si->count < si->max ) { - si->count++; - e = entry_dup( rs->sr_entry ); - if ( !si->head ) si->head = e; - if ( si->tail ) si->tail->e_private = e; - si->tail = e; - - } else { -over:; - si->over = 1; - si->count = 0; - for (;si->head; si->head=e) { - e = si->head->e_private; - si->head->e_private = NULL; - entry_free(si->head); - } - si->tail = NULL; - } - } - - } - if ( rs->sr_type == REP_RESULT || op->o_abandon || rs->sr_err == SLAPD_ABANDON ) { @@ -2498,11 +2442,64 @@ pcache_response( } if ( rs->sr_type == REP_SEARCH ) { + Entry *e; + /* don't return more entries than requested by the client */ + if ( si->slimit > 0 && rs->sr_nentries >= si->slimit ) { + si->slimit_exceeded = 1; + } + + /* If we haven't exceeded the limit for this query, + * build a chain of answers to store. If we hit the + * limit, empty the chain and ignore the rest. + */ + if ( !si->over ) { + slap_overinst *on = si->on; + cache_manager *cm = on->on_bi.bi_private; + + /* check if the entry contains undefined + * attributes/objectClasses (ITS#5680) */ + if ( cm->check_cacheability && test_filter( op, rs->sr_entry, si->query.filter ) != LDAP_COMPARE_TRUE ) { + Debug( pcache_debug, "%s: query not cacheable because of schema issues in DN \"%s\"\n", + op->o_log_prefix, rs->sr_entry->e_name.bv_val, 0 ); + goto over; + } + + /* check for malformed entries: attrs with no values */ + { + Attribute *a = rs->sr_entry->e_attrs; + for (; a; a=a->a_next) { + if ( !a->a_numvals ) { + Debug( pcache_debug, "%s: query not cacheable because of attrs without values in DN \"%s\" (%s)\n", + op->o_log_prefix, rs->sr_entry->e_name.bv_val, + a->a_desc->ad_cname.bv_val ); + goto over; + } + } + } + + if ( si->count < si->max ) { + si->count++; + e = entry_dup( rs->sr_entry ); + if ( !si->head ) si->head = e; + if ( si->tail ) si->tail->e_private = e; + si->tail = e; + + } else { +over:; + si->over = 1; + si->count = 0; + for (;si->head; si->head=e) { + e = si->head->e_private; + si->head->e_private = NULL; + entry_free(si->head); + } + si->tail = NULL; + } + } if ( si->slimit_exceeded ) { return 0; } - } else if ( rs->sr_type == REP_RESULT ) { if ( si->count ) { @@ -3421,6 +3418,7 @@ refresh_query( Operation *op, CachedQuery *query, slap_overinst *on ) op->o_req_dn = query->qbase->base; op->o_req_ndn = query->qbase->base; op->ors_scope = query->scope; + op->ors_deref = LDAP_DEREF_NEVER; op->ors_slimit = SLAP_NO_LIMIT; op->ors_tlimit = SLAP_NO_LIMIT; op->ors_limit = NULL; @@ -5522,7 +5520,6 @@ pcache_monitor_db_open( BackendDB *be ) int rc = 0; BackendInfo *mi; monitor_extra_t *mbe; - struct berval dummy = BER_BVC( "" ); if ( !SLAP_DBMONITORING( be ) ) { return 0; @@ -5582,7 +5579,7 @@ pcache_monitor_db_open( BackendDB *be ) rc = mbe->register_overlay( be, on, &cm->monitor_ndn ); if ( rc == 0 ) { rc = mbe->register_entry_attrs( &cm->monitor_ndn, a, cb, - &dummy, -1, &dummy); + NULL, -1, NULL); } cleanup:;