X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Fsearch.c;h=e2e5b113c9bbf82dc9031ab4de6ed2164026e5a3;hb=1586a68219cf85e9caaafcf2259c9bc249358077;hp=83f2a5325790186c2d7ad02597d6e6c40f5e2e90;hpb=e8c58b4e7f21caa6c0b6006e3528cbad9b8aed45;p=openldap diff --git a/servers/slapd/back-ldbm/search.c b/servers/slapd/back-ldbm/search.c index 83f2a53257..e2e5b113c9 100644 --- a/servers/slapd/back-ldbm/search.c +++ b/servers/slapd/back-ldbm/search.c @@ -1,8 +1,17 @@ /* search.c - ldbm backend search function */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2003 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -20,7 +29,7 @@ static ID_BLOCK *base_candidate( Backend *be, Entry *e ); static ID_BLOCK *search_candidates( - Backend *be, Entry *e, Filter *filter, + Operation *op, Entry *e, Filter *filter, int scope, int deref, int manageDSAit ); @@ -40,11 +49,6 @@ ldbm_back_search( struct berval realbase = { 0, NULL }; int manageDSAit = get_manageDSAit( op ); int cscope = LDAP_SCOPE_DEFAULT; - int nentries = 0; - -#ifdef LDAP_CACHING - Entry cache_base_entry; -#endif /* LDAP_CACHING */ struct slap_limits_set *limit = NULL; int isroot = 0; @@ -58,7 +62,6 @@ ldbm_back_search( /* grab giant lock for reading */ ldap_pvt_thread_rdwr_rlock(&li->li_giant_rwlock); -#ifndef LDAP_CACHING if ( op->o_req_ndn.bv_len == 0 ) { /* DIT root special case */ e = (Entry *) &slap_entry_root; @@ -66,26 +69,7 @@ ldbm_back_search( /* need normalized dn below */ ber_dupbv( &realbase, &e->e_nname ); -#else /* LDAP_CACHING */ - if ( op->o_caching_on || op->o_req_ndn.bv_len == 0 ) { - if (op->o_req_ndn.bv_len == 0) { - e = (Entry *) &slap_entry_root; - /* need normalized dn below */ - ber_dupbv( &realbase, &e->e_nname ); - } else { - if ((scope == LDAP_SCOPE_BASE) - && (e = dn2entry_r( op->o_bd, &op->o_req_ndn &matched ))) - { - candidates = base_candidate(op->o_bd,e); - cache_return_entry_r( &li->li_cache, e ); - goto searchit; - } - cache_base_entry.e_nname = *nbase; - e = &cache_base_entry; - } -#endif /* LDAP_CACHING */ - - candidates = search_candidates( op->o_bd, e, op->oq_search.rs_filter, + candidates = search_candidates( op, e, op->oq_search.rs_filter, op->oq_search.rs_scope, op->oq_search.rs_deref, manageDSAit || get_domainScope(op) ); @@ -136,7 +120,9 @@ ldbm_back_search( ber_bvarray_free( rs->sr_ref ); ber_memfree( matched_dn.bv_val ); - return 1; + rs->sr_ref = NULL; + rs->sr_matched = NULL; + return LDAP_REFERRAL; } if (!manageDSAit && is_entry_referral( e ) ) { @@ -180,7 +166,9 @@ ldbm_back_search( } ber_memfree( matched_dn.bv_val ); - return 1; + rs->sr_ref = NULL; + rs->sr_matched = NULL; + return LDAP_OTHER; } if ( is_entry_alias( e ) ) { @@ -195,7 +183,7 @@ ldbm_back_search( } else { cscope = ( op->oq_search.rs_scope != LDAP_SCOPE_SUBTREE ) ? LDAP_SCOPE_BASE : LDAP_SCOPE_SUBTREE; - candidates = search_candidates( op->o_bd, e, op->oq_search.rs_filter, + candidates = search_candidates( op, e, op->oq_search.rs_filter, op->oq_search.rs_scope, op->oq_search.rs_deref, manageDSAit ); } @@ -214,31 +202,16 @@ searchit: Debug( LDAP_DEBUG_TRACE, "ldbm_search: no candidates\n", 0, 0, 0 ); #endif -#ifdef LDAP_CACHING - if ( op->o_caching_on ) { - ldap_pvt_thread_rdwr_runlock(&li->li_giant_rwlock); - } -#endif /* LDAP_CACHING */ rs->sr_err = LDAP_SUCCESS; - send_search_result( op, rs ); - -#ifdef LDAP_CACHING - if ( op->o_caching_on ) { - ldap_pvt_thread_rdwr_rlock(&li->li_giant_rwlock); - } -#endif /* LDAP_CACHING */ + send_ldap_result( op, rs ); - rc = 1; + rc = LDAP_SUCCESS; goto done; } /* if not root, get appropriate limits */ -#ifndef LDAP_CACHING if ( be_isroot( op->o_bd, &op->o_ndn ) ) -#else /* LDAP_CACHING */ - if ( op->o_caching_on || be_isroot( op->o_bd, &op->o_ndn ) ) -#endif /* LDAP_CACHING */ { /* * FIXME: I'd consider this dangerous if someone @@ -254,7 +227,7 @@ searchit: if ( ID_BLOCK_NIDS( candidates ) > (unsigned) limit->lms_s_unchecked ) { send_ldap_error( op, rs, LDAP_ADMINLIMIT_EXCEEDED, NULL ); - rc = 0; + rc = LDAP_SUCCESS; goto done; } } @@ -287,7 +260,7 @@ searchit: send_ldap_error( op, rs, LDAP_ADMINLIMIT_EXCEEDED, NULL ); - rc = 0; + rc = LDAP_SUCCESS; goto done; } @@ -311,7 +284,7 @@ searchit: send_ldap_error( op, rs, LDAP_ADMINLIMIT_EXCEEDED, NULL ); - rc = 0; + rc = LDAP_SUCCESS; goto done; } @@ -331,16 +304,15 @@ searchit: /* check for abandon */ if ( op->o_abandon ) { - rc = 0; + rc = LDAP_SUCCESS; goto done; } /* check time limit */ if ( op->oq_search.rs_tlimit != -1 && slap_get_time() > stoptime ) { rs->sr_err = LDAP_TIMELIMIT_EXCEEDED; - rs->sr_nentries = nentries; - send_search_result( op, rs ); - rc = 0; + send_ldap_result( op, rs ); + rc = LDAP_SUCCESS; goto done; } @@ -361,9 +333,25 @@ searchit: } rs->sr_entry = e; -#ifdef LDAP_CACHING - if ( !op->o_caching_on ) { -#endif /* LDAP_CACHING */ + +#ifdef LDBM_SUBENTRIES + if ( is_entry_subentry( e ) ) { + if( op->oq_search.rs_scope != LDAP_SCOPE_BASE ) { + if(!get_subentries_visibility( op )) { + /* only subentries are visible */ + goto loop_continue; + } + } else if ( get_subentries( op ) && + !get_subentries_visibility( op )) + { + /* only subentries are visible */ + goto loop_continue; + } + } else if ( get_subentries_visibility( op )) { + /* only subentries are visible */ + goto loop_continue; + } +#endif if ( op->oq_search.rs_deref & LDAP_DEREF_SEARCHING && is_entry_alias( e ) ) { Entry *matched; @@ -463,9 +451,9 @@ searchit: goto loop_continue; } -#ifdef LDAP_CACHING + if ( !manageDSAit && is_entry_glue( e )) { + goto loop_continue; } -#endif /* LDAP_CACHING */ /* if it matches the filter and scope, send it */ result = test_filter( op, e, op->oq_search.rs_filter ); @@ -494,39 +482,23 @@ searchit: if ( --op->oq_search.rs_slimit == -1 ) { cache_return_entry_r( &li->li_cache, e ); rs->sr_err = LDAP_SIZELIMIT_EXCEEDED; - rs->sr_nentries = nentries; - send_search_result( op, rs ); - rc = 0; + send_ldap_result( op, rs ); + rc = LDAP_SUCCESS; goto done; } if (e) { -#ifdef LDAP_CACHING - if ( op->o_caching_on ) { - ldap_pvt_thread_rdwr_runlock(&li->li_giant_rwlock); - cache_return_entry_r( &li->li_cache, e ); - } -#endif /* LDAP_CACHING */ - result = send_search_entry( op, rs ); -#ifdef LDAP_CACHING - if ( op->o_caching_on ) { - ldap_pvt_thread_rdwr_rlock( &li->li_giant_rwlock ); - } -#endif /* LDAP_CACHING */ - - switch (result) { case 0: /* entry sent ok */ - nentries++; break; case 1: /* entry not sent */ break; case -1: /* connection closed */ cache_return_entry_r( &li->li_cache, e ); - rc = 0; + rc = LDAP_SUCCESS; goto done; } } @@ -557,13 +529,7 @@ searchit: loop_continue: if( e != NULL ) { /* free reader lock */ -#ifndef LDAP_CACHING cache_return_entry_r( &li->li_cache, e ); -#else /* LDAP_CACHING */ - if ( !op->o_caching_on ) { - cache_return_entry_r( &li->li_cache, e ); - } -#endif /* LDAP_CACHING */ } ldap_pvt_thread_yield(); @@ -571,10 +537,9 @@ loop_continue: rs->sr_err = rs->sr_v2ref ? LDAP_REFERRAL : LDAP_SUCCESS; rs->sr_ref = rs->sr_v2ref; - rs->sr_nentries = nentries; - send_search_result( op, rs ); + send_ldap_result( op, rs ); - rc = 0; + rc = LDAP_SUCCESS; done: ldap_pvt_thread_rdwr_runlock(&li->li_giant_rwlock); @@ -611,7 +576,7 @@ base_candidate( static ID_BLOCK * search_candidates( - Backend *be, + Operation *op, Entry *e, Filter *filter, int scope, @@ -623,6 +588,10 @@ search_candidates( AttributeAssertion aa_ref, aa_alias; struct berval bv_ref = { sizeof("referral")-1, "referral" }; struct berval bv_alias = { sizeof("alias")-1, "alias" }; +#ifdef LDBM_SUBENTRIES + Filter sf; + AttributeAssertion aa_subentry; +#endif #ifdef NEW_LOGGING LDAP_LOG( BACK_LDBM, DETAIL1, @@ -668,7 +637,19 @@ search_candidates( fand.f_dn = &e->e_nname; fand.f_next = xf.f_or == filter ? filter : &xf ; - candidates = filter_candidates( be, &f ); +#ifdef LDBM_SUBENTRIES + if ( get_subentries_visibility( op )) { + struct berval bv_subentry = { sizeof("SUBENTRY")-1, "SUBENTRY" }; + sf.f_choice = LDAP_FILTER_EQUALITY; + sf.f_ava = &aa_subentry; + sf.f_av_desc = slap_schema.si_ad_objectClass; + sf.f_av_value = bv_subentry; + sf.f_next = fand.f_next; + fand.f_next = &sf; + } +#endif + + candidates = filter_candidates( op, &f ); return( candidates ); }