]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/search.c
Merge remote branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / servers / slapd / back-ldap / search.c
index 0120640e6d537801c78a8b4087795114250999a3..d2d2080c8639f075947dfcfb5e3a4bacf086674a 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2011 The OpenLDAP Foundation.
+ * Copyright 1999-2012 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.
@@ -141,7 +141,7 @@ ldap_back_search(
                        msgid; 
        struct berval   match = BER_BVNULL,
                        filter = BER_BVNULL;
-       int             i;
+       int             i, x;
        char            **attrs = NULL;
        int             freetext = 0, filter_undef = 0;
        int             do_retry = 1, dont_retry = 0;
@@ -169,22 +169,48 @@ ldap_back_search(
                LDAP_BACK_TV_SET( &tv );
        }
 
+       i = 0;
        if ( op->ors_attrs ) {
-               for ( i = 0; !BER_BVISNULL( &op->ors_attrs[i].an_name ); i++ )
+               for ( ; !BER_BVISNULL( &op->ors_attrs[i].an_name ); i++ )
                        /* just count attrs */ ;
+       }
+
+       x = 0;
+       if ( op->o_bd->be_extra_anlist ) {
+               for ( ; !BER_BVISNULL( &op->o_bd->be_extra_anlist[x].an_name ); x++ )
+                       /* just count attrs */ ;
+       }
 
-               attrs = op->o_tmpalloc( ( i + 1 )*sizeof( char * ),
+       if ( i > 0 || x > 0 ) {
+               int j = 0;
+
+               attrs = op->o_tmpalloc( ( i + x + 1 )*sizeof( char * ),
                        op->o_tmpmemctx );
                if ( attrs == NULL ) {
                        rs->sr_err = LDAP_NO_MEMORY;
                        rc = -1;
                        goto finish;
                }
-       
-               for ( i = 0; !BER_BVISNULL( &op->ors_attrs[i].an_name ); i++ ) {
-                       attrs[ i ] = op->ors_attrs[i].an_name.bv_val;
+
+               if ( i > 0 ) {  
+                       for ( i = 0; !BER_BVISNULL( &op->ors_attrs[i].an_name ); i++, j++ ) {
+                               attrs[ j ] = op->ors_attrs[i].an_name.bv_val;
+                       }
                }
-               attrs[ i ] = NULL;
+
+               if ( x > 0 ) {
+                       for ( x = 0; !BER_BVISNULL( &op->o_bd->be_extra_anlist[x].an_name ); x++, j++ ) {
+                               if ( op->o_bd->be_extra_anlist[x].an_desc &&
+                                       ad_inlist( op->o_bd->be_extra_anlist[x].an_desc, op->ors_attrs ) )
+                               {
+                                       continue;
+                               }
+
+                               attrs[ j ] = op->o_bd->be_extra_anlist[x].an_name.bv_val;
+                       }
+               }
+
+               attrs[ j ] = NULL;
        }
 
        ctrls = op->o_ctrls;
@@ -210,6 +236,10 @@ retry:
                        tv.tv_sec ? &tv : NULL,
                        op->ors_slimit, op->ors_deref, &msgid );
 
+       ldap_pvt_thread_mutex_lock( &li->li_counter_mutex );
+       ldap_pvt_mp_add( li->li_ops_completed[ SLAP_OP_SEARCH ], 1 );
+       ldap_pvt_thread_mutex_unlock( &li->li_counter_mutex );
+
        if ( rs->sr_err != LDAP_SUCCESS ) {
                switch ( rs->sr_err ) {
                case LDAP_SERVER_DOWN: