Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/index-sort.c @ 21599:a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
All errors were treated the same as if message had been expunged. This
caused potentially wrong results to be sent to the client without any
indication that they're wrong.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Fri, 17 Feb 2017 18:19:46 +0200 |
parents | 2e2563132d5f |
children | fb8ef6e2c2fe |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2006-2017 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 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
14 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
|
15 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
|
16 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
|
17 }; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
18 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
|
19 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
20 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
|
21 uint32_t seq; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
22 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
|
23 }; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
24 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
|
25 |
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
|
26 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
|
27 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
|
28 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
|
29 }; |
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 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
|
31 |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
32 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
|
33 struct mail_search_sort_program *program; |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
34 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
|
35 }; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
36 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
37 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
|
38 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
39 static void |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
40 index_sort_program_set_mail_failed(struct mail_search_sort_program *program, |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
41 struct mail *mail) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
42 { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
43 if (mailbox_get_last_mail_error(mail->box) != MAIL_ERROR_EXPUNGED) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
44 program->failed = TRUE; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
45 } |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
46 |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
47 static void |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
48 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
|
49 struct mail *mail) |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
50 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
51 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
|
52 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
|
53 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
54 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
|
55 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
56 if (mail_get_received_date(mail, &node->date) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
57 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
58 node->date = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
59 } |
7564
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 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
62 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
63 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
|
64 struct mail *mail) |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
65 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
66 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
|
67 struct mail_sort_node_date *node; |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
68 int tz; |
7564
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 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
|
71 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
72 if (mail_get_date(mail, &node->date, &tz) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
73 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
74 node->date = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
75 } else if (node->date == 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
76 if (mail_get_received_date(mail, &node->date) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
77 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
78 node->date = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
79 } |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
80 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
81 } |
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 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
84 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
|
85 struct mail *mail) |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
86 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
87 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
|
88 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
|
89 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
90 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
|
91 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
92 if (mail_get_virtual_size(mail, &node->size) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
93 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
94 node->size = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
95 } |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
96 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
97 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
98 static int index_sort_get_pop3_order(struct mail *mail, uoff_t *size_r) |
12989
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 const char *str; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
101 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
102 if (mail_get_special(mail, MAIL_FETCH_POP3_ORDER, &str) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
103 *size_r = (uint32_t)-1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
104 return -1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
105 } |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
106 |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
107 if (str_to_uoff(str, size_r) < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
108 *size_r = (uint32_t)-1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
109 return 0; |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
110 } |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
111 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
112 static void |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
113 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
|
114 struct mail *mail) |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
115 { |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
116 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
|
117 struct mail_sort_node_size *node; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
118 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
119 node = array_append_space(nodes); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
120 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
121 (void)index_sort_get_pop3_order(mail, &node->size); |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
122 } |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
123 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
124 static int index_sort_get_relevancy(struct mail *mail, float *result_r) |
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
|
125 { |
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 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
|
127 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
128 if (mail_get_special(mail, MAIL_FETCH_SEARCH_RELEVANCY, &str) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
129 *result_r = 0; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
130 return -1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
131 } |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
132 *result_r = strtod(str, NULL); |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
133 return 0; |
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
|
134 } |
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
|
135 |
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
|
136 static void |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
137 index_sort_list_add_relevancy(struct mail_search_sort_program *program, |
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
138 struct mail *mail) |
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
|
139 { |
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
|
140 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
|
141 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
|
142 |
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
|
143 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
|
144 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
145 (void)index_sort_get_relevancy(mail, &node->num); |
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
|
146 } |
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
|
147 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
148 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
|
149 struct mail *mail) |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
150 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
151 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
|
152 |
12611
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12573
diff
changeset
|
153 T_BEGIN { |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12573
diff
changeset
|
154 program->sort_list_add(program, mail); |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12573
diff
changeset
|
155 } T_END; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
156 } |
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 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
|
159 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
|
160 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
161 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
|
162 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
163 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
|
164 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
|
165 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
|
166 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
|
167 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
168 return index_sort_node_cmp_type(ctx->program, |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
169 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
|
170 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
|
171 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
172 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
173 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
174 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
|
175 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
176 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
|
177 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
178 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
|
179 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
|
180 i_free(nodes); |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
181 program->context = NULL; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
182 } |
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 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
|
185 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
|
186 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
187 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
|
188 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
189 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
|
190 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
|
191 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
|
192 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
|
193 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
194 return index_sort_node_cmp_type(ctx->program, |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
195 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
|
196 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
|
197 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
198 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
199 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
200 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
|
201 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
202 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
|
203 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
204 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
|
205 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
|
206 i_free(nodes); |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
207 program->context = NULL; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
208 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
209 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
210 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
|
211 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
|
212 { |
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 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
|
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 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
|
216 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
|
217 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
|
218 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
|
219 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
220 return index_sort_node_cmp_type(ctx->program, |
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
|
221 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
|
222 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
|
223 } |
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
|
224 |
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
|
225 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
|
226 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
|
227 { |
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
|
228 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
|
229 |
13113
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
230 /* NOTE: higher relevancy is returned first, unlike with all |
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
231 other number based sort keys, so temporarily reverse the search */ |
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
232 static_node_cmp_context.reverse = !static_node_cmp_context.reverse; |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
233 array_sort(nodes, sort_node_float_cmp); |
13113
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
234 static_node_cmp_context.reverse = !static_node_cmp_context.reverse; |
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
235 |
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
|
236 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
|
237 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
|
238 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
|
239 } |
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
|
240 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
241 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
|
242 { |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21322
diff
changeset
|
243 i_zero(&static_node_cmp_context); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
244 static_node_cmp_context.program = program; |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
245 static_node_cmp_context.reverse = |
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
246 (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
|
247 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
248 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
|
249 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
250 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
251 bool index_sort_list_next(struct mail_search_sort_program *program, |
12873
b47f17b173f5
lib-storage: Search code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
252 uint32_t *seq_r) |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
253 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
254 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
|
255 |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
256 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
|
257 return FALSE; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
258 |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
259 seqp = array_idx(&program->seqs, program->iter_idx++); |
12873
b47f17b173f5
lib-storage: Search code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
260 *seq_r = *seqp; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
261 return TRUE; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
262 } |
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
|
263 |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
264 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
|
265 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
|
266 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
|
267 { |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
268 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
|
269 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
|
270 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
271 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
|
272 return NULL; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
273 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
274 /* 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
|
275 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
|
276 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
|
277 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
|
278 |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
279 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
|
280 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
|
281 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
|
282 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
283 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
284 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
|
285 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
|
286 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
287 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
|
288 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
|
289 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
|
290 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
|
291 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
292 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
|
293 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
|
294 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
295 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
|
296 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
|
297 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
|
298 else |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
299 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
|
300 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
|
301 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
|
302 break; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
303 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
304 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
|
305 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
|
306 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 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
|
311 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
|
312 break; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
313 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
314 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
|
315 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
|
316 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
|
317 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
|
318 case MAIL_SORT_DISPLAYFROM: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
319 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
|
320 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
|
321 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
|
322 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
|
323 break; |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
324 case MAIL_SORT_RELEVANCY: { |
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
|
325 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
|
326 |
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
|
327 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
|
328 i_array_init(nodes, 128); |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
329 program->sort_list_add = index_sort_list_add_relevancy; |
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
|
330 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
|
331 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
|
332 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
|
333 } |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
334 case MAIL_SORT_POP3_ORDER: { |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
335 ARRAY_TYPE(mail_sort_node_size) *nodes; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
336 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
337 nodes = i_malloc(sizeof(*nodes)); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
338 i_array_init(nodes, 128); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
339 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
|
340 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
|
341 program->context = nodes; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
342 break; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
343 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
344 default: |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
345 i_unreached(); |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
346 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
347 return program; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
348 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
349 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
350 int index_sort_program_deinit(struct mail_search_sort_program **_program) |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
351 { |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
352 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
|
353 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
354 *_program = NULL; |
7956 | 355 |
356 if (program->context != NULL) | |
357 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
|
358 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
|
359 array_free(&program->seqs); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
360 |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
361 int ret = program->failed ? -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
|
362 i_free(program); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
363 return ret; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
364 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
365 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
366 static int |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
367 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
|
368 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
|
369 { |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
370 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
|
371 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
|
372 |
12573
6813e76eb29e
lib-storage: Don't double-demimefy headers when DISPLAYFROM/DISPLAYTO sorting.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
373 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
|
374 *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
|
375 return ret; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
376 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
377 |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
378 *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
|
379 (const unsigned char *)str, |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
380 strlen(str), 1, TRUE); |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
381 return 0; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
382 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
383 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
384 static int |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
385 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
|
386 { |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
387 struct message_address *addr; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
388 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
389 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
|
390 *mailbox_r = ""; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
391 return -1; |
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 *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
|
394 return 0; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
395 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
396 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
397 static int |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
398 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
|
399 { |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
400 struct message_address *addr; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
401 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
402 *name_r = ""; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
403 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
404 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
|
405 return -1; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
406 if (addr == NULL) |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
407 return 0; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
408 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
409 if (addr->name != NULL) { |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
410 string_t *str; |
21322
5ab8dc1a4a6f
global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
411 size_t len = strlen(addr->name); |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
412 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
413 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
|
414 (void)message_header_decode_utf8( |
17322
d60c5ef63d63
message_header_decode_utf8() wasn't used correctly with NULL instead of FALSE parameter.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
415 (const unsigned char *)addr->name, len, str, NULL); |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
416 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
|
417 *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
|
418 return 0; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
419 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
420 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
421 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
|
422 *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
|
423 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
|
424 *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
|
425 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
|
426 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
427 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
428 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
|
429 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
|
430 { |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
431 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
|
432 int ret; |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
433 bool reply_or_fw; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
434 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
435 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
|
436 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
|
437 |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
438 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
|
439 case MAIL_SORT_SUBJECT: |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
440 ret = mail_get_first_header(mail, "Subject", &str); |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
441 if (ret < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
442 break; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
443 if (ret == 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
444 /* nonexistent header */ |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
445 return 1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
446 } |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
447 str = imap_get_base_subject_cased(pool_datastack_create(), |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
448 str, &reply_or_fw); |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
449 str_append(dest, str); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
450 return 1; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
451 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
|
452 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
|
453 break; |
4303
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: |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
455 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
|
456 break; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
457 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
|
458 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
|
459 break; |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
460 case MAIL_SORT_DISPLAYFROM: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
461 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
|
462 break; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
463 case MAIL_SORT_DISPLAYTO: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
464 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
|
465 break; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
466 default: |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
467 i_unreached(); |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
468 } |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
469 if (ret < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
470 if (mailbox_get_last_mail_error(mail->box) == MAIL_ERROR_EXPUNGED) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
471 return 0; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
472 return -1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
473 } |
6135
bc0f8a8397a3
Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents:
5336
diff
changeset
|
474 |
15052
d5ebec837bfd
uni_utf8_to_decomposed_titlecase(): Require input length to be exact now.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
475 (void)uni_utf8_to_decomposed_titlecase(str, strlen(str), dest); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
476 return 1; |
6547
7a207cbc008b
Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents:
6546
diff
changeset
|
477 } |
7a207cbc008b
Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents:
6546
diff
changeset
|
478 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
479 int index_sort_node_cmp_type(struct mail_search_sort_program *program, |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
480 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
|
481 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
|
482 { |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
483 struct mail *mail = program->temp_mail; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
484 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
|
485 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
|
486 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
|
487 float float1, float2; |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
488 int tz, 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
|
489 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
490 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
|
491 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
|
492 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
|
493 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
|
494 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
|
495 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
|
496 case MAIL_SORT_DISPLAYFROM: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
497 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
|
498 T_BEGIN { |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
499 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
|
500 |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
501 str1 = t_str_new(256); |
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
502 str2 = t_str_new(256); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
503 if (index_sort_header_get(mail, seq1, sort_type, str1) < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
504 index_sort_program_set_mail_failed(program, mail); |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
505 if (index_sort_header_get(mail, seq2, sort_type, str2) < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
506 index_sort_program_set_mail_failed(program, mail); |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6711
diff
changeset
|
507 |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
508 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
|
509 } 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
|
510 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
511 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
|
512 mail_set_seq(mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
513 if (mail_get_received_date(mail, &time1) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
514 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
515 time1 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
516 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
517 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
518 mail_set_seq(mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
519 if (mail_get_received_date(mail, &time2) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
520 index_sort_program_set_mail_failed(program, mail); |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
521 time2 = 0; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
522 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
523 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
524 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
|
525 (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
|
526 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
527 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
|
528 mail_set_seq(mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
529 if (mail_get_date(mail, &time1, &tz) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
530 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
531 time1 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
532 } else if (time1 == 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
533 if (mail_get_received_date(mail, &time1) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
534 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
535 time1 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
536 } |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
537 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
538 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
539 mail_set_seq(mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
540 if (mail_get_date(mail, &time2, &tz) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
541 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
542 time2 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
543 } else if (time2 == 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
544 if (mail_get_received_date(mail, &time2) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
545 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
546 time2 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
547 } |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
548 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
549 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
550 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
|
551 (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
|
552 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
553 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
|
554 mail_set_seq(mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
555 if (mail_get_virtual_size(mail, &size1) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
556 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
557 size1 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
558 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
559 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
560 mail_set_seq(mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
561 if (mail_get_virtual_size(mail, &size2) < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
562 index_sort_program_set_mail_failed(program, mail); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
563 size2 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
564 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
565 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
566 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
|
567 (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
|
568 break; |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
569 case MAIL_SORT_RELEVANCY: |
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
|
570 mail_set_seq(mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
571 if (index_sort_get_relevancy(mail, &float1) < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
572 index_sort_program_set_mail_failed(program, mail); |
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
|
573 mail_set_seq(mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
574 if (index_sort_get_relevancy(mail, &float2) < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
575 index_sort_program_set_mail_failed(program, mail); |
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
|
576 |
13113
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
577 /* NOTE: higher relevancy is returned first, unlike with all |
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
578 other number based sort keys */ |
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
579 ret = float1 < float2 ? 1 : |
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
580 (float1 > float2 ? -1 : 0); |
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
|
581 break; |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
582 case MAIL_SORT_POP3_ORDER: |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
583 /* 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
|
584 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
|
585 mail_set_seq(mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
586 if (index_sort_get_pop3_order(mail, &size1) < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
587 index_sort_program_set_mail_failed(program, mail); |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
588 mail_set_seq(mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
589 if (index_sort_get_pop3_order(mail, &size2) < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
590 index_sort_program_set_mail_failed(program, mail); |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
591 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
592 ret = size1 < size2 ? -1 : |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
593 (size1 > size2 ? 1 : 0); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
594 break; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
595 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
|
596 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
|
597 (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
|
598 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
|
599 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
|
600 i_unreached(); |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
601 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
602 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
603 if (ret == 0) { |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
604 return index_sort_node_cmp_type(program, sort_program+1, |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
605 seq1, seq2); |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
606 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
607 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
608 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
|
609 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
|
610 return ret; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
611 } |