2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 1999-2005 The OpenLDAP Foundation.
5 * Portions Copyright 2001-2003 Pierangelo Masarati.
6 * Portions Copyright 1999-2003 Howard Chu.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted only as authorized by the OpenLDAP
13 * A copy of this license is available in the file LICENSE in the
14 * top-level directory of the distribution or, alternatively, at
15 * <http://www.OpenLDAP.org/license.html>.
18 * This work was initially developed by the Howard Chu for inclusion
19 * in OpenLDAP Software and subsequently enhanced by Pierangelo
26 #include <ac/string.h>
29 #include "../back-ldap/back-ldap.h"
30 #include "back-meta.h"
33 * The dncache, at present, maps an entry to the target that holds it.
36 typedef struct metadncacheentry_t {
46 * compares two struct metadncacheentry; used by avl stuff
47 * FIXME: modify avl stuff to delete an entry based on cmp
48 * (e.g. when ttl expired?)
55 metadncacheentry_t *cc1 = ( metadncacheentry_t * )c1;
56 metadncacheentry_t *cc2 = ( metadncacheentry_t * )c2;
59 * case sensitive, because the dn MUST be normalized
61 return ber_bvcmp( &cc1->dn, &cc2->dn);
67 * returns -1 in case a duplicate struct metadncacheentry has been inserted;
75 metadncacheentry_t *cc1 = ( metadncacheentry_t * )c1;
76 metadncacheentry_t *cc2 = ( metadncacheentry_t * )c2;
79 * case sensitive, because the dn MUST be normalized
81 return ( ber_bvcmp( &cc1->dn, &cc2->dn ) == 0 ) ? -1 : 0;
85 * meta_dncache_get_target
87 * returns the target a dn belongs to, or -1 in case the dn is not
91 meta_dncache_get_target(
95 metadncacheentry_t tmp_entry,
98 int target = META_TARGET_NONE;
104 ldap_pvt_thread_mutex_lock( &cache->mutex );
105 entry = ( metadncacheentry_t * )avl_find( cache->tree,
106 ( caddr_t )&tmp_entry, meta_dncache_cmp );
108 if ( entry != NULL ) {
111 * if cache->ttl < 0, cache never expires;
112 * if cache->ttl = 0 no cache is used; shouldn't get here
113 * else, cache is used with ttl
115 if ( cache->ttl < 0 ) {
116 target = entry->target;
123 curr_time = time( NULL );
125 if ( entry->lastupdated+cache->ttl > curr_time ) {
126 target = entry->target;
130 ldap_pvt_thread_mutex_unlock( &cache->mutex );
136 * meta_dncache_update_entry
138 * updates target and lastupdated of a struct metadncacheentry if exists,
139 * otherwise it gets created; returns -1 in case of error
142 meta_dncache_update_entry(
143 metadncache_t *cache,
147 metadncacheentry_t *entry,
149 time_t curr_time = 0L;
156 * if cache->ttl < 0, cache never expires;
157 * if cache->ttl = 0 no cache is used; shouldn't get here
158 * else, cache is used with ttl
160 if ( cache->ttl > 0 ) {
165 curr_time = time( NULL );
170 ldap_pvt_thread_mutex_lock( &cache->mutex );
171 entry = ( metadncacheentry_t * )avl_find( cache->tree,
172 ( caddr_t )&tmp_entry, meta_dncache_cmp );
174 if ( entry != NULL ) {
175 entry->target = target;
176 entry->lastupdated = curr_time;
179 entry = ch_malloc( sizeof( metadncacheentry_t ) + ndn->bv_len + 1 );
180 if ( entry == NULL ) {
181 ldap_pvt_thread_mutex_unlock( &cache->mutex );
185 entry->dn.bv_val = (char *)&entry[ 1 ];
186 AC_MEMCPY( entry->dn.bv_val, ndn->bv_val, ndn->bv_len + 1 );
187 entry->target = target;
188 entry->lastupdated = curr_time;
190 err = avl_insert( &cache->tree, ( caddr_t )entry,
191 meta_dncache_cmp, meta_dncache_dup );
193 ldap_pvt_thread_mutex_unlock( &cache->mutex );
199 * meta_dncache_update_entry
201 * updates target and lastupdated of a struct metadncacheentry if exists,
202 * otherwise it gets created; returns -1 in case of error
205 meta_dncache_delete_entry(
206 metadncache_t *cache,
209 metadncacheentry_t *entry,
217 ldap_pvt_thread_mutex_lock( &cache->mutex );
218 entry = avl_delete( &cache->tree, ( caddr_t )&tmp_entry,
220 ldap_pvt_thread_mutex_unlock( &cache->mutex );
222 if ( entry != NULL ) {
223 meta_dncache_free( ( void * )entry );