ITS#2494 sort entries ahead of everything else

This commit is contained in:
Howard Chu 2003-12-07 11:15:22 +00:00
parent be1a728c5b
commit 7fedf13e02
2 changed files with 38 additions and 22 deletions

View File

@ -92,20 +92,36 @@ ldap_sort_entries(
int (*cmp) (LDAP_CONST char *, LDAP_CONST char *)
)
{
int i, count;
int i, count = 0;
struct entrything *et;
LDAPMessage *e, *last;
LDAPMessage *e, *ehead = NULL, *etail = NULL;
LDAPMessage *ohead = NULL, *otail = NULL;
LDAPMessage **ep;
assert( ld != NULL );
count = ldap_count_entries( ld, *chain );
/* Separate entries from non-entries */
for ( e = *chain; e; e=e->lm_chain ) {
if ( e->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
count++;
if ( !ehead ) ehead = e;
if ( etail ) etail->lm_chain = e;
etail = e;
} else {
if ( !ohead ) ohead = e;
if ( otail ) otail->lm_chain = e;
otail = e;
}
}
if ( count < 0 ) {
return -1;
} else if ( count < 2 ) {
if ( count < 2 ) {
/* zero or one entries -- already sorted! */
if ( ehead ) {
etail->lm_chain = ohead;
*chain = ehead;
} else {
*chain = ohead;
}
return 0;
}
@ -115,7 +131,7 @@ ldap_sort_entries(
return( -1 );
}
e = *chain;
e = ehead;
for ( i = 0; i < count; i++ ) {
et[i].et_cmp_fn = cmp;
et[i].et_msg = e;
@ -131,7 +147,6 @@ ldap_sort_entries(
e = e->lm_chain;
}
last = e;
qsort( et, count, sizeof(struct entrything), et_cmp );
@ -142,7 +157,8 @@ ldap_sort_entries(
LDAP_VFREE( et[i].et_vals );
}
*ep = last;
*ep = ohead;
LDAP_FREE( (char *) et );
return( 0 );

View File

@ -93,6 +93,9 @@ result: 0 Success
# requesting: 1.1
#
# University of Michigan, US
dn: o=University of Michigan,c=US
# search reference
ref: ldap://hostA/o=abc,c=us??base
ref: ldap://hostB/o=ABC,c=US??base
@ -100,9 +103,6 @@ ref: ldap://hostB/o=ABC,c=US??base
# search reference
ref: ldap://hostC/o=xyz,c=us??base
# University of Michigan, US
dn: o=University of Michigan,c=US
# search result
search: 2
result: 0 Success
@ -118,6 +118,15 @@ result: 0 Success
# requesting: 1.1
#
# Manager, University of Michigan, US
dn: cn=Manager,o=University of Michigan,c=US
# University of Michigan, US
dn: o=University of Michigan,c=US
# US
dn: c=US
# search reference
ref: ldap://hostA/o=abc,c=us??sub
ref: ldap://hostB/o=ABC,c=US??sub
@ -125,15 +134,6 @@ ref: ldap://hostB/o=ABC,c=US??sub
# search reference
ref: ldap://hostC/o=xyz,c=us??sub
# US
dn: c=US
# University of Michigan, US
dn: o=University of Michigan,c=US
# Manager, University of Michigan, US
dn: cn=Manager,o=University of Michigan,c=US
# search result
search: 2
result: 0 Success