/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2003-2012 The OpenLDAP Foundation.
+ * Copyright 2003-2014 The OpenLDAP Foundation.
* Portions Copyright 2003 IBM Corporation.
* Portions Copyright 2003-2009 Symas Corporation.
* All rights reserved.
#include "config.h"
-#ifdef LDAP_DEVEL
/*
* Control that allows to access the private DB
* instead of the public one
* Monitoring
*/
#define PCACHE_MONITOR
-#endif
/* query cache structs */
/* query */
if ( si->swap_saved_attrs ) {
rs->sr_attrs = si->save_attrs;
+ rs->sr_attr_flags = slap_attr_flags( si->save_attrs );
op->ors_attrs = si->save_attrs;
}
/* map tag to operation */
type = slap_req2op( op->o_tag );
if ( type != SLAP_OP_LAST ) {
- BI_op_func **func;
+ BackendInfo *bi = cm->db.bd_info;
int rc;
/* execute, if possible */
- func = &cm->db.be_bind;
- if ( func[ type ] != NULL ) {
+ if ( (&bi->bi_op_bind)[ type ] ) {
Operation op2 = *op;
op2.o_bd = &cm->db;
- rc = func[ type ]( &op2, rs );
+ rc = (&bi->bi_op_bind)[ type ]( &op2, rs );
if ( type == SLAP_OP_BIND && rc == LDAP_SUCCESS ) {
op->o_conn->c_authz_cookie = cm->db.be_private;
}
int found = 1;
if ( count > qm->attr_sets[i].count ) {
+ if ( qm->attr_sets[i].count &&
+ bvmatch( &qm->attr_sets[i].attrs[0].an_name, slap_bv_all_user_attrs )) {
+ break;
+ }
continue;
}
2, 0, 0, ARG_MAGIC|PC_ATTR, pc_cf_gen,
"( OLcfgOvAt:2.2 NAME ( 'olcPcacheAttrset' 'olcProxyAttrset' ) "
"DESC 'A set of attributes to cache' "
+ "EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString )", NULL, NULL },
{ "pcacheTemplate", "filter> <attrset-index> <TTL> <negTTL> "
"<limitTTL> <TTR",
"DESC 'Filter template, attrset, cache TTL, "
"optional negative TTL, optional sizelimit TTL, "
"optional TTR' "
+ "EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString )", NULL, NULL },
{ "pcachePosition", "head|tail(default)",
2, 2, 0, ARG_MAGIC|PC_RESP, pc_cf_gen,
"( OLcfgOvAt:2.4 NAME 'olcPcachePosition' "
"DESC 'Response callback position in overlay stack' "
- "SYNTAX OMsDirectoryString )", NULL, NULL },
+ "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
{ "pcacheMaxQueries", "queries",
2, 2, 0, ARG_INT|ARG_MAGIC|PC_QUERIES, pc_cf_gen,
"( OLcfgOvAt:2.5 NAME ( 'olcPcacheMaxQueries' 'olcProxyCacheQueries' ) "
"DESC 'Maximum number of queries to cache' "
- "SYNTAX OMsInteger )", NULL, NULL },
+ "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
{ "pcachePersist", "TRUE|FALSE",
2, 2, 0, ARG_ON_OFF|ARG_OFFSET, (void *)offsetof(cache_manager, save_queries),
"( OLcfgOvAt:2.6 NAME ( 'olcPcachePersist' 'olcProxySaveQueries' ) "
"DESC 'Save cached queries for hot restart' "
- "SYNTAX OMsBoolean )", NULL, NULL },
+ "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
{ "pcacheValidate", "TRUE|FALSE",
2, 2, 0, ARG_ON_OFF|ARG_OFFSET, (void *)offsetof(cache_manager, check_cacheability),
"( OLcfgOvAt:2.7 NAME ( 'olcPcacheValidate' 'olcProxyCheckCacheability' ) "
"DESC 'Check whether the results of a query are cacheable, e.g. for schema issues' "
- "SYNTAX OMsBoolean )", NULL, NULL },
+ "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
{ "pcacheOffline", "TRUE|FALSE",
2, 2, 0, ARG_ON_OFF|ARG_MAGIC|PC_OFFLINE, pc_cf_gen,
"( OLcfgOvAt:2.8 NAME 'olcPcacheOffline' "
"DESC 'Set cache to offline mode and disable expiration' "
- "SYNTAX OMsBoolean )", NULL, NULL },
+ "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
{ "pcacheBind", "filter> <attrset-index> <TTR> <scope> <base",
6, 6, 0, ARG_MAGIC|PC_BIND, pc_cf_gen,
"( OLcfgOvAt:2.9 NAME 'olcPcacheBind' "
"DESC 'Parameters for caching Binds' "
+ "EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString )", NULL, NULL },
{ "pcache-", "private database args",
1, 0, STRLENOF("pcache-"), ARG_MAGIC|PC_PRIVATE_DB, pc_cf_gen,
qm = (query_manager*)ch_malloc(sizeof(query_manager));
cm->db = *be;
+ cm->db.bd_info = NULL;
SLAP_DBFLAGS(&cm->db) |= SLAP_DBFLAG_NO_SCHEMA_CHECK;
cm->db.be_private = NULL;
cm->db.bd_self = &cm->db;
cache_manager *cm = on->on_bi.bi_private;
query_manager *qm = cm->qm;
QueryTemplate *tm;
- int i, rc = 0;
+ int rc = 0;
/* stop the thread ... */
if ( cm->cc_arg ) {
}
ldap_pvt_runqueue_remove( &slapd_rq, cm->cc_arg );
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
+ cm->cc_arg = NULL;
}
if ( cm->save_queries ) {
cm->db.be_limits = NULL;
cm->db.be_acl = NULL;
-
if ( cm->db.bd_info->bi_db_close ) {
rc = cm->db.bd_info->bi_db_close( &cm->db, NULL );
}
+
+#ifdef PCACHE_MONITOR
+ if ( rc == LDAP_SUCCESS ) {
+ rc = pcache_monitor_db_close( be );
+ }
+#endif /* PCACHE_MONITOR */
+
+ return rc;
+}
+
+static int
+pcache_db_destroy(
+ BackendDB *be,
+ ConfigReply *cr
+)
+{
+ slap_overinst *on = (slap_overinst *)be->bd_info;
+ cache_manager *cm = on->on_bi.bi_private;
+ query_manager *qm = cm->qm;
+ QueryTemplate *tm;
+ int i;
+
+ if ( cm->db.be_private != NULL ) {
+ backend_stopdown_one( &cm->db );
+ }
+
while ( (tm = qm->templates) != NULL ) {
CachedQuery *qc, *qn;
qm->templates = tm->qmnext;
free( qm->attr_sets );
qm->attr_sets = NULL;
-#ifdef PCACHE_MONITOR
- if ( rc == LDAP_SUCCESS ) {
- rc = pcache_monitor_db_close( be );
- }
-#endif /* PCACHE_MONITOR */
-
- return rc;
-}
-
-static int
-pcache_db_destroy(
- BackendDB *be,
- ConfigReply *cr
-)
-{
- slap_overinst *on = (slap_overinst *)be->bd_info;
- cache_manager *cm = on->on_bi.bi_private;
- query_manager *qm = cm->qm;
-
- if ( cm->db.be_private != NULL ) {
- backend_stopdown_one( &cm->db );
- }
-
ldap_pvt_thread_mutex_destroy( &qm->lru_mutex );
ldap_pvt_thread_mutex_destroy( &cm->cache_mutex );
free( qm );