/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2009 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
* Portions Copyright 1998-2003 Kurt D. Zeilenga.
* Portions Copyright 2003 IBM Corporation.
* All rights reserved.
OperationBuffer opbuf;
Operation *op = NULL;
void *thrctx;
+ int requestBSF = 0;
+ int doBSF = 0;
slap_tool_init( progname, SLAPCAT, argc, argv );
+ requestBSF = ( sub_ndn.bv_len || filter );
+
#ifdef SIGPIPE
(void) SIGNAL( SIGPIPE, slapcat_sig );
#endif
if( !be->be_entry_open ||
!be->be_entry_close ||
- !be->be_entry_first ||
+ !( be->be_entry_first || be->be_entry_first_x ) ||
!be->be_entry_next ||
!be->be_entry_get )
{
op->o_tmpmemctx = NULL;
op->o_bd = be;
- for ( id = be->be_entry_first( be );
- id != NOID;
- id = be->be_entry_next( be ) )
- {
+
+ if ( !requestBSF && be->be_entry_first ) {
+ id = be->be_entry_first( be );
+
+ } else {
+ if ( be->be_entry_first_x ) {
+ id = be->be_entry_first_x( be,
+ sub_ndn.bv_len ? &sub_ndn : NULL, scope, filter );
+
+ } else {
+ assert( be->be_entry_first != NULL );
+ doBSF = 1;
+ id = be->be_entry_first( be );
+ }
+ }
+
+ for ( ; id != NOID; id = be->be_entry_next( be ) ) {
Entry* e;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof(textbuf);
break;
}
- if( sub_ndn.bv_len && !dnIsSuffix( &e->e_nname, &sub_ndn ) ) {
- be_entry_release_r( op, e );
- continue;
- }
-
- if( filter != NULL ) {
- int rc = test_filter( NULL, e, filter );
- if( rc != LDAP_COMPARE_TRUE ) {
+ if ( doBSF ) {
+ if ( sub_ndn.bv_len && !dnIsSuffixScope( &e->e_nname, &sub_ndn, scope ) )
+ {
be_entry_release_r( op, e );
continue;
}
+
+
+ if ( filter != NULL ) {
+ int rc = test_filter( NULL, e, filter );
+ if ( rc != LDAP_COMPARE_TRUE ) {
+ be_entry_release_r( op, e );
+ continue;
+ }
+ }
}
if( verbose ) {