mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-15 03:01:09 +08:00
ITS#2494 sort entries ahead of everything else
This commit is contained in:
parent
be1a728c5b
commit
7fedf13e02
@ -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 );
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user