util_ldap_cache_mgr.c revision 8c5e6c7678471111589bc199bee1839f8176e8f1
842ae4bd224140319ae7feec1872b93dfd491143fielding/* Copyright 2001-2004 The Apache Software Foundation
842ae4bd224140319ae7feec1872b93dfd491143fielding *
842ae4bd224140319ae7feec1872b93dfd491143fielding * Licensed under the Apache License, Version 2.0 (the "License");
842ae4bd224140319ae7feec1872b93dfd491143fielding * you may not use this file except in compliance with the License.
842ae4bd224140319ae7feec1872b93dfd491143fielding * You may obtain a copy of the License at
842ae4bd224140319ae7feec1872b93dfd491143fielding *
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * http://www.apache.org/licenses/LICENSE-2.0
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes *
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * Unless required by applicable law or agreed to in writing, software
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * distributed under the License is distributed on an "AS IS" BASIS,
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * See the License for the specific language governing permissions and
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * limitations under the License.
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes/*
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * util_ldap_cache_mgr.c: LDAP cache manager things
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes *
e8f95a682820a599fe41b22977010636be5c2717jim * Original code from auth_ldap module for Apache v1.3:
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * Copyright 1998, 1999 Enbridge Pipelines Inc.
e8f95a682820a599fe41b22977010636be5c2717jim * Copyright 1999-2001 Dave Carrigan
1747d30b98aa1bdbc43994c02cd46ab4cb9319e4fielding */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#include <apr_ldap.h>
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#include "util_ldap.h"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#include "util_ldap_cache.h"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#include <apr_strings.h>
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#if APR_HAS_LDAP
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
11f2c481e1d57bedb3f758565307501e9a2730ddtrawick/* only here until strdup is gone */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#include <string.h>
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes/* here till malloc is gone */
5c0419d51818eb02045cf923a9fe456127a44c60wrowe#include <stdlib.h>
5c0419d51818eb02045cf923a9fe456127a44c60wrowe
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesstatic const unsigned long primes[] =
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes{
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes 11,
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes 19,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 37,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 73,
cd3bbd6d2df78d6c75e5d159a81ef8bdd5f70df9trawick 109,
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes 163,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 251,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 367,
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim 557,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 823,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 1237,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 1861,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 2777,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf 4177,
bede2929837dfd23863ad4b39199c63126566d61jorton 6247,
0f60998368b493f90120180a93fc2e1e74490872covener 9371,
0f60998368b493f90120180a93fc2e1e74490872covener 14057,
0f60998368b493f90120180a93fc2e1e74490872covener 21089,
0f60998368b493f90120180a93fc2e1e74490872covener 31627,
0f60998368b493f90120180a93fc2e1e74490872covener 47431,
0f60998368b493f90120180a93fc2e1e74490872covener 71143,
0f60998368b493f90120180a93fc2e1e74490872covener 106721,
0f60998368b493f90120180a93fc2e1e74490872covener 160073,
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim 240101,
60284a9f9158baa60cc8ab4a69066404b1dcae7acovener 360163,
87587593f1a53030e840acc0dec6cc881022ea40covener 540217,
87587593f1a53030e840acc0dec6cc881022ea40covener 810343,
87587593f1a53030e840acc0dec6cc881022ea40covener 1215497,
a81c0c1ae464b2063a21b45f80c9da8d89bb840ecovener 1823231,
a81c0c1ae464b2063a21b45f80c9da8d89bb840ecovener 2734867,
a81c0c1ae464b2063a21b45f80c9da8d89bb840ecovener 4102283,
97cd2f98ad4abe68aaaba96b5bfc9ebf7109a2c1covener 6153409,
97cd2f98ad4abe68aaaba96b5bfc9ebf7109a2c1covener 9230113,
97cd2f98ad4abe68aaaba96b5bfc9ebf7109a2c1covener 13845163,
97cd2f98ad4abe68aaaba96b5bfc9ebf7109a2c1covener 0
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes};
43997561b2302d13dee973998e77743a3ddd2374trawick
fa123db15501821e36e513afa78e839775ad2800covenervoid util_ald_free(util_ald_cache_t *cache, const void *ptr)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes{
0568280364eb026393be492ebc732795c4934643jorton#if APR_HAS_SHARED_MEMORY
0568280364eb026393be492ebc732795c4934643jorton if (cache->rmm_addr) {
0568280364eb026393be492ebc732795c4934643jorton if (ptr)
0568280364eb026393be492ebc732795c4934643jorton /* Free in shared memory */
0568280364eb026393be492ebc732795c4934643jorton apr_rmm_free(cache->rmm_addr, apr_rmm_offset_get(cache->rmm_addr, (void *)ptr));
0568280364eb026393be492ebc732795c4934643jorton }
0568280364eb026393be492ebc732795c4934643jorton else {
0568280364eb026393be492ebc732795c4934643jorton if (ptr)
0568280364eb026393be492ebc732795c4934643jorton /* Cache shm is not used */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes free((void *)ptr);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes }
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#else
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if (ptr)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes free((void *)ptr);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#endif
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes}
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesvoid *util_ald_alloc(util_ald_cache_t *cache, unsigned long size)
796e4a7141265d8ed7036e4628161c6eafb2a789jorton{
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if (0 == size)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return NULL;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#if APR_HAS_SHARED_MEMORY
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if (cache->rmm_addr) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes /* allocate from shared memory */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes apr_rmm_off_t block = apr_rmm_calloc(cache->rmm_addr, size);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return block ? (void *)apr_rmm_addr_get(cache->rmm_addr, block) : NULL;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes }
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes else {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes /* Cache shm is not used */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return (void *)calloc(sizeof(char), size);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes }
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#else
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return (void *)calloc(sizeof(char), size);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#endif
8113dac419143273351446c3ad653f3fe5ba5cfdwrowe}
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
95b6fe1346805e1731e6e97c15d569c73be22cf7minfrinconst char *util_ald_strdup(util_ald_cache_t *cache, const char *s)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes{
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#if APR_HAS_SHARED_MEMORY
95b6fe1346805e1731e6e97c15d569c73be22cf7minfrin if (cache->rmm_addr) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes /* allocate from shared memory */
95b6fe1346805e1731e6e97c15d569c73be22cf7minfrin apr_rmm_off_t block = apr_rmm_calloc(cache->rmm_addr, strlen(s)+1);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes char *buf = block ? (char *)apr_rmm_addr_get(cache->rmm_addr, block) : NULL;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if (buf) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes strcpy(buf, s);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return buf;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes }
95b6fe1346805e1731e6e97c15d569c73be22cf7minfrin else {
95b6fe1346805e1731e6e97c15d569c73be22cf7minfrin return NULL;
95b6fe1346805e1731e6e97c15d569c73be22cf7minfrin }
a1790fb35c4b352dab721370985c623a9f8f5062rpluem } else {
713a2b68bac4aeb1e9c48785006c0732451039depquerna /* Cache shm is not used */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return strdup(s);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes }
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#else
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return strdup(s);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes#endif
482f676c6c19b1c5bb5cca04dad11509c1da3a4cwrowe}
482f676c6c19b1c5bb5cca04dad11509c1da3a4cwrowe
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes/*
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * Computes the hash on a set of strings. The first argument is the number
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * of strings to hash, the rest of the args are strings.
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * Algorithm taken from glibc.
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes */
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesunsigned long util_ald_hash_string(int nstr, ...)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes{
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener int i;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes va_list args;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes unsigned long h=0, g;
f43b67c5a9d29b572eac916f8335cedc80c908bebnicholes char *str, *p;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes va_start(args, nstr);
8113dac419143273351446c3ad653f3fe5ba5cfdwrowe for (i=0; i < nstr; ++i) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes str = va_arg(args, char *);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes for (p = str; *p; ++p) {
fa123db15501821e36e513afa78e839775ad2800covener h = ( h << 4 ) + *p;
fa123db15501821e36e513afa78e839775ad2800covener if ( ( g = h & 0xf0000000 ) ) {
fa123db15501821e36e513afa78e839775ad2800covener h = h ^ (g >> 24);
fa123db15501821e36e513afa78e839775ad2800covener h = h ^ g;
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim }
fa123db15501821e36e513afa78e839775ad2800covener }
307219eca940aa30b873bfd68a44484dd3d3fa88covener }
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener va_end(args);
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener return h;
a81c0c1ae464b2063a21b45f80c9da8d89bb840ecovener}
307219eca940aa30b873bfd68a44484dd3d3fa88covener
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener/*
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes Purges a cache that has gotten full. We keep track of the time that we
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener added the entry that made the cache 3/4 full, then delete all entries
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes that were added before that time. It's pretty simplistic, but time to
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes purge is only O(n), which is more important.
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes*/
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesvoid util_ald_cache_purge(util_ald_cache_t *cache)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes{
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes unsigned long i;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_cache_node_t *p, *q;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes apr_time_t t;
8113dac419143273351446c3ad653f3fe5ba5cfdwrowe
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if (!cache)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes return;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes cache->last_purge = apr_time_now();
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes cache->npurged = 0;
307219eca940aa30b873bfd68a44484dd3d3fa88covener cache->numpurges++;
307219eca940aa30b873bfd68a44484dd3d3fa88covener
307219eca940aa30b873bfd68a44484dd3d3fa88covener for (i=0; i < cache->size; ++i) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes p = cache->nodes[i];
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes while (p != NULL) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes if (p->add_time < cache->marktime) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes q = p->next;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes (*cache->free)(cache, p->payload);
fa123db15501821e36e513afa78e839775ad2800covener util_ald_free(cache, p);
cceddc0b6c0fdaed0c73abda39975bb1d388243acovener cache->numentries--;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf cache->npurged++;
fa123db15501821e36e513afa78e839775ad2800covener p = q;
cceddc0b6c0fdaed0c73abda39975bb1d388243acovener }
f2be127030aa4190033084f0a6add531c9bc41desf else {
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener p = p->next;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener }
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener }
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener }
60215f303c7e1ce8b6d272acb5bfa5b3d99dfd34covener
60215f303c7e1ce8b6d272acb5bfa5b3d99dfd34covener t = apr_time_now();
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener cache->avg_purgetime =
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener ((t - cache->last_purge) + (cache->avg_purgetime * (cache->numpurges-1))) /
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener cache->numpurges;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener}
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener/*
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim * create caches
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener */
6683642c1e0032eeeed5f99e8c14880692ef84c5sfutil_url_node_t *util_ald_create_caches(util_ldap_state_t *st, const char *url)
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener{
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_url_node_t *curl = NULL;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ald_cache_t *search_cache;
6683642c1e0032eeeed5f99e8c14880692ef84c5sf util_ald_cache_t *compare_cache;
6683642c1e0032eeeed5f99e8c14880692ef84c5sf util_ald_cache_t *dn_compare_cache;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener /* create the three caches */
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener search_cache = util_ald_create_cache(st,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_search_node_hash,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_search_node_compare,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_search_node_copy,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_search_node_free,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_search_node_display);
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener compare_cache = util_ald_create_cache(st,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_compare_node_hash,
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim util_ldap_compare_node_compare,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_compare_node_copy,
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim util_ldap_compare_node_free,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_compare_node_display);
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener dn_compare_cache = util_ald_create_cache(st,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_dn_compare_node_hash,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_dn_compare_node_compare,
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ldap_dn_compare_node_copy,
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes util_ldap_dn_compare_node_free,
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes util_ldap_dn_compare_node_display);
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener /* check that all the caches initialised successfully */
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener if (search_cache && compare_cache && dn_compare_cache) {
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener/*XXX This can be allocated on the stack since it will be copied anyway */
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener curl = (util_url_node_t *)apr_pcalloc(st->pool, sizeof(util_url_node_t));
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener curl->url = url;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener curl->search_cache = search_cache;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener curl->compare_cache = compare_cache;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener curl->dn_compare_cache = dn_compare_cache;
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener util_ald_cache_insert(st->util_ldap_cache, curl);
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener
4e9c24785b525d2956e6e381015c0f2bd0a72f4bcovener }
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim return curl;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes}
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
60215f303c7e1ce8b6d272acb5bfa5b3d99dfd34covener
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesutil_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st,
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes unsigned long (*hashfunc)(void *),
0e05808dc59a321566303084c84b9826a4353cefrederpj int (*comparefunc)(void *, void *),
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes void * (*copyfunc)(util_ald_cache_t *cache, void *),
b08925593f214f621161742925dcf074a8047e0acovener void (*freefunc)(util_ald_cache_t *cache, void *),
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes void (*displayfunc)(request_rec *r, util_ald_cache_t *cache, void *))
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf{
465bb68501690d7a47bfd2a6129580047d76d8f1rederpj util_ald_cache_t *cache;
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim unsigned long i;
465bb68501690d7a47bfd2a6129580047d76d8f1rederpj
e8f95a682820a599fe41b22977010636be5c2717jim if (st->search_cache_size <= 0)
3dfeb02cfb853d8717ca0cc259b59fea610173f5bnicholes return NULL;
3dfeb02cfb853d8717ca0cc259b59fea610173f5bnicholes
55e2e59e5910072e51c870afc68b0907f41a28e0sf#if APR_HAS_SHARED_MEMORY
55e2e59e5910072e51c870afc68b0907f41a28e0sf if (!st->cache_rmm) {
55e2e59e5910072e51c870afc68b0907f41a28e0sf return NULL;
55e2e59e5910072e51c870afc68b0907f41a28e0sf }
55e2e59e5910072e51c870afc68b0907f41a28e0sf else {
55e2e59e5910072e51c870afc68b0907f41a28e0sf apr_rmm_off_t block = apr_rmm_calloc(st->cache_rmm, sizeof(util_ald_cache_t));
55e2e59e5910072e51c870afc68b0907f41a28e0sf cache = block ? (util_ald_cache_t *)apr_rmm_addr_get(st->cache_rmm, block) : NULL;
55e2e59e5910072e51c870afc68b0907f41a28e0sf }
55e2e59e5910072e51c870afc68b0907f41a28e0sf#else
55e2e59e5910072e51c870afc68b0907f41a28e0sf cache = (util_ald_cache_t *)calloc(sizeof(util_ald_cache_t), 1);
55e2e59e5910072e51c870afc68b0907f41a28e0sf#endif
55e2e59e5910072e51c870afc68b0907f41a28e0sf if (!cache)
55e2e59e5910072e51c870afc68b0907f41a28e0sf return NULL;
55e2e59e5910072e51c870afc68b0907f41a28e0sf
55e2e59e5910072e51c870afc68b0907f41a28e0sf cache->maxentries = st->search_cache_size;
55e2e59e5910072e51c870afc68b0907f41a28e0sf cache->numentries = 0;
55e2e59e5910072e51c870afc68b0907f41a28e0sf cache->size = st->search_cache_size / 3;
54d22ed1c429b903b029bbd62621f11a9e286137minfrin if (cache->size < 64) cache->size = 64;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes for (i = 0; primes[i] && primes[i] < cache->size; ++i) ;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes cache->size = primes[i]? primes[i] : primes[i-1];
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes cache->nodes = (util_cache_node_t **)util_ald_alloc(cache, cache->size * sizeof(util_cache_node_t *));
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes if (!cache->nodes) {
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes util_ald_free(cache, cache);
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf return NULL;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes }
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf
55e2e59e5910072e51c870afc68b0907f41a28e0sf for (i=0; i < cache->size; ++i)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes cache->nodes[i] = NULL;
513b324e774c559b579896df131fd7c8471ed529rederpj
513b324e774c559b579896df131fd7c8471ed529rederpj cache->hash = hashfunc;
513b324e774c559b579896df131fd7c8471ed529rederpj cache->compare = comparefunc;
513b324e774c559b579896df131fd7c8471ed529rederpj cache->copy = copyfunc;
513b324e774c559b579896df131fd7c8471ed529rederpj cache->free = freefunc;
513b324e774c559b579896df131fd7c8471ed529rederpj cache->display = displayfunc;
513b324e774c559b579896df131fd7c8471ed529rederpj
513b324e774c559b579896df131fd7c8471ed529rederpj cache->fullmark = cache->maxentries / 4 * 3;
513b324e774c559b579896df131fd7c8471ed529rederpj cache->marktime = 0;
513b324e774c559b579896df131fd7c8471ed529rederpj cache->avg_purgetime = 0.0;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes cache->numpurges = 0;
02fd88c85a9850109753b87612955ad372de1575sf cache->last_purge = 0;
02fd88c85a9850109753b87612955ad372de1575sf cache->npurged = 0;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes cache->fetches = 0;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes cache->hits = 0;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes cache->inserts = 0;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes cache->removes = 0;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes return cache;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes}
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholesvoid util_ald_destroy_cache(util_ald_cache_t *cache)
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes{
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes unsigned long i;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes util_cache_node_t *p, *q;
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
307219eca940aa30b873bfd68a44484dd3d3fa88covener if (cache == NULL)
307219eca940aa30b873bfd68a44484dd3d3fa88covener return;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener
707f6d077f73cc948deead8df5b40ea42c1eaa78covener for (i = 0; i < cache->size; ++i) {
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf p = cache->nodes[i];
707f6d077f73cc948deead8df5b40ea42c1eaa78covener q = NULL;
185aa71728867671e105178b4c66fbc22b65ae26sf while (p != NULL) {
707f6d077f73cc948deead8df5b40ea42c1eaa78covener q = p->next;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener (*cache->free)(cache, p->payload);
707f6d077f73cc948deead8df5b40ea42c1eaa78covener util_ald_free(cache, p);
707f6d077f73cc948deead8df5b40ea42c1eaa78covener p = q;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener }
9ad7b260be233be7d7b5576979825cac72e15498rederpj }
9ad7b260be233be7d7b5576979825cac72e15498rederpj util_ald_free(cache, cache->nodes);
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes util_ald_free(cache, cache);
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes}
54d22ed1c429b903b029bbd62621f11a9e286137minfrin
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholesvoid *util_ald_cache_fetch(util_ald_cache_t *cache, void *payload)
55e2e59e5910072e51c870afc68b0907f41a28e0sf{
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf int hashval;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes util_cache_node_t *p;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes if (cache == NULL)
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes return NULL;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
54d22ed1c429b903b029bbd62621f11a9e286137minfrin cache->fetches++;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
54d22ed1c429b903b029bbd62621f11a9e286137minfrin hashval = (*cache->hash)(payload) % cache->size;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes for (p = cache->nodes[hashval];
55e2e59e5910072e51c870afc68b0907f41a28e0sf p && !(*cache->compare)(p->payload, payload);
55e2e59e5910072e51c870afc68b0907f41a28e0sf p = p->next) ;
55e2e59e5910072e51c870afc68b0907f41a28e0sf
55e2e59e5910072e51c870afc68b0907f41a28e0sf if (p != NULL) {
55e2e59e5910072e51c870afc68b0907f41a28e0sf cache->hits++;
55e2e59e5910072e51c870afc68b0907f41a28e0sf return p->payload;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf }
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf else {
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes return NULL;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes }
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes}
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes/*
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes * Insert an item into the cache.
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes * *** Does not catch duplicates!!! ***
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes */
b08925593f214f621161742925dcf074a8047e0acovenervoid util_ald_cache_insert(util_ald_cache_t *cache, void *payload)
b08925593f214f621161742925dcf074a8047e0acovener{
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes int hashval;
60284a9f9158baa60cc8ab4a69066404b1dcae7acovener util_cache_node_t *node;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener
5f3e4e06f8e23597d2f95e2c2cff1116c522488fcovener /* sanity check */
707f6d077f73cc948deead8df5b40ea42c1eaa78covener if (cache == NULL || payload == NULL) {
707f6d077f73cc948deead8df5b40ea42c1eaa78covener return;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf }
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf
707f6d077f73cc948deead8df5b40ea42c1eaa78covener /* check if we are full - if so, try purge */
707f6d077f73cc948deead8df5b40ea42c1eaa78covener if (cache->numentries >= cache->maxentries) {
707f6d077f73cc948deead8df5b40ea42c1eaa78covener util_ald_cache_purge(cache);
9ad7b260be233be7d7b5576979825cac72e15498rederpj if (cache->numentries >= cache->maxentries) {
185aa71728867671e105178b4c66fbc22b65ae26sf /* if the purge was not effective, we leave now to avoid an overflow */
707f6d077f73cc948deead8df5b40ea42c1eaa78covener return;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener }
707f6d077f73cc948deead8df5b40ea42c1eaa78covener }
707f6d077f73cc948deead8df5b40ea42c1eaa78covener
707f6d077f73cc948deead8df5b40ea42c1eaa78covener /* should be safe to add an entry */
707f6d077f73cc948deead8df5b40ea42c1eaa78covener if ((node = (util_cache_node_t *)util_ald_alloc(cache, sizeof(util_cache_node_t))) == NULL) {
707f6d077f73cc948deead8df5b40ea42c1eaa78covener return;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener }
60284a9f9158baa60cc8ab4a69066404b1dcae7acovener
707f6d077f73cc948deead8df5b40ea42c1eaa78covener /* populate the entry */
60284a9f9158baa60cc8ab4a69066404b1dcae7acovener cache->inserts++;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener hashval = (*cache->hash)(payload) % cache->size;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener node->add_time = apr_time_now();
185aa71728867671e105178b4c66fbc22b65ae26sf node->payload = (*cache->copy)(cache, payload);
707f6d077f73cc948deead8df5b40ea42c1eaa78covener node->next = cache->nodes[hashval];
707f6d077f73cc948deead8df5b40ea42c1eaa78covener cache->nodes[hashval] = node;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf /* if we reach the full mark, note the time we did so
707f6d077f73cc948deead8df5b40ea42c1eaa78covener * for the benefit of the purge function
707f6d077f73cc948deead8df5b40ea42c1eaa78covener */
707f6d077f73cc948deead8df5b40ea42c1eaa78covener if (++cache->numentries == cache->fullmark) {
185aa71728867671e105178b4c66fbc22b65ae26sf cache->marktime=apr_time_now();
707f6d077f73cc948deead8df5b40ea42c1eaa78covener }
707f6d077f73cc948deead8df5b40ea42c1eaa78covener
707f6d077f73cc948deead8df5b40ea42c1eaa78covener}
707f6d077f73cc948deead8df5b40ea42c1eaa78covener
707f6d077f73cc948deead8df5b40ea42c1eaa78covenervoid util_ald_cache_remove(util_ald_cache_t *cache, void *payload)
707f6d077f73cc948deead8df5b40ea42c1eaa78covener{
707f6d077f73cc948deead8df5b40ea42c1eaa78covener int hashval;
707f6d077f73cc948deead8df5b40ea42c1eaa78covener util_cache_node_t *p, *q;
9ad7b260be233be7d7b5576979825cac72e15498rederpj
9ad7b260be233be7d7b5576979825cac72e15498rederpj if (cache == NULL)
9ad7b260be233be7d7b5576979825cac72e15498rederpj return;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf cache->removes++;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf hashval = (*cache->hash)(payload) % cache->size;
8445dae5cc606ba8ba04efc341cc1e081d95920drpluem for (p = cache->nodes[hashval], q=NULL;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf p && !(*cache->compare)(p->payload, payload);
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf p = p->next) {
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf q = p;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf }
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf /* If p is null, it means that we couldn't find the node, so just return */
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf if (p == NULL)
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf return;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf if (q == NULL) {
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf /* We found the node, and it's the first in the list */
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf cache->nodes[hashval] = p->next;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf }
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf else {
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf /* We found the node and it's not the first in the list */
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf q->next = p->next;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf }
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf (*cache->free)(cache, p->payload);
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf util_ald_free(cache, p);
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf cache->numentries--;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf}
141e1368614dc7564e1627671361b01b4869b491bnicholes
3dfeb02cfb853d8717ca0cc259b59fea610173f5bnicholeschar *util_ald_cache_display_stats(request_rec *r, util_ald_cache_t *cache, char *name, char *id)
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes{
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf unsigned long i;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes int totchainlen = 0;
e8f95a682820a599fe41b22977010636be5c2717jim int nchains = 0;
1ae7a5fbce5d4f65f3da355792258fe5dbc4ef55covener double chainlen;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf util_cache_node_t *n;
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf char *buf, *buf2;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes apr_pool_t *p = r->pool;
185aa71728867671e105178b4c66fbc22b65ae26sf
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes if (cache == NULL) {
3dfeb02cfb853d8717ca0cc259b59fea610173f5bnicholes return "";
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes }
3dfeb02cfb853d8717ca0cc259b59fea610173f5bnicholes
3dfeb02cfb853d8717ca0cc259b59fea610173f5bnicholes for (i=0; i < cache->size; ++i) {
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf if (cache->nodes[i] != NULL) {
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf nchains++;
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf for (n = cache->nodes[i]; n != NULL; n = n->next)
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf totchainlen++;
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf }
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf }
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf chainlen = nchains? (double)totchainlen / (double)nchains : 0;
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf if (id) {
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf buf2 = apr_psprintf(p,
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf "<a href=\"%s?%s\">%s</a>",
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf r->uri,
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf id,
185aa71728867671e105178b4c66fbc22b65ae26sf name);
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf }
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf else {
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf buf2 = name;
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf }
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes buf = apr_psprintf(p,
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<tr valign='top'>"
e8f95a682820a599fe41b22977010636be5c2717jim "<td nowrap>%s</td>"
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim "<td align='right' nowrap>%lu (%.0f%% full)</td>"
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim "<td align='right'>%.1f</td>"
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener "<td align='right'>%lu/%lu</td>"
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener "<td align='right'>%.0f%%</td>"
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener "<td align='right'>%lu/%lu</td>",
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener buf2,
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener cache->numentries,
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener (double)cache->numentries / (double)cache->maxentries * 100.0,
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener chainlen,
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener cache->hits,
96ebb616bbf4ac2a422cc5d9770c9ad07ccecdc0covener cache->fetches,
783874b86bfe13d7a4fe0922f344a3779cdccea3covener (cache->fetches > 0 ? (double)(cache->hits) / (double)(cache->fetches) * 100.0 : 100.0),
7dbf29be626018bc389ef94c1846aeac4b72633bsf cache->inserts,
7dbf29be626018bc389ef94c1846aeac4b72633bsf cache->removes);
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim
7dbf29be626018bc389ef94c1846aeac4b72633bsf if (cache->numpurges) {
7dbf29be626018bc389ef94c1846aeac4b72633bsf char str_ctime[APR_CTIME_LEN];
7dbf29be626018bc389ef94c1846aeac4b72633bsf
7dbf29be626018bc389ef94c1846aeac4b72633bsf apr_ctime(str_ctime, cache->last_purge);
7dbf29be626018bc389ef94c1846aeac4b72633bsf buf = apr_psprintf(p,
7dbf29be626018bc389ef94c1846aeac4b72633bsf "%s"
7dbf29be626018bc389ef94c1846aeac4b72633bsf "<td align='right'>%lu</td>\n"
7dbf29be626018bc389ef94c1846aeac4b72633bsf "<td align='right' nowrap>%s</td>\n",
7dbf29be626018bc389ef94c1846aeac4b72633bsf buf,
7dbf29be626018bc389ef94c1846aeac4b72633bsf cache->numpurges,
7dbf29be626018bc389ef94c1846aeac4b72633bsf str_ctime);
7dbf29be626018bc389ef94c1846aeac4b72633bsf }
783874b86bfe13d7a4fe0922f344a3779cdccea3covener else {
7dbf29be626018bc389ef94c1846aeac4b72633bsf buf = apr_psprintf(p,
7dbf29be626018bc389ef94c1846aeac4b72633bsf "%s<td colspan='2' align='center'>(none)</td>\n",
7dbf29be626018bc389ef94c1846aeac4b72633bsf buf);
7dbf29be626018bc389ef94c1846aeac4b72633bsf }
7dbf29be626018bc389ef94c1846aeac4b72633bsf
783874b86bfe13d7a4fe0922f344a3779cdccea3covener buf = apr_psprintf(p, "%s<td align='right'>%.2g</td>\n</tr>", buf, cache->avg_purgetime);
7dbf29be626018bc389ef94c1846aeac4b72633bsf
7dbf29be626018bc389ef94c1846aeac4b72633bsf return buf;
7dbf29be626018bc389ef94c1846aeac4b72633bsf}
7dbf29be626018bc389ef94c1846aeac4b72633bsf
7dbf29be626018bc389ef94c1846aeac4b72633bsfchar *util_ald_cache_display(request_rec *r, util_ldap_state_t *st)
7dbf29be626018bc389ef94c1846aeac4b72633bsf{
7dbf29be626018bc389ef94c1846aeac4b72633bsf unsigned long i,j;
783874b86bfe13d7a4fe0922f344a3779cdccea3covener char *buf, *t1, *t2, *t3;
7dbf29be626018bc389ef94c1846aeac4b72633bsf char *id1, *id2, *id3;
307219eca940aa30b873bfd68a44484dd3d3fa88covener char *argfmt = "cache=%s&id=%d&off=%d";
307219eca940aa30b873bfd68a44484dd3d3fa88covener char *scanfmt = "cache=%4s&id=%u&off=%u%1s";
307219eca940aa30b873bfd68a44484dd3d3fa88covener apr_pool_t *pool = r->pool;
7dbf29be626018bc389ef94c1846aeac4b72633bsf util_cache_node_t *p;
7dbf29be626018bc389ef94c1846aeac4b72633bsf util_url_node_t *n;
7dbf29be626018bc389ef94c1846aeac4b72633bsf
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes util_ald_cache_t *util_ldap_cache = st->util_ldap_cache;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes if (!util_ldap_cache) {
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes return "<tr valign='top'><td nowrap colspan=7>Cache has not been enabled/initialised.</td></tr>";
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes }
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes if (r->args && strlen(r->args)) {
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes char cachetype[5], lint[2];
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes unsigned int id, off;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes int ret;
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf if ((3 == sscanf(r->args, scanfmt, cachetype, &id, &off, lint)) &&
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes (id < util_ldap_cache->size)) {
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes p = util_ldap_cache->nodes[id];
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes n = (util_url_node_t *)p->payload;
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes ap_rputs(apr_psprintf(r->pool,
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<p>\n"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<table border='0'>\n"
307219eca940aa30b873bfd68a44484dd3d3fa88covener "<tr>\n"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<td bgcolor='#000000'><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Cache Name:</b></font></td>"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<td bgcolor='#ffffff'><font size='-1' face='Arial,Helvetica' color='#000000'><b>%s (%s)</b></font></td>"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "</tr>\n"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "</table>\n</p>\n",
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes n->url,
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes cachetype[0] == 's' ? "Search" : (cachetype[0] == 'c' ? "Compares" : "DNCompares")), r);
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes switch (cachetype[0]) {
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes case 's':
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf ap_rputs("<p>\n"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<table border='0'>\n"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<tr bgcolor='#000000'>\n"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>LDAP Filter</b></font></td>"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>User Name</b></font></td>"
d330a801b1e5d63a4b8b4fd431542ad0903fd71bbnicholes "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Last Bind</b></font></td>"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "</tr>\n", r
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes );
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes for (i=0; i < n->search_cache->size; ++i) {
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf for (p = n->search_cache->nodes[i]; p != NULL; p = p->next) {
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf (*n->search_cache->display)(r, n->search_cache, p->payload);
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener }
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener }
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener ap_rputs("</table>\n</p>\n", r);
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf break;
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf case 'c':
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes ap_rputs("<p>\n"
e8f95a682820a599fe41b22977010636be5c2717jim "<table border='0'>\n"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "<tr bgcolor='#000000'>\n"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>DN</b></font></td>"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Attribute</b></font></td>"
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Value</b></font></td>"
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Last Compare</b></font></td>"
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Result</b></font></td>"
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim "</tr>\n", r
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener );
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener for (i=0; i < n->compare_cache->size; ++i) {
7dbf29be626018bc389ef94c1846aeac4b72633bsf for (p = n->compare_cache->nodes[i]; p != NULL; p = p->next) {
7dbf29be626018bc389ef94c1846aeac4b72633bsf
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener (*n->compare_cache->display)(r, n->compare_cache, p->payload);
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener }
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener }
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener ap_rputs("</table>\n</p>\n", r);
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener break;
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim case 'd':
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener ap_rputs("<p>\n"
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener "<table border='0'>\n"
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener "<tr bgcolor='#000000'>\n"
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Require DN</b></font></td>"
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Actual DN</b></font></td>"
185aa71728867671e105178b4c66fbc22b65ae26sf "</tr>\n", r
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener );
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim for (i=0; i < n->dn_compare_cache->size; ++i) {
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener for (p = n->dn_compare_cache->nodes[i]; p != NULL; p = p->next) {
1f50dc34ae069adeed20b2986e5ffdefa5c410e0covener
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener (*n->dn_compare_cache->display)(r, n->dn_compare_cache, p->payload);
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim }
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener }
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener ap_rputs("</table>\n</p>\n", r);
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener break;
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener default:
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener break;
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim }
9c63a05713cb83a44a1590b4af33edeebf39f118sf
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener }
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim }
60d81cab99dccfbb0c8d378cf6aa7338be0fdb74covener else {
9c63a05713cb83a44a1590b4af33edeebf39f118sf ap_rputs("<p>\n"
9c63a05713cb83a44a1590b4af33edeebf39f118sf "<table border='0'>\n"
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf "<tr bgcolor='#000000'>\n"
5bfaaf573bacb45c1cf290ce85ecc676587e8a64jim "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Cache Name</b></font></td>"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Entries</b></font></td>"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Avg. Chain Len.</b></font></td>"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "<td colspan='2'><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Hits</b></font></td>"
54d22ed1c429b903b029bbd62621f11a9e286137minfrin "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Ins/Rem</b></font></td>"
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes "<td colspan='2'><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Purges</b></font></td>"
9c63a05713cb83a44a1590b4af33edeebf39f118sf "<td><font size='-1' face='Arial,Helvetica' color='#ffffff'><b>Avg Purge Time</b></font></td>"
4be9c459920a7c1cfe62d654327dae5c4bb6b284sf "</tr>\n", r
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes );
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
307219eca940aa30b873bfd68a44484dd3d3fa88covener buf = util_ald_cache_display_stats(r, st->util_ldap_cache, "LDAP URL Cache", NULL);
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes for (i=0; i < util_ldap_cache->size; ++i) {
d5b12fe8ae917e654a33247fd4e59dc9e75170aebnicholes for (p = util_ldap_cache->nodes[i],j=0; p != NULL; p = p->next,j++) {
54d22ed1c429b903b029bbd62621f11a9e286137minfrin
54d22ed1c429b903b029bbd62621f11a9e286137minfrin n = (util_url_node_t *)p->payload;
54d22ed1c429b903b029bbd62621f11a9e286137minfrin
54d22ed1c429b903b029bbd62621f11a9e286137minfrin t1 = apr_psprintf(pool, "%s (Searches)", n->url);
54d22ed1c429b903b029bbd62621f11a9e286137minfrin t2 = apr_psprintf(pool, "%s (Compares)", n->url);
54d22ed1c429b903b029bbd62621f11a9e286137minfrin t3 = apr_psprintf(pool, "%s (DNCompares)", n->url);
54d22ed1c429b903b029bbd62621f11a9e286137minfrin id1 = apr_psprintf(pool, argfmt, "srch", i, j);
54d22ed1c429b903b029bbd62621f11a9e286137minfrin id2 = apr_psprintf(pool, argfmt, "cmpr", i, j);
54d22ed1c429b903b029bbd62621f11a9e286137minfrin id3 = apr_psprintf(pool, argfmt, "dncp", i, j);
e8f95a682820a599fe41b22977010636be5c2717jim
482f676c6c19b1c5bb5cca04dad11509c1da3a4cwrowe buf = apr_psprintf(pool, "%s\n\n"
8a03cd420b800a2428f49f4617293de9b2387b20jorton "%s\n\n"
54d22ed1c429b903b029bbd62621f11a9e286137minfrin "%s\n\n"
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf "%s\n\n",
54d22ed1c429b903b029bbd62621f11a9e286137minfrin buf,
54d22ed1c429b903b029bbd62621f11a9e286137minfrin util_ald_cache_display_stats(r, n->search_cache, t1, id1),
54d22ed1c429b903b029bbd62621f11a9e286137minfrin util_ald_cache_display_stats(r, n->compare_cache, t2, id2),
54d22ed1c429b903b029bbd62621f11a9e286137minfrin util_ald_cache_display_stats(r, n->dn_compare_cache, t3, id3)
54d22ed1c429b903b029bbd62621f11a9e286137minfrin );
54d22ed1c429b903b029bbd62621f11a9e286137minfrin }
54d22ed1c429b903b029bbd62621f11a9e286137minfrin }
54d22ed1c429b903b029bbd62621f11a9e286137minfrin ap_rputs(buf, r);
54d22ed1c429b903b029bbd62621f11a9e286137minfrin ap_rputs("</table>\n</p>\n", r);
54d22ed1c429b903b029bbd62621f11a9e286137minfrin }
54d22ed1c429b903b029bbd62621f11a9e286137minfrin
54d22ed1c429b903b029bbd62621f11a9e286137minfrin return buf;
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf}
ab86c68ce36c715e93f403dde41d0b9c1522c8b0sf
54d22ed1c429b903b029bbd62621f11a9e286137minfrin#endif /* APR_HAS_LDAP */
6999a76d8eb5ef6b4b295e51df0b2fb6064bd373covener