]> git.sur5r.net Git - openldap/commitdiff
Patch for fast synchronous search result processing
authorJong Hyuk Choi <jongchoi@openldap.org>
Mon, 18 Oct 2004 04:58:36 +0000 (04:58 +0000)
committerJong Hyuk Choi <jongchoi@openldap.org>
Mon, 18 Oct 2004 04:58:36 +0000 (04:58 +0000)
libraries/libldap/addentry.c
libraries/libldap/error.c
libraries/libldap/ldap-int.h
libraries/libldap/result.c

index c7c83cf932ea677ad0f58da1f138631a3cbbe0bb..8787dfc2563b6fe94e1ceadb506531f921c5ead3 100644 (file)
@@ -43,10 +43,15 @@ ldap_delete_result_entry( LDAPMessage **list, LDAPMessage *e )
        if ( tmp == NULL )
                return( NULL );
 
-       if ( prev == NULL )
+       if ( prev == NULL ) {
+               if ( tmp->lm_chain )
+                       tmp->lm_chain->lm_chain_tail = (*list)->lm_chain_tail;
                *list = tmp->lm_chain;
-       else
+       } else {
                prev->lm_chain = tmp->lm_chain;
+               if ( prev->lm_chain == NULL )
+                       (*list)->lm_chain_tail = prev;
+       }
        tmp->lm_chain = NULL;
 
        return( tmp );
@@ -59,5 +64,6 @@ ldap_add_result_entry( LDAPMessage **list, LDAPMessage *e )
        assert( e != NULL );
 
        e->lm_chain = *list;
+       e->lm_chain_tail = (*list)->lm_chain_tail;
        *list = e;
 }
index b2be1dd668edb5de546cc1b940a9703b4fe31e86..2388238558e13bb1f2c4157fabd6790dcd1b0211 100644 (file)
@@ -255,13 +255,24 @@ ldap_parse_result(
        ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex );
 #endif
        /* Find the next result... */
-       for ( lm = r; lm != NULL; lm = lm->lm_chain ) {
-               /* skip over entries and references */
-               if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
-                       lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
-                       lm->lm_msgtype != LDAP_RES_INTERMEDIATE )
-               {
-                       break;
+       if ( r->lm_chain == NULL ) {
+               if ((r->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
+                       (r->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
+                       (r->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
+                       lm = NULL;      
+               } else {
+                       lm = r;
+               }
+       } else {
+               if ((r->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_ENTRY) ||
+                       (r->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_REFERENCE) ||
+                       (r->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_INTERMEDIATE)) {
+                       lm = NULL;
+               } else {
+                       lm = r->lm_chain_tail->lm_chain;
                }
        }
 
@@ -368,15 +379,24 @@ ldap_parse_result(
                }
 
                /* Find the next result... */
-               for ( lm = lm->lm_chain; lm != NULL; lm = lm->lm_chain ) {
-                       /* skip over entries and references */
-                       if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
-                               lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
-                               lm->lm_msgtype != LDAP_RES_INTERMEDIATE )
-                       {
-                               /* more results to return */
-                               errcode = LDAP_MORE_RESULTS_TO_RETURN;
-                               break;
+               lm = lm->lm_chain;
+               if ( lm ) {
+                       if ( lm->lm_chain == NULL ) {
+                               if ((lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY) &&
+                                       (lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE) &&
+                                       (lm->lm_msgtype != LDAP_RES_INTERMEDIATE)) {
+                                       /* more results to return */
+                                       errcode = LDAP_MORE_RESULTS_TO_RETURN;
+                               }
+                       } else {
+                               if ((lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               != LDAP_RES_SEARCH_ENTRY) &&
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               != LDAP_RES_SEARCH_REFERENCE) &&
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               != LDAP_RES_INTERMEDIATE)) {
+                                       errcode = LDAP_MORE_RESULTS_TO_RETURN;
+                               }
                        }
                }
        }
index 844fd4cdc2140058e3e081216c8341876bf77e39..b83c6ca2939ea189e4388897ef2081fa628d5d76 100644 (file)
@@ -137,6 +137,7 @@ struct ldapmsg {
        ber_tag_t               lm_msgtype;     /* the message type */
        BerElement      *lm_ber;        /* the ber encoded message contents */
        struct ldapmsg  *lm_chain;      /* for search - next msg in the resp */
+       struct ldapmsg  *lm_chain_tail;
        struct ldapmsg  *lm_next;       /* next response */
        time_t  lm_time;        /* used to maintain cache */
 };
index dd41a27a9c27af7903d06c5bbed24170ddca0e6d..6ee244e9dd9ea78e9b0c800eb7c9754ff37c1096 100644 (file)
@@ -177,12 +177,24 @@ chkResponseList(
                                break;
                        }
 
-                       for ( tmp = lm; tmp != NULL; tmp = tmp->lm_chain ) {
-                               if ( tmp->lm_msgtype != LDAP_RES_SEARCH_ENTRY
-                                   && tmp->lm_msgtype != LDAP_RES_SEARCH_REFERENCE
-                                       && tmp->lm_msgtype != LDAP_RES_INTERMEDIATE )
-                               {
-                                       break;
+                       if ( lm->lm_chain == NULL ) {
+                               if ((lm->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
+                                       (lm->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
+                                       (lm->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
+                                       tmp = NULL;
+                               } else {
+                                       tmp = lm;
+                               }
+                       } else {
+                               if ((lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               == LDAP_RES_SEARCH_ENTRY) ||
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               == LDAP_RES_SEARCH_REFERENCE) ||
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               == LDAP_RES_INTERMEDIATE)) {
+                                       tmp = NULL;
+                               } else {
+                                       tmp = lm->lm_chain_tail->lm_chain;
                                }
                        }
 
@@ -365,7 +377,7 @@ try_read1msg(
        LDAPMessage **result )
 {
        BerElement      *ber;
-       LDAPMessage     *new, *l, *prev, *tmp;
+       LDAPMessage     *new, *l, *prev, *tmp, *chain_head;
        ber_int_t       id;
        ber_tag_t       tag;
        ber_len_t       len;
@@ -758,8 +770,11 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
                                firstmsg = 0;
                                new->lm_next = ld->ld_responses;
                                ld->ld_responses = new;
+                               new->lm_chain_tail = new;
+                               chain_head = new;
                        } else {
                                tmp->lm_chain = new;
+                               chain_head->lm_chain_tail = tmp;
                        }
                        tmp = new;
                        /* "ok" means there's more to parse */
@@ -781,6 +796,7 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
                 * first response off the head of the chain.
                 */
                        tmp->lm_chain = new;
+                       chain_head->lm_chain_tail = tmp;
                        *result = chkResponseList( ld, msgid, all );
                        ld->ld_errno = LDAP_SUCCESS;
                        return( (*result)->lm_msgtype );
@@ -824,6 +840,7 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
 
                new->lm_next = ld->ld_responses;
                ld->ld_responses = new;
+               new->lm_chain_tail = new;
                goto exit;
        }
 
@@ -831,13 +848,31 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
            (long) new->lm_msgid, (long) new->lm_msgtype, 0 );
 
        /* part of a search response - add to end of list of entries */
-       for ( tmp = l; (tmp->lm_chain != NULL) &&
-               ((tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
-                (tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
-                        (tmp->lm_chain->lm_msgtype == LDAP_RES_INTERMEDIATE ));
-           tmp = tmp->lm_chain )
-               ;       /* NULL */
-       tmp->lm_chain = new;
+       if (l->lm_chain == NULL) {
+               if ((l->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
+                       (l->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
+                       (l->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
+                       /* do not advance lm_chain_tail in this case */
+                       l->lm_chain = new;
+               } else {
+                       /*FIXME: ldap_msgfree( l );*/
+                       l = new;
+                       l->lm_chain_tail = new;
+               }
+       } else {
+               if ((l->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_ENTRY) ||
+                       (l->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_REFERENCE) ||
+                       (l->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_INTERMEDIATE)) {
+                       l->lm_chain_tail->lm_chain->lm_chain = new;
+                       l->lm_chain_tail = l->lm_chain_tail->lm_chain;
+               } else {
+                       /*FIXME: ldap_msgfree( l->lm_chain_tail->lm_chain );*/
+                       l->lm_chain_tail->lm_chain = new;
+               }
+       }
 
        /* return the whole chain if that's what we were looking for */
        if ( foundit ) {