From 331074b2d56c724f48ba7d42cb196044b01dc3f7 Mon Sep 17 00:00:00 2001 From: Jong Hyuk Choi Date: Mon, 18 Oct 2004 04:58:36 +0000 Subject: [PATCH] Patch for fast synchronous search result processing --- libraries/libldap/addentry.c | 10 ++++-- libraries/libldap/error.c | 52 ++++++++++++++++++++--------- libraries/libldap/ldap-int.h | 1 + libraries/libldap/result.c | 63 ++++++++++++++++++++++++++++-------- 4 files changed, 94 insertions(+), 32 deletions(-) diff --git a/libraries/libldap/addentry.c b/libraries/libldap/addentry.c index c7c83cf932..8787dfc256 100644 --- a/libraries/libldap/addentry.c +++ b/libraries/libldap/addentry.c @@ -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; } diff --git a/libraries/libldap/error.c b/libraries/libldap/error.c index b2be1dd668..2388238558 100644 --- a/libraries/libldap/error.c +++ b/libraries/libldap/error.c @@ -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; + } } } } diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index 844fd4cdc2..b83c6ca293 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -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 */ }; diff --git a/libraries/libldap/result.c b/libraries/libldap/result.c index dd41a27a9c..6ee244e9dd 100644 --- a/libraries/libldap/result.c +++ b/libraries/libldap/result.c @@ -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 ) { -- 2.39.5