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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
355
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
356 if (program->context != NULL)
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
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 }