Commit 331074b2 authored by Jong Hyuk Choi's avatar Jong Hyuk Choi
Browse files

Patch for fast synchronous search result processing

parent 54f6cf0b
......@@ -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;
}
......@@ -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;
}
}
}
}
......
......@@ -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 */
};
......
......@@ -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 ) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment