/* cache.c - routines to maintain an in-core cache of entries */
/*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/*
- * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- *
* Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
*
* This work has beed deveolped for the OpenLDAP Foundation
const void *c2
)
{
- struct monitorcache *cc1 = ( struct monitorcache * )c1;
- struct monitorcache *cc2 = ( struct monitorcache * )c2;
+ struct monitorcache *cc1 = ( struct monitorcache * )c1;
+ struct monitorcache *cc2 = ( struct monitorcache * )c2;
+
+ int d = cc1->mc_ndn->bv_len - cc2->mc_ndn->bv_len;
/*
* case sensitive, because the dn MUST be normalized
*/
- return strcmp( cc1->mc_ndn, cc2->mc_ndn );
+ return d != 0 ? d : strcmp( cc1->mc_ndn->bv_val, cc2->mc_ndn->bv_val );
}
/*
{
struct monitorcache *cc1 = ( struct monitorcache * )c1;
struct monitorcache *cc2 = ( struct monitorcache * )c2;
+
/*
* case sensitive, because the dn MUST be normalized
*/
- return ( strcmp( cc1->mc_ndn, cc2->mc_ndn ) == 0 ) ? -1 : 0;
+#if 0
+ int cmp = monitor_cache_cmp( c1, c2 );
+#else
+ int d = cc1->mc_ndn->bv_len - cc2->mc_ndn->bv_len;
+ int cmp =
+ d != 0 ? d : strcmp( cc1->mc_ndn->bv_val, cc2->mc_ndn->bv_val );
+#endif
+
+ return cmp == 0 ? -1 : 0;
}
/*
ldap_pvt_thread_mutex_init( &mp->mp_mutex );
mc = ( struct monitorcache * )ch_malloc( sizeof( struct monitorcache ) );
- mc->mc_ndn = e->e_ndn;
+ mc->mc_ndn = &e->e_nname;
mc->mc_e = e;
ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
rc = avl_insert( &mi->mi_cache, ( caddr_t )mc,
int
monitor_cache_get(
struct monitorinfo *mi,
- const char *ndn,
+ struct berval *ndn,
Entry **ep
)
{
assert( ndn != NULL );
assert( ep != NULL );
- tmp_mc.mc_ndn = ( char * )ndn;
+ tmp_mc.mc_ndn = ndn;
ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
mc = ( struct monitorcache * )avl_find( mi->mi_cache,
( caddr_t )&tmp_mc, monitor_cache_cmp );
int
monitor_cache_dn2entry(
struct monitorinfo *mi,
- const char *ndn,
+ struct berval *ndn,
Entry **ep,
Entry **matched
)
{
- int rc;
+ int rc;
- char *p_ndn;
- Entry *e_parent;
+ struct berval p_ndn = { 0L, NULL };
+ Entry *e_parent;
struct monitorentrypriv *mp;
assert( mi != NULL );
}
/* try with parent/ancestors */
- p_ndn = dn_parent( NULL, ndn );
- rc = monitor_cache_dn2entry( mi, p_ndn, &e_parent, matched );
+ if ( ndn->bv_len ) {
+ dnParent( ndn, &p_ndn );
+ }
+
+ if ( p_ndn.bv_val == NULL ) {
+ p_ndn.bv_val = "";
+ p_ndn.bv_len = 0;
+
+ } else {
+ p_ndn.bv_len = ndn->bv_len
+ - ( ber_len_t ) ( p_ndn.bv_val - ndn->bv_val );
+ }
+
+ rc = monitor_cache_dn2entry( mi, &p_ndn, &e_parent, matched );
if ( rc || e_parent == NULL) {
return( -1 );
}
mp = ( struct monitorentrypriv * )e->e_private;
if ( mp->mp_flags & MONITOR_F_VOLATILE ) {
+ struct monitorcache *mc, tmp_mc;
+
/* volatile entries do not return to cache */
+ ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
+ tmp_mc.mc_ndn = &e->e_nname;
+ mc = avl_delete( &mi->mi_cache,
+ ( caddr_t )&tmp_mc, monitor_cache_cmp );
+ ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+ ch_free( mc );
+
ldap_pvt_thread_mutex_destroy( &mp->mp_mutex );
ch_free( mp );
e->e_private = NULL;
entry_free( e );
+
return( 0 );
}
ldap_pvt_thread_mutex_unlock( &mp->mp_mutex );
+
return( 0 );
}