mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-26 01:29:59 -05:00
Patch for fast synchronous search result processing
This commit is contained in:
parent
54f6cf0b2c
commit
331074b2d5
4 changed files with 94 additions and 32 deletions
|
|
@ -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 ) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue