Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/index-sort.c @ 21604:fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
This controls how many slow mail accesses sorting can perform before it
fails:
a NO [LIMIT] Requested sort would have taken too long
The SORT reply is still returned, but it's likely not correct.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Fri, 17 Feb 2017 19:07:53 +0200 |
parents | a90f51ba2e9c |
children | bcd286fcdbad |
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 { |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
43 switch (mailbox_get_last_mail_error(mail->box)) { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
44 case MAIL_ERROR_EXPUNGED: |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
45 break; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
46 case MAIL_ERROR_NOTPOSSIBLE: |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
47 /* just change the error message */ |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
48 mail_storage_set_error(program->t->box->storage, MAIL_ERROR_LIMIT, |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
49 "Requested sort would have taken too long."); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
50 /* fall through */ |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
51 default: |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
52 program->failed = TRUE; |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
53 break; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
54 } |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
55 } |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
56 |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
57 static time_t |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
58 index_sort_program_set_date_failed(struct mail_search_sort_program *program, |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
59 struct mail *mail) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
60 { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
61 index_sort_program_set_mail_failed(program, mail); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
62 |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
63 if (mailbox_get_last_mail_error(mail->box) == MAIL_ERROR_LIMIT) { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
64 /* limit reached - sort the rest of the mails at the end of |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
65 the list by their UIDs */ |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
66 return LONG_MAX; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
67 } else { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
68 /* expunged / some other error - sort in the beginning */ |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
69 return 0; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
70 } |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
71 } |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
72 |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
73 static void |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
74 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
|
75 struct mail *mail) |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
76 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
77 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
|
78 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
|
79 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
80 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
|
81 node->seq = mail->seq; |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
82 if (mail_get_received_date(mail, &node->date) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
83 node->date = index_sort_program_set_date_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
|
84 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
85 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
86 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
87 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
|
88 struct mail *mail) |
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 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
|
91 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
|
92 int tz; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
93 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
94 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
|
95 node->seq = mail->seq; |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
96 if (mail_get_date(mail, &node->date, &tz) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
97 node->date = index_sort_program_set_date_failed(program, mail); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
98 else if (node->date == 0) { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
99 if (mail_get_received_date(mail, &node->date) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
100 node->date = index_sort_program_set_date_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
|
101 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
102 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
103 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
104 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
105 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
|
106 struct mail *mail) |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
107 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
108 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
|
109 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
|
110 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
111 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
|
112 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
113 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
|
114 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
|
115 node->size = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
116 } |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
117 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
118 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
119 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
|
120 { |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
121 const char *str; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
122 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
123 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
|
124 *size_r = (uint32_t)-1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
125 return -1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
126 } |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
127 |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
128 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
|
129 *size_r = (uint32_t)-1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
130 return 0; |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
131 } |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
132 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
133 static void |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
134 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
|
135 struct mail *mail) |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
136 { |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
137 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
|
138 struct mail_sort_node_size *node; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
139 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
140 node = array_append_space(nodes); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
141 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
142 (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
|
143 } |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
144 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
145 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
|
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 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
|
148 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
149 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
|
150 *result_r = 0; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
151 return -1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
152 } |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
153 *result_r = strtod(str, NULL); |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
154 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
|
155 } |
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
|
156 |
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
|
157 static void |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
158 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
|
159 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
|
160 { |
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
|
161 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
|
162 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
|
163 |
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
|
164 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
|
165 node->seq = mail->seq; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
166 (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
|
167 } |
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
|
168 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
169 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
|
170 struct mail *mail) |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
171 { |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
172 enum mail_lookup_abort orig_abort = mail->lookup_abort; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
173 bool prev_slow = mail->mail_stream_opened || |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
174 mail->mail_metadata_accessed; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
175 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
176 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
|
177 |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
178 if (program->slow_mails_left == 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
179 mail->lookup_abort = MAIL_LOOKUP_ABORT_NOT_IN_CACHE; |
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
|
180 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
|
181 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
|
182 } T_END; |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
183 if (!prev_slow && (mail->mail_stream_opened || |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
184 mail->mail_metadata_accessed)) { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
185 i_assert(program->slow_mails_left > 0); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
186 program->slow_mails_left--; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
187 } |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
188 mail->lookup_abort = orig_abort; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
189 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
190 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
191 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
|
192 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
|
193 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
194 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
|
195 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
196 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
|
197 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
|
198 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
|
199 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
|
200 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
201 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
|
202 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
|
203 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
|
204 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
205 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
206 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
207 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
|
208 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
209 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
|
210 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
211 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
|
212 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
|
213 i_free(nodes); |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
214 program->context = NULL; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
215 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
216 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
217 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
|
218 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
|
219 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
220 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
|
221 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
222 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
|
223 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
|
224 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
|
225 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
|
226 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
227 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
|
228 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
|
229 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
|
230 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
231 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
232 static void |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
233 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
|
234 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
235 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
|
236 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
237 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
|
238 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
|
239 i_free(nodes); |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
240 program->context = NULL; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
241 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
242 |
9491
0059b2381024
Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
243 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
|
244 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
|
245 { |
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
|
246 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
|
247 |
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
|
248 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
|
249 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
|
250 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
|
251 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
|
252 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
253 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
|
254 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
|
255 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
|
256 } |
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
|
257 |
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
|
258 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
|
259 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
|
260 { |
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
|
261 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
|
262 |
13113
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
263 /* 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
|
264 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
|
265 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
|
266 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
|
267 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
|
268 |
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
|
269 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
|
270 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
|
271 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
|
272 } |
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
|
273 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
274 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
|
275 { |
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
|
276 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
|
277 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
|
278 static_node_cmp_context.reverse = |
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
279 (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
|
280 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
281 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
|
282 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
283 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
284 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
|
285 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
|
286 { |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
287 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
|
288 |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
289 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
|
290 return FALSE; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
291 |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
292 seqp = array_idx(&program->seqs, program->iter_idx++); |
12873
b47f17b173f5
lib-storage: Search code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
293 *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
|
294 return TRUE; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
295 } |
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
|
296 |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
297 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
|
298 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
|
299 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
|
300 { |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
301 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
|
302 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
|
303 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
304 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
|
305 return NULL; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
306 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
307 /* 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
|
308 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
|
309 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
|
310 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
|
311 |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
312 program->slow_mails_left = |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
313 program->t->box->storage->set->mail_sort_max_read_count; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
314 if (program->slow_mails_left == 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
315 program->slow_mails_left = UINT_MAX; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
316 |
7859
f431c67621ed
Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents:
7855
diff
changeset
|
317 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
|
318 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
|
319 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
|
320 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
321 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
322 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
|
323 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
|
324 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
325 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
|
326 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
|
327 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
|
328 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
|
329 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
330 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
|
331 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
|
332 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
333 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
|
334 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
|
335 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
|
336 else |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
337 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
|
338 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
|
339 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
|
340 break; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
341 } |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
342 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
|
343 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
|
344 |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
345 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
|
346 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
|
347 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
|
348 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
|
349 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
|
350 break; |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
351 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
352 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
|
353 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
|
354 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
|
355 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
|
356 case MAIL_SORT_DISPLAYFROM: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
357 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
|
358 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
|
359 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
|
360 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
|
361 break; |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
362 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
|
363 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
|
364 |
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
|
365 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
|
366 i_array_init(nodes, 128); |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
367 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
|
368 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
|
369 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
|
370 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
|
371 } |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
372 case MAIL_SORT_POP3_ORDER: { |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
373 ARRAY_TYPE(mail_sort_node_size) *nodes; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
374 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
375 nodes = i_malloc(sizeof(*nodes)); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
376 i_array_init(nodes, 128); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
377 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
|
378 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
|
379 program->context = nodes; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
380 break; |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
381 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
382 default: |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
383 i_unreached(); |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
384 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
385 return program; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
386 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
387 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
388 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
|
389 { |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
390 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
|
391 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
392 *_program = NULL; |
7956 | 393 |
394 if (program->context != NULL) | |
395 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
|
396 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
|
397 array_free(&program->seqs); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
398 |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
399 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
|
400 i_free(program); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
401 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
|
402 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
403 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
404 static int |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
405 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
|
406 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
|
407 { |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
408 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
|
409 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
|
410 |
12573
6813e76eb29e
lib-storage: Don't double-demimefy headers when DISPLAYFROM/DISPLAYTO sorting.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
411 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
|
412 *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
|
413 return ret; |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
414 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
415 |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
416 *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
|
417 (const unsigned char *)str, |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
418 strlen(str), 1, TRUE); |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
419 return 0; |
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 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
422 static int |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
423 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
|
424 { |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
425 struct message_address *addr; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
426 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
427 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
|
428 *mailbox_r = ""; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
429 return -1; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
430 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
431 *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
|
432 return 0; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
433 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
434 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
435 static int |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
436 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
|
437 { |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
438 struct message_address *addr; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
439 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
440 *name_r = ""; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
441 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
442 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
|
443 return -1; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
444 if (addr == NULL) |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
445 return 0; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
446 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
447 if (addr->name != NULL) { |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
448 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
|
449 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
|
450 |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
451 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
|
452 (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
|
453 (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
|
454 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
|
455 *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
|
456 return 0; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
457 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
458 } |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
459 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
|
460 *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
|
461 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
|
462 *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
|
463 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
|
464 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
465 |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
466 static void |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
467 index_sort_set_seq(struct mail_search_sort_program *program, |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
468 struct mail *mail, uint32_t seq) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
469 { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
470 if ((mail->mail_stream_opened || mail->mail_metadata_accessed) && |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
471 program->slow_mails_left > 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
472 program->slow_mails_left--; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
473 mail_set_seq(mail, seq); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
474 if (program->slow_mails_left == 0) { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
475 /* too many slow lookups - just return the rest of the results |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
476 in whatever order. */ |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
477 mail->lookup_abort = MAIL_LOOKUP_ABORT_NOT_IN_CACHE; |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
478 } |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
479 } |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
480 |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
481 int index_sort_header_get(struct mail_search_sort_program *program, 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
|
482 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
|
483 { |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
484 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
|
485 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
|
486 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
|
487 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
|
488 |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
489 index_sort_set_seq(program, mail, seq); |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
490 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
|
491 |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
492 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
|
493 case MAIL_SORT_SUBJECT: |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
494 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
|
495 if (ret < 0) |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
496 break; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
497 if (ret == 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
498 /* nonexistent header */ |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
499 return 1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
500 } |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
501 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
|
502 str, &reply_or_fw); |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
503 str_append(dest, str); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
504 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
|
505 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
|
506 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
|
507 break; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
508 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
|
509 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
|
510 break; |
4303
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_TO: |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
512 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
|
513 break; |
10095
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
514 case MAIL_SORT_DISPLAYFROM: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
515 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
|
516 break; |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
517 case MAIL_SORT_DISPLAYTO: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
518 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
|
519 break; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
520 default: |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
521 i_unreached(); |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
522 } |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
523 if (ret < 0) { |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
524 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
|
525 return 0; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
526 return -1; |
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
527 } |
6135
bc0f8a8397a3
Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents:
5336
diff
changeset
|
528 |
15052
d5ebec837bfd
uni_utf8_to_decomposed_titlecase(): Require input length to be exact now.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
529 (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
|
530 return 1; |
6547
7a207cbc008b
Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents:
6546
diff
changeset
|
531 } |
7a207cbc008b
Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents:
6546
diff
changeset
|
532 |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
533 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
|
534 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
|
535 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
|
536 { |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
537 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
|
538 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
|
539 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
|
540 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
|
541 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
|
542 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
|
543 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
544 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
|
545 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
|
546 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
|
547 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
|
548 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
|
549 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
|
550 case MAIL_SORT_DISPLAYFROM: |
61619cad4d0e
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents:
9491
diff
changeset
|
551 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
|
552 T_BEGIN { |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
553 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
|
554 |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
555 str1 = t_str_new(256); |
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
556 str2 = t_str_new(256); |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
557 if (index_sort_header_get(program, seq1, sort_type, str1) < 0) |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
558 index_sort_program_set_mail_failed(program, mail); |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
559 if (index_sort_header_get(program, seq2, sort_type, str2) < 0) |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
560 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
|
561 |
6968
09e1e8d4aa53
Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
562 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
|
563 } 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
|
564 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
565 case MAIL_SORT_ARRIVAL: |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
566 index_sort_set_seq(program, mail, seq1); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
567 if (mail_get_received_date(mail, &time1) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
568 time1 = index_sort_program_set_date_failed(program, mail); |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
569 |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
570 index_sort_set_seq(program, mail, seq2); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
571 if (mail_get_received_date(mail, &time2) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
572 time2 = index_sort_program_set_date_failed(program, mail); |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
573 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
574 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
|
575 (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
|
576 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
577 case MAIL_SORT_DATE: |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
578 index_sort_set_seq(program, mail, seq1); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
579 if (mail_get_date(mail, &time1, &tz) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
580 time1 = index_sort_program_set_date_failed(program, mail); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
581 else if (time1 == 0) { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
582 if (mail_get_received_date(mail, &time1) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
583 time1 = index_sort_program_set_date_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
|
584 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
585 |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
586 index_sort_set_seq(program, mail, seq2); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
587 if (mail_get_date(mail, &time2, &tz) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
588 time2 = index_sort_program_set_date_failed(program, mail); |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
589 else if (time2 == 0) { |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
590 if (mail_get_received_date(mail, &time2) < 0) |
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
591 time2 = index_sort_program_set_date_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
|
592 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
593 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
594 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
|
595 (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
|
596 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
597 case MAIL_SORT_SIZE: |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
598 index_sort_set_seq(program, mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
599 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
|
600 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
|
601 size1 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
602 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
603 |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
604 index_sort_set_seq(program, mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
605 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
|
606 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
|
607 size2 = 0; |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
608 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
609 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
610 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
|
611 (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
|
612 break; |
13112
10dcd83cd77d
s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents:
13072
diff
changeset
|
613 case MAIL_SORT_RELEVANCY: |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
614 index_sort_set_seq(program, mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
615 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
|
616 index_sort_program_set_mail_failed(program, mail); |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
617 index_sort_set_seq(program, mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
618 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
|
619 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
|
620 |
13113
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
621 /* 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
|
622 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
|
623 ret = float1 < float2 ? 1 : |
2e15e70f5f2d
lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents:
13112
diff
changeset
|
624 (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
|
625 break; |
12989
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
626 case MAIL_SORT_POP3_ORDER: |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
627 /* 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
|
628 existing code for uoff_t in sizes, just use them. */ |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
629 index_sort_set_seq(program, mail, seq1); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
630 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
|
631 index_sort_program_set_mail_failed(program, mail); |
21604
fb8ef6e2c2fe
lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21599
diff
changeset
|
632 index_sort_set_seq(program, mail, seq2); |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
633 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
|
634 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
|
635 |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
636 ret = size1 < size2 ? -1 : |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
637 (size1 > size2 ? 1 : 0); |
fac2d4fe86b1
lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
638 break; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
639 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
|
640 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
|
641 (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
|
642 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
|
643 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
|
644 i_unreached(); |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
645 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
646 |
7564
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
647 if (ret == 0) { |
21599
a90f51ba2e9c
lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
648 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
|
649 seq1, seq2); |
4a9ce9df52c5
Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
650 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
651 |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
652 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
|
653 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
|
654 return ret; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff
changeset
|
655 } |