changeset 6549:bf5293708132 HEAD

Fixed handling reversed sorts.
author Timo Sirainen <tss@iki.fi>
date Tue, 16 Oct 2007 17:58:03 +0300
parents 810ea4ef69f4
children db6afac39fde
files src/lib-storage/index/index-sort.c
diffstat 1 files changed, 6 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-sort.c	Tue Oct 16 17:40:53 2007 +0300
+++ b/src/lib-storage/index/index-sort.c	Tue Oct 16 17:58:03 2007 +0300
@@ -95,11 +95,13 @@
 	program = i_new(struct mail_search_sort_program, 1);
 	program->t = t;
 	program->temp_mail = mail_alloc(t, 0, NULL);
-	program->reverse =
-		(program->sort_program[0] & MAIL_SORT_FLAG_REVERSE) != 0;
 	i_array_init(&program->nodes, 64);
 
-	for (i = 0; i < MAX_SORT_PROGRAM_SIZE; i++) {
+	/* primary reversion isn't stored to sort_program. we handle it by
+	   iterating backwards at the end. */
+	program->reverse = (sort_program[0] & MAIL_SORT_FLAG_REVERSE) != 0;
+	program->sort_program[0] = sort_program[0] & ~MAIL_SORT_FLAG_REVERSE;
+	for (i = 1; i < MAX_SORT_PROGRAM_SIZE; i++) {
 		program->sort_program[i] = sort_program[i];
 		if (sort_program[i] == MAIL_SORT_END)
 			break;
@@ -319,6 +321,7 @@
 	if (ret == 0)
 		return sort_node_cmp_type(ctx, sort_program+1, n1, n2);
 
+	/* primary reversion isn't in sort_program */
 	if ((*sort_program & MAIL_SORT_FLAG_REVERSE) != 0)
 		ret = ret < 0 ? 1 : -1;
 	return ret;