dovecot-2.0: lib-storage: Added MAIL_SORT_POP3_ORDER

dovecot at dovecot.org dovecot at dovecot.org
Wed May 4 12:44:27 EEST 2011


details:   http://hg.dovecot.org/dovecot-2.0/rev/fac2d4fe86b1
changeset: 12767:fac2d4fe86b1
user:      Timo Sirainen <tss at iki.fi>
date:      Wed May 04 11:43:16 2011 +0200
description:
lib-storage: Added MAIL_SORT_POP3_ORDER

diffstat:

 src/lib-storage/index/index-sort.c |  45 ++++++++++++++++++++++++++++++++++++++
 src/lib-storage/mail-storage.h     |   1 +
 2 files changed, 46 insertions(+), 0 deletions(-)

diffs (80 lines):

diff -r bf0a80c91536 -r fac2d4fe86b1 src/lib-storage/index/index-sort.c
--- a/src/lib-storage/index/index-sort.c	Wed May 04 11:42:17 2011 +0200
+++ b/src/lib-storage/index/index-sort.c	Wed May 04 11:43:16 2011 +0200
@@ -81,6 +81,30 @@
 		node->size = 0;
 }
 
+static uoff_t index_sort_get_pop3_order(struct mail *mail)
+{
+	const char *str;
+	uoff_t size;
+
+	if (mail_get_special(mail, MAIL_FETCH_POP3_ORDER, &str) < 0 ||
+	    str_to_uoff(str, &size) < 0)
+		return (uint32_t)-1;
+	else
+		return size;
+}
+
+static void
+index_sort_list_add_pop3_order(struct mail_search_sort_program *program,
+			       struct mail *mail)
+{
+	ARRAY_TYPE(mail_sort_node_size) *nodes = program->context;
+	struct mail_sort_node_size *node;
+
+	node = array_append_space(nodes);
+	node->seq = mail->seq;
+	node->size = index_sort_get_pop3_order(mail);
+}
+
 static float index_sort_get_score(struct mail *mail)
 {
 	const char *str;
@@ -283,6 +307,16 @@
 		program->context = nodes;
 		break;
 	}
+	case MAIL_SORT_POP3_ORDER: {
+		ARRAY_TYPE(mail_sort_node_size) *nodes;
+
+		nodes = i_malloc(sizeof(*nodes));
+		i_array_init(nodes, 128);
+		program->sort_list_add = index_sort_list_add_pop3_order;
+		program->sort_list_finish = index_sort_list_finish_size;
+		program->context = nodes;
+		break;
+	}
 	default:
 		i_unreached();
 	}
@@ -486,6 +520,17 @@
 		ret = float1 < float2 ? -1 :
 			(float1 > float2 ? 1 : 0);
 		break;
+	case MAIL_SORT_POP3_ORDER:
+		/* 32bit numbers would be enough, but since there is already
+		   existing code for uoff_t in sizes, just use them. */
+		mail_set_seq(mail, seq1);
+		size1 = index_sort_get_pop3_order(mail);
+		mail_set_seq(mail, seq2);
+		size2 = index_sort_get_pop3_order(mail);
+
+		ret = size1 < size2 ? -1 :
+			(size1 > size2 ? 1 : 0);
+		break;
 	case MAIL_SORT_END:
 		return seq1 < seq2 ? -1 :
 			(seq1 > seq2 ? 1 : 0);
diff -r bf0a80c91536 -r fac2d4fe86b1 src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h	Wed May 04 11:42:17 2011 +0200
+++ b/src/lib-storage/mail-storage.h	Wed May 04 11:43:16 2011 +0200
@@ -92,6 +92,7 @@
 	MAIL_SORT_SEARCH_SCORE	= 0x0080,
 	MAIL_SORT_DISPLAYFROM	= 0x0100,
 	MAIL_SORT_DISPLAYTO	= 0x0200,
+	MAIL_SORT_POP3_ORDER	= 0x0400,
 
 	MAIL_SORT_MASK		= 0x0fff,
 	MAIL_SORT_FLAG_REVERSE	= 0x1000, /* reverse this mask type */


More information about the dovecot-cvs mailing list