Mercurial > dovecot > core-2.2
changeset 12989:fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 04 May 2011 11:43:16 +0200 |
parents | bf0a80c91536 |
children | c9b7e829c6a9 |
files | src/lib-storage/index/index-sort.c src/lib-storage/mail-storage.h |
diffstat | 2 files changed, 46 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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 */