annotate src/lib-storage/index/index-sort.c @ 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 44d0474a451e
children d686decbc1a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12822
44d0474a451e Updated copyright notices to include year 2011.
Timo Sirainen <tss@iki.fi>
parents: 12573
diff changeset
1 /* Copyright (c) 2006-2011 Dovecot authors, see the included COPYING file */
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
2
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
3 #include "lib.h"
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
4 #include "array.h"
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
5 #include "str.h"
6135
bc0f8a8397a3 Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
6 #include "unichar.h"
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
7 #include "message-address.h"
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
8 #include "message-header-decode.h"
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
9 #include "imap-base-subject.h"
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
10 #include "index-storage.h"
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
11 #include "index-sort-private.h"
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
12
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
13 #include <stdlib.h>
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
14
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
15 struct mail_sort_node_date {
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
16 uint32_t seq;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
17 time_t date;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
18 };
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
19 ARRAY_DEFINE_TYPE(mail_sort_node_date, struct mail_sort_node_date);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
20
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
21 struct mail_sort_node_size {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
22 uint32_t seq;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
23 uoff_t size;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
24 };
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
25 ARRAY_DEFINE_TYPE(mail_sort_node_size, struct mail_sort_node_size);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
26
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
27 struct mail_sort_node_float {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
28 uint32_t seq;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
29 float num;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
30 };
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
31 ARRAY_DEFINE_TYPE(mail_sort_node_float, struct mail_sort_node_float);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
32
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
33 struct sort_cmp_context {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
34 struct mail_search_sort_program *program;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
35 struct mail *mail;
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
36 bool reverse;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
37 };
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
38
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
39 static struct sort_cmp_context static_node_cmp_context;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
40
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
41 static void
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
42 index_sort_list_add_arrival(struct mail_search_sort_program *program,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
43 struct mail *mail)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
44 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
45 ARRAY_TYPE(mail_sort_node_date) *nodes = program->context;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
46 struct mail_sort_node_date *node;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
47
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
48 node = array_append_space(nodes);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
49 node->seq = mail->seq;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
50 if (mail_get_received_date(mail, &node->date) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
51 node->date = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
52 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
53
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
54 static void
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
55 index_sort_list_add_date(struct mail_search_sort_program *program,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
56 struct mail *mail)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
57 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
58 ARRAY_TYPE(mail_sort_node_date) *nodes = program->context;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
59 struct mail_sort_node_date *node;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
60
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
61 node = array_append_space(nodes);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
62 node->seq = mail->seq;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
63 if (mail_get_date(mail, &node->date, NULL) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
64 node->date = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
65 else if (node->date == 0) {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
66 if (mail_get_received_date(mail, &node->date) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
67 node->date = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
68 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
69 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
70
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
71 static void
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
72 index_sort_list_add_size(struct mail_search_sort_program *program,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
73 struct mail *mail)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
74 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
75 ARRAY_TYPE(mail_sort_node_size) *nodes = program->context;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
76 struct mail_sort_node_size *node;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
77
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
78 node = array_append_space(nodes);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
79 node->seq = mail->seq;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
80 if (mail_get_virtual_size(mail, &node->size) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
81 node->size = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
82 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
83
12989
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
84 static uoff_t index_sort_get_pop3_order(struct mail *mail)
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
85 {
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
86 const char *str;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
87 uoff_t size;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
88
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
89 if (mail_get_special(mail, MAIL_FETCH_POP3_ORDER, &str) < 0 ||
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
90 str_to_uoff(str, &size) < 0)
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
91 return (uint32_t)-1;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
92 else
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
93 return size;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
94 }
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
95
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
96 static void
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
97 index_sort_list_add_pop3_order(struct mail_search_sort_program *program,
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
98 struct mail *mail)
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
99 {
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
100 ARRAY_TYPE(mail_sort_node_size) *nodes = program->context;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
101 struct mail_sort_node_size *node;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
102
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
103 node = array_append_space(nodes);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
104 node->seq = mail->seq;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
105 node->size = index_sort_get_pop3_order(mail);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
106 }
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
107
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
108 static float index_sort_get_score(struct mail *mail)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
109 {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
110 const char *str;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
111
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
112 if (mail_get_special(mail, MAIL_FETCH_SEARCH_SCORE, &str) < 0)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
113 return 0;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
114 else
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
115 return strtod(str, NULL);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
116 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
117
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
118 static void
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
119 index_sort_list_add_score(struct mail_search_sort_program *program,
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
120 struct mail *mail)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
121 {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
122 ARRAY_TYPE(mail_sort_node_float) *nodes = program->context;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
123 struct mail_sort_node_float *node;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
124
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
125 node = array_append_space(nodes);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
126 node->seq = mail->seq;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
127 node->num = index_sort_get_score(mail);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
128 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
129
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
130 void index_sort_list_add(struct mail_search_sort_program *program,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
131 struct mail *mail)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
132 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
133 i_assert(mail->transaction == program->t);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
134
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
135 program->sort_list_add(program, mail);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
136 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
137
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
138 static int sort_node_date_cmp(const struct mail_sort_node_date *n1,
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
139 const struct mail_sort_node_date *n2)
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
140 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
141 struct sort_cmp_context *ctx = &static_node_cmp_context;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
142
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
143 if (n1->date < n2->date)
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
144 return !ctx->reverse ? -1 : 1;
7855
b5a6e6783786 Message sorting by date, arrival or size was broken.
Timo Sirainen <tss@iki.fi>
parents: 7564
diff changeset
145 if (n1->date > n2->date)
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
146 return !ctx->reverse ? 1 : -1;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
147
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
148 return index_sort_node_cmp_type(ctx->mail,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
149 ctx->program->sort_program + 1,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
150 n1->seq, n2->seq);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
151 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
152
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
153 static void
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
154 index_sort_list_finish_date(struct mail_search_sort_program *program)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
155 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
156 ARRAY_TYPE(mail_sort_node_date) *nodes = program->context;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
157
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
158 array_sort(nodes, sort_node_date_cmp);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
159 memcpy(&program->seqs, nodes, sizeof(program->seqs));
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
160 i_free(nodes);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
161 program->context = NULL;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
162 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
163
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
164 static int sort_node_size_cmp(const struct mail_sort_node_size *n1,
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
165 const struct mail_sort_node_size *n2)
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
166 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
167 struct sort_cmp_context *ctx = &static_node_cmp_context;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
168
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
169 if (n1->size < n2->size)
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
170 return !ctx->reverse ? -1 : 1;
7855
b5a6e6783786 Message sorting by date, arrival or size was broken.
Timo Sirainen <tss@iki.fi>
parents: 7564
diff changeset
171 if (n1->size > n2->size)
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
172 return !ctx->reverse ? 1 : -1;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
173
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
174 return index_sort_node_cmp_type(ctx->mail,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
175 ctx->program->sort_program + 1,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
176 n1->seq, n2->seq);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
177 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
178
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
179 static void
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
180 index_sort_list_finish_size(struct mail_search_sort_program *program)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
181 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
182 ARRAY_TYPE(mail_sort_node_size) *nodes = program->context;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
183
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
184 array_sort(nodes, sort_node_size_cmp);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
185 memcpy(&program->seqs, nodes, sizeof(program->seqs));
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
186 i_free(nodes);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
187 program->context = NULL;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
188 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
189
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
190 static int sort_node_float_cmp(const struct mail_sort_node_float *n1,
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
191 const struct mail_sort_node_float *n2)
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
192 {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
193 struct sort_cmp_context *ctx = &static_node_cmp_context;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
194
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
195 if (n1->num < n2->num)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
196 return !ctx->reverse ? -1 : 1;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
197 if (n1->num > n2->num)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
198 return !ctx->reverse ? 1 : -1;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
199
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
200 return index_sort_node_cmp_type(ctx->mail,
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
201 ctx->program->sort_program + 1,
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
202 n1->seq, n2->seq);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
203 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
204
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
205 static void
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
206 index_sort_list_finish_float(struct mail_search_sort_program *program)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
207 {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
208 ARRAY_TYPE(mail_sort_node_float) *nodes = program->context;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
209
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
210 array_sort(nodes, sort_node_float_cmp);
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
211 memcpy(&program->seqs, nodes, sizeof(program->seqs));
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
212 i_free(nodes);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
213 program->context = NULL;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
214 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
215
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
216 void index_sort_list_finish(struct mail_search_sort_program *program)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
217 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
218 memset(&static_node_cmp_context, 0, sizeof(static_node_cmp_context));
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
219 static_node_cmp_context.program = program;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
220 static_node_cmp_context.mail = program->temp_mail;
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
221 static_node_cmp_context.reverse =
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
222 (program->sort_program[0] & MAIL_SORT_FLAG_REVERSE) != 0;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
223
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
224 program->sort_list_finish(program);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
225 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
226
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
227 bool index_sort_list_next(struct mail_search_sort_program *program,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
228 struct mail *mail)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
229 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
230 const uint32_t *seqp;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
231
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
232 if (program->iter_idx == array_count(&program->seqs))
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
233 return FALSE;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
234
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
235 seqp = array_idx(&program->seqs, program->iter_idx++);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
236 mail_set_seq(mail, *seqp);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
237 return TRUE;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
238 }
6970
891d2b36feee Don't add arrival/date/size sort IDs to index file. They can be looked up
Timo Sirainen <tss@iki.fi>
parents: 6969
diff changeset
239
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
240 struct mail_search_sort_program *
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
241 index_sort_program_init(struct mailbox_transaction_context *t,
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
242 const enum mail_sort_type *sort_program)
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
243 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
244 struct mail_search_sort_program *program;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
245 unsigned int i;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
246
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
247 if (sort_program == NULL || sort_program[0] == MAIL_SORT_END)
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
248 return NULL;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
249
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
250 /* we support internal sorting by the primary condition */
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
251 program = i_new(struct mail_search_sort_program, 1);
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
252 program->t = t;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
253 program->temp_mail = mail_alloc(t, 0, NULL);
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
254
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
255 for (i = 0; i < MAX_SORT_PROGRAM_SIZE; i++) {
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
256 program->sort_program[i] = sort_program[i];
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
257 if (sort_program[i] == MAIL_SORT_END)
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
258 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
259 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
260 if (i == MAX_SORT_PROGRAM_SIZE)
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
261 i_panic("index_sort_program_init(): Invalid sort program");
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
262
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
263 switch (program->sort_program[0] & MAIL_SORT_MASK) {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
264 case MAIL_SORT_ARRIVAL:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
265 case MAIL_SORT_DATE: {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
266 ARRAY_TYPE(mail_sort_node_date) *nodes;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
267
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
268 nodes = i_malloc(sizeof(*nodes));
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
269 i_array_init(nodes, 128);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
270
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
271 if ((program->sort_program[0] &
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
272 MAIL_SORT_MASK) == MAIL_SORT_ARRIVAL)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
273 program->sort_list_add = index_sort_list_add_arrival;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
274 else
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
275 program->sort_list_add = index_sort_list_add_date;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
276 program->sort_list_finish = index_sort_list_finish_date;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
277 program->context = nodes;
6970
891d2b36feee Don't add arrival/date/size sort IDs to index file. They can be looked up
Timo Sirainen <tss@iki.fi>
parents: 6969
diff changeset
278 break;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
279 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
280 case MAIL_SORT_SIZE: {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
281 ARRAY_TYPE(mail_sort_node_size) *nodes;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
282
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
283 nodes = i_malloc(sizeof(*nodes));
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
284 i_array_init(nodes, 128);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
285 program->sort_list_add = index_sort_list_add_size;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
286 program->sort_list_finish = index_sort_list_finish_size;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
287 program->context = nodes;
6970
891d2b36feee Don't add arrival/date/size sort IDs to index file. They can be looked up
Timo Sirainen <tss@iki.fi>
parents: 6969
diff changeset
288 break;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
289 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
290 case MAIL_SORT_CC:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
291 case MAIL_SORT_FROM:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
292 case MAIL_SORT_SUBJECT:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
293 case MAIL_SORT_TO:
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
294 case MAIL_SORT_DISPLAYFROM:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
295 case MAIL_SORT_DISPLAYTO:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
296 program->sort_list_add = index_sort_list_add_string;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
297 program->sort_list_finish = index_sort_list_finish_string;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
298 index_sort_list_init_string(program);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
299 break;
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
300 case MAIL_SORT_SEARCH_SCORE: {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
301 ARRAY_TYPE(mail_sort_node_float) *nodes;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
302
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
303 nodes = i_malloc(sizeof(*nodes));
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
304 i_array_init(nodes, 128);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
305 program->sort_list_add = index_sort_list_add_score;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
306 program->sort_list_finish = index_sort_list_finish_float;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
307 program->context = nodes;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
308 break;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
309 }
12989
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
310 case MAIL_SORT_POP3_ORDER: {
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
311 ARRAY_TYPE(mail_sort_node_size) *nodes;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
312
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
313 nodes = i_malloc(sizeof(*nodes));
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
314 i_array_init(nodes, 128);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
315 program->sort_list_add = index_sort_list_add_pop3_order;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
316 program->sort_list_finish = index_sort_list_finish_size;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
317 program->context = nodes;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
318 break;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
319 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
320 default:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
321 i_unreached();
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
322 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
323 return program;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
324 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
325
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
326 void index_sort_program_deinit(struct mail_search_sort_program **_program)
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
327 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
328 struct mail_search_sort_program *program = *_program;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
329
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
330 *_program = NULL;
7956
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
331
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
332 if (program->context != NULL)
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
333 index_sort_list_finish(program);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
334 mail_free(&program->temp_mail);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
335 array_free(&program->seqs);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
336 i_free(program);
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
337 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
338
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
339 static int
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
340 get_first_addr(struct mail *mail, const char *header,
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
341 struct message_address **addr_r)
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
342 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
343 const char *str;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
344 int ret;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
345
12573
6813e76eb29e lib-storage: Don't double-demimefy headers when DISPLAYFROM/DISPLAYTO sorting.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
346 if ((ret = mail_get_first_header(mail, header, &str)) <= 0) {
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
347 *addr_r = NULL;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
348 return ret;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
349 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
350
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
351 *addr_r = message_address_parse(pool_datastack_create(),
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
352 (const unsigned char *)str,
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
353 strlen(str), 1, TRUE);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
354 return 0;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
355 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
356
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
357 static int
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
358 get_first_mailbox(struct mail *mail, const char *header, const char **mailbox_r)
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
359 {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
360 struct message_address *addr;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
361
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
362 if (get_first_addr(mail, header, &addr) < 0) {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
363 *mailbox_r = "";
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
364 return -1;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
365 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
366 *mailbox_r = addr != NULL && addr->mailbox != NULL ? addr->mailbox : "";
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
367 return 0;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
368 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
369
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
370 static int
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
371 get_display_name(struct mail *mail, const char *header, const char **name_r)
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
372 {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
373 struct message_address *addr;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
374
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
375 *name_r = "";
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
376
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
377 if (get_first_addr(mail, header, &addr) < 0)
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
378 return -1;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
379 if (addr == NULL)
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
380 return 0;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
381
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
382 if (addr->name != NULL) {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
383 string_t *str;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
384 unsigned int len = strlen(addr->name);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
385
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
386 str = t_str_new(len*2);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
387 (void)message_header_decode_utf8(
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
388 (const unsigned char *)addr->name, len, str, FALSE);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
389 if (str_len(str) > 0) {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
390 *name_r = str_c(str);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
391 return 0;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
392 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
393 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
394 if (addr->mailbox != NULL && addr->domain != NULL)
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
395 *name_r = t_strconcat(addr->mailbox, "@", addr->domain, NULL);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
396 else if (addr->mailbox != NULL)
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
397 *name_r = addr->mailbox;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
398 return 0;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
399 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
400
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
401 int index_sort_header_get(struct mail *mail, uint32_t seq,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
402 enum mail_sort_type sort_type, string_t *dest)
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
403 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
404 const char *str;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
405 int ret;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
406
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
407 mail_set_seq(mail, seq);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
408 str_truncate(dest, 0);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
409
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
410 switch (sort_type & MAIL_SORT_MASK) {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
411 case MAIL_SORT_SUBJECT:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
412 if ((ret = mail_get_first_header(mail, "Subject", &str)) <= 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
413 return ret;
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
414 str = imap_get_base_subject_cased(pool_datastack_create(),
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
415 str, NULL);
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
416 str_append(dest, str);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
417 return 0;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
418 case MAIL_SORT_CC:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
419 ret = get_first_mailbox(mail, "Cc", &str);
6135
bc0f8a8397a3 Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
420 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
421 case MAIL_SORT_FROM:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
422 ret = get_first_mailbox(mail, "From", &str);
6135
bc0f8a8397a3 Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
423 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
424 case MAIL_SORT_TO:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
425 ret = get_first_mailbox(mail, "To", &str);
6135
bc0f8a8397a3 Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
426 break;
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
427 case MAIL_SORT_DISPLAYFROM:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
428 ret = get_display_name(mail, "From", &str);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
429 break;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
430 case MAIL_SORT_DISPLAYTO:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
431 ret = get_display_name(mail, "To", &str);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
432 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
433 default:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
434 i_unreached();
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
435 }
6135
bc0f8a8397a3 Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
436
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
437 (void)uni_utf8_to_decomposed_titlecase(str, (size_t)-1, dest);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
438 return ret;
6547
7a207cbc008b Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents: 6546
diff changeset
439 }
7a207cbc008b Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents: 6546
diff changeset
440
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
441 int index_sort_node_cmp_type(struct mail *mail,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
442 const enum mail_sort_type *sort_program,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
443 uint32_t seq1, uint32_t seq2)
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
444 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
445 enum mail_sort_type sort_type;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
446 time_t time1, time2;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
447 uoff_t size1, size2;
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
448 float float1, float2;
4935
f768dd773e6b Compiler warning fix
Timo Sirainen <tss@iki.fi>
parents: 4635
diff changeset
449 int ret = 0;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
450
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
451 sort_type = *sort_program & MAIL_SORT_MASK;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
452 switch (sort_type) {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
453 case MAIL_SORT_CC:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
454 case MAIL_SORT_FROM:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
455 case MAIL_SORT_TO:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
456 case MAIL_SORT_SUBJECT:
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
457 case MAIL_SORT_DISPLAYFROM:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
458 case MAIL_SORT_DISPLAYTO:
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7201
diff changeset
459 T_BEGIN {
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
460 string_t *str1, *str2;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
461
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
462 str1 = t_str_new(256);
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
463 str2 = t_str_new(256);
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
464 index_sort_header_get(mail, seq1, sort_type, str1);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
465 index_sort_header_get(mail, seq2, sort_type, str2);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6711
diff changeset
466
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
467 ret = strcmp(str_c(str1), str_c(str2));
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7201
diff changeset
468 } T_END;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
469 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
470 case MAIL_SORT_ARRIVAL:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
471 mail_set_seq(mail, seq1);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
472 if (mail_get_received_date(mail, &time1) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
473 time1 = 0;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
474
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
475 mail_set_seq(mail, seq2);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
476 if (mail_get_received_date(mail, &time2) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
477 time1 = 0;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
478
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
479 ret = time1 < time2 ? -1 :
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
480 (time1 > time2 ? 1 : 0);
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
481 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
482 case MAIL_SORT_DATE:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
483 mail_set_seq(mail, seq1);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
484 if (mail_get_date(mail, &time1, NULL) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
485 time1 = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
486 else if (time1 == 0) {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
487 if (mail_get_received_date(mail, &time1) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
488 time1 = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
489 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
490
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
491 mail_set_seq(mail, seq2);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
492 if (mail_get_date(mail, &time2, NULL) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
493 time2 = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
494 else if (time2 == 0) {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
495 if (mail_get_received_date(mail, &time2) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
496 time2 = 0;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
497 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
498
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
499 ret = time1 < time2 ? -1 :
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
500 (time1 > time2 ? 1 : 0);
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
501 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
502 case MAIL_SORT_SIZE:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
503 mail_set_seq(mail, seq1);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
504 if (mail_get_virtual_size(mail, &size1) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
505 size1 = 0;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
506
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
507 mail_set_seq(mail, seq2);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
508 if (mail_get_virtual_size(mail, &size2) < 0)
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
509 size2 = 0;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
510
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
511 ret = size1 < size2 ? -1 :
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
512 (size1 > size2 ? 1 : 0);
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
513 break;
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
514 case MAIL_SORT_SEARCH_SCORE:
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
515 mail_set_seq(mail, seq1);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
516 float1 = index_sort_get_score(mail);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
517 mail_set_seq(mail, seq2);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
518 float2 = index_sort_get_score(mail);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
519
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
520 ret = float1 < float2 ? -1 :
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
521 (float1 > float2 ? 1 : 0);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
522 break;
12989
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
523 case MAIL_SORT_POP3_ORDER:
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
524 /* 32bit numbers would be enough, but since there is already
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
525 existing code for uoff_t in sizes, just use them. */
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
526 mail_set_seq(mail, seq1);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
527 size1 = index_sort_get_pop3_order(mail);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
528 mail_set_seq(mail, seq2);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
529 size2 = index_sort_get_pop3_order(mail);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
530
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
531 ret = size1 < size2 ? -1 :
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
532 (size1 > size2 ? 1 : 0);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
533 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
534 case MAIL_SORT_END:
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
535 return seq1 < seq2 ? -1 :
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
536 (seq1 > seq2 ? 1 : 0);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
537 case MAIL_SORT_MASK:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
538 case MAIL_SORT_FLAG_REVERSE:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
539 i_unreached();
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
540 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
541
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
542 if (ret == 0) {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
543 return index_sort_node_cmp_type(mail, sort_program+1,
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
544 seq1, seq2);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
545 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
546
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
547 if ((*sort_program & MAIL_SORT_FLAG_REVERSE) != 0)
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
548 ret = ret < 0 ? 1 : -1;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
549 return ret;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
550 }