/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2001-2004 The OpenLDAP Foundation.
+ * Copyright 2001-2005 The OpenLDAP Foundation.
* Portions Copyright 2001-2003 Pierangelo Masarati.
* All rights reserved.
*
#include "back-monitor.h"
+/*
+ * The cache maps DNs to Entries.
+ * Each entry, on turn, holds the list of its children in the e_private field.
+ * This is used by search operation to perform onelevel and subtree candidate
+ * selection.
+ */
+typedef struct monitor_cache_t {
+ struct berval mc_ndn;
+ Entry *mc_e;
+} monitor_cache_t;
+
/*
* compares entries based on the dn
*/
int
monitor_cache_cmp(
- const void *c1,
- const void *c2
+ const void *c1,
+ const void *c2
)
{
- struct monitorcache *cc1 = ( struct monitorcache * )c1;
- struct monitorcache *cc2 = ( struct monitorcache * )c2;
+ monitor_cache_t *cc1 = ( monitor_cache_t * )c1;
+ monitor_cache_t *cc2 = ( monitor_cache_t * )c2;
/*
* case sensitive, because the dn MUST be normalized
*/
int
monitor_cache_dup(
- void *c1,
- void *c2
+ void *c1,
+ void *c2
)
{
- struct monitorcache *cc1 = ( struct monitorcache * )c1;
- struct monitorcache *cc2 = ( struct monitorcache * )c2;
+ monitor_cache_t *cc1 = ( monitor_cache_t * )c1;
+ monitor_cache_t *cc2 = ( monitor_cache_t * )c2;
/*
* case sensitive, because the dn MUST be normalized
*/
int
monitor_cache_add(
- struct monitorinfo *mi,
- Entry *e
+ monitor_info_t *mi,
+ Entry *e
)
{
- struct monitorcache *mc;
- struct monitorentrypriv *mp;
- int rc;
+ monitor_cache_t *mc;
+ monitor_entry_t *mp;
+ int rc;
assert( mi != NULL );
assert( e != NULL );
- mp = ( struct monitorentrypriv *)e->e_private;
+ mp = ( monitor_entry_t *)e->e_private;
ldap_pvt_thread_mutex_init( &mp->mp_mutex );
- mc = ( struct monitorcache * )ch_malloc( sizeof( struct monitorcache ) );
+ mc = ( monitor_cache_t * )ch_malloc( sizeof( monitor_cache_t ) );
mc->mc_ndn = e->e_nname;
mc->mc_e = e;
ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
*/
int
monitor_cache_lock(
- Entry *e
+ Entry *e
)
{
- struct monitorentrypriv *mp;
+ monitor_entry_t *mp;
assert( e != NULL );
assert( e->e_private != NULL );
- mp = ( struct monitorentrypriv * )e->e_private;
+ mp = ( monitor_entry_t * )e->e_private;
ldap_pvt_thread_mutex_lock( &mp->mp_mutex );
return( 0 );
*/
int
monitor_cache_get(
- struct monitorinfo *mi,
- struct berval *ndn,
- Entry **ep
+ monitor_info_t *mi,
+ struct berval *ndn,
+ Entry **ep
)
{
- struct monitorcache tmp_mc, *mc;
+ monitor_cache_t tmp_mc, *mc;
assert( mi != NULL );
assert( ndn != NULL );
tmp_mc.mc_ndn = *ndn;
ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
- mc = ( struct monitorcache * )avl_find( mi->mi_cache,
+ mc = ( monitor_cache_t * )avl_find( mi->mi_cache,
( caddr_t )&tmp_mc, monitor_cache_cmp );
if ( mc != NULL ) {
Entry **matched
)
{
- struct monitorinfo *mi = (struct monitorinfo *)op->o_bd->be_private;
+ monitor_info_t *mi = (monitor_info_t *)op->o_bd->be_private;
int rc;
struct berval p_ndn = BER_BVNULL;
Entry *e_parent;
- struct monitorentrypriv *mp;
+ monitor_entry_t *mp;
assert( mi != NULL );
assert( ndn != NULL );
*matched = NULL;
+ if ( !dnIsSuffix( ndn, &op->o_bd->be_nsuffix[ 0 ] ) ) {
+ return( -1 );
+ }
+
rc = monitor_cache_get( mi, ndn, ep );
if ( !rc && *ep != NULL ) {
return( 0 );
return( -1 );
}
- mp = ( struct monitorentrypriv * )e_parent->e_private;
+ mp = ( monitor_entry_t * )e_parent->e_private;
rc = -1;
if ( mp->mp_flags & MONITOR_F_VOLATILE_CH ) {
/* parent entry generates volatile children */
*/
int
monitor_cache_release(
- struct monitorinfo *mi,
- Entry *e
+ monitor_info_t *mi,
+ Entry *e
)
{
- struct monitorentrypriv *mp;
+ monitor_entry_t *mp;
assert( mi != NULL );
assert( e != NULL );
assert( e->e_private != NULL );
- mp = ( struct monitorentrypriv * )e->e_private;
+ mp = ( monitor_entry_t * )e->e_private;
if ( mp->mp_flags & MONITOR_F_VOLATILE ) {
- struct monitorcache *mc, tmp_mc;
+ monitor_cache_t *mc, tmp_mc;
/* volatile entries do not return to cache */
ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );