annotate src/lib-storage/index/index-sort.c @ 21605:bcd286fcdbad

lib-storage: Add mail.access_type
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 17 Feb 2017 19:29:03 +0200
parents fb8ef6e2c2fe
children 6f2e7eb1ee90
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2006-2017 Dovecot authors, see the included COPYING file */
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
2
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
3 #include "lib.h"
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
4 #include "array.h"
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
5 #include "str.h"
6135
bc0f8a8397a3 Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
6 #include "unichar.h"
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
7 #include "message-address.h"
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
8 #include "message-header-decode.h"
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
9 #include "imap-base-subject.h"
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
10 #include "index-storage.h"
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
11 #include "index-sort-private.h"
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
12
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
13
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
14 struct mail_sort_node_date {
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
15 uint32_t seq;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
16 time_t date;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
17 };
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
18 ARRAY_DEFINE_TYPE(mail_sort_node_date, struct mail_sort_node_date);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
19
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
20 struct mail_sort_node_size {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
21 uint32_t seq;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
22 uoff_t size;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
23 };
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
24 ARRAY_DEFINE_TYPE(mail_sort_node_size, struct mail_sort_node_size);
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
25
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
26 struct mail_sort_node_float {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
27 uint32_t seq;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
28 float num;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
29 };
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
30 ARRAY_DEFINE_TYPE(mail_sort_node_float, struct mail_sort_node_float);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7956
diff changeset
31
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
32 struct sort_cmp_context {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
33 struct mail_search_sort_program *program;
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
34 bool reverse;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
35 };
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
36
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
37 static struct sort_cmp_context static_node_cmp_context;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
38
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
39 static void
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
40 index_sort_program_set_mail_failed(struct mail_search_sort_program *program,
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
41 struct mail *mail)
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
42 {
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;
21605
bcd286fcdbad lib-storage: Add mail.access_type
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21604
diff changeset
173 enum mail_access_type orig_access_type = mail->access_type;
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
174 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
175 mail->mail_metadata_accessed;
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
176
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
177 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
178
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
179 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
180 mail->lookup_abort = MAIL_LOOKUP_ABORT_NOT_IN_CACHE;
21605
bcd286fcdbad lib-storage: Add mail.access_type
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21604
diff changeset
181
bcd286fcdbad lib-storage: Add mail.access_type
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21604
diff changeset
182 mail->access_type = MAIL_ACCESS_TYPE_SORT;
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
183 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
184 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
185 } T_END;
21605
bcd286fcdbad lib-storage: Add mail.access_type
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21604
diff changeset
186 mail->access_type = orig_access_type;
bcd286fcdbad lib-storage: Add mail.access_type
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21604
diff changeset
187
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
188 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
189 mail->mail_metadata_accessed)) {
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
190 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
191 program->slow_mails_left--;
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
192 }
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
193 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
194 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
195
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
196 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
197 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
198 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
199 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
200
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
201 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
202 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
203 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
204 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
205
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
206 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
207 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
208 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
209 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
210
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
211 static void
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
212 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
213 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
214 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
215
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
216 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
217 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
218 i_free(nodes);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
219 program->context = NULL;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
220 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
221
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
222 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
223 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
224 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
225 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
226
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
227 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
228 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
229 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
230 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
231
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
232 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
233 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
234 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
235 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
236
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
237 static void
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
238 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
239 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
240 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
241
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
242 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
243 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
244 i_free(nodes);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
245 program->context = NULL;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
246 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
247
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
248 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
249 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
250 {
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 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
252
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
253 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
254 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
255 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
256 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
257
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
258 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
259 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
260 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
261 }
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
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
263 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
264 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
265 {
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
266 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
267
13113
2e15e70f5f2d lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 13112
diff changeset
268 /* 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
269 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
270 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
271 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
272 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
273
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
274 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
275 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
276 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
277 }
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
278
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
279 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
280 {
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
281 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
282 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
283 static_node_cmp_context.reverse =
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
284 (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
285
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
286 program->sort_list_finish(program);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
287 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
288
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
289 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
290 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
291 {
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
292 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
293
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
294 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
295 return FALSE;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
296
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
297 seqp = array_idx(&program->seqs, program->iter_idx++);
12873
b47f17b173f5 lib-storage: Search code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
298 *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
299 return TRUE;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
300 }
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
301
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
302 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
303 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
304 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
305 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
306 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
307 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
308
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
309 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
310 return NULL;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
311
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
312 /* 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
313 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
314 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
315 program->temp_mail = mail_alloc(t, 0, NULL);
21605
bcd286fcdbad lib-storage: Add mail.access_type
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21604
diff changeset
316 program->temp_mail->access_type = MAIL_ACCESS_TYPE_SORT;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
317
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
318 program->slow_mails_left =
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
319 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
320 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
321 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
322
7859
f431c67621ed Reversing the primary sort criterion reversed also reversed secondary
Timo Sirainen <tss@iki.fi>
parents: 7855
diff changeset
323 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
324 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
325 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
326 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
327 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
328 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
329 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
330
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
331 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
332 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
333 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
334 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
335
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
336 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
337 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
338
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
339 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
340 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
341 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
342 else
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
343 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
344 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
345 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
346 break;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
347 }
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
348 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
349 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
350
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
351 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
352 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
353 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
354 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
355 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
356 break;
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
357 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
358 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
359 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
360 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
361 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
362 case MAIL_SORT_DISPLAYFROM:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
363 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
364 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
365 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
366 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
367 break;
13112
10dcd83cd77d s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents: 13072
diff changeset
368 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
369 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
370
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 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
372 i_array_init(nodes, 128);
13112
10dcd83cd77d s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents: 13072
diff changeset
373 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
374 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
375 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
376 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
377 }
12989
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
378 case MAIL_SORT_POP3_ORDER: {
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
379 ARRAY_TYPE(mail_sort_node_size) *nodes;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
380
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
381 nodes = i_malloc(sizeof(*nodes));
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
382 i_array_init(nodes, 128);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
383 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
384 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
385 program->context = nodes;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
386 break;
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
387 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
388 default:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
389 i_unreached();
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
390 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
391 return program;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
392 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
393
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
394 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
395 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
396 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
397
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
398 *_program = NULL;
7956
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
399
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
400 if (program->context != NULL)
439636cce455 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 7859
diff changeset
401 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
402 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
403 array_free(&program->seqs);
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
404
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
405 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
406 i_free(program);
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
407 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
408 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
409
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
410 static int
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
411 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
412 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
413 {
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
414 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
415 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
416
12573
6813e76eb29e lib-storage: Don't double-demimefy headers when DISPLAYFROM/DISPLAYTO sorting.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
417 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
418 *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
419 return ret;
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
420 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
421
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
422 *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
423 (const unsigned char *)str,
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
424 strlen(str), 1, TRUE);
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
425 return 0;
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
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
428 static int
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
429 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
430 {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
431 struct message_address *addr;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
432
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
433 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
434 *mailbox_r = "";
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
435 return -1;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
436 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
437 *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
438 return 0;
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
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
441 static int
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
442 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
443 {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
444 struct message_address *addr;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
445
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
446 *name_r = "";
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
447
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
448 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
449 return -1;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
450 if (addr == NULL)
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
451 return 0;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
452
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
453 if (addr->name != NULL) {
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
454 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
455 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
456
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
457 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
458 (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
459 (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
460 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
461 *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
462 return 0;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
463 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
464 }
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
465 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
466 *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
467 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
468 *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
469 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
470 }
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
471
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
472 static void
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
473 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
474 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
475 {
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
476 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
477 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
478 program->slow_mails_left--;
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
479 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
480 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
481 /* 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
482 in whatever order. */
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
483 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
484 }
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
485 }
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
486
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
487 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
488 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
489 {
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
490 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
491 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
492 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
493 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
494
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
495 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
496 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
497
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
498 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
499 case MAIL_SORT_SUBJECT:
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
500 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
501 if (ret < 0)
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
502 break;
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
503 if (ret == 0) {
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
504 /* nonexistent header */
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
505 return 1;
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
506 }
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
507 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
508 str, &reply_or_fw);
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
509 str_append(dest, str);
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
510 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
511 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
512 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
513 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
514 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
515 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
516 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
517 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
518 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
519 break;
10095
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
520 case MAIL_SORT_DISPLAYFROM:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
521 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
522 break;
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
523 case MAIL_SORT_DISPLAYTO:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
524 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
525 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
526 default:
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
527 i_unreached();
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
528 }
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
529 if (ret < 0) {
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
530 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
531 return 0;
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
532 return -1;
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
533 }
6135
bc0f8a8397a3 Use i;unicode-casemap for sorting also.
Timo Sirainen <tss@iki.fi>
parents: 5336
diff changeset
534
15052
d5ebec837bfd uni_utf8_to_decomposed_titlecase(): Require input length to be exact now.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
535 (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
536 return 1;
6547
7a207cbc008b Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents: 6546
diff changeset
537 }
7a207cbc008b Don't assert-crash with node.sort_id != 0.
Timo Sirainen <tss@iki.fi>
parents: 6546
diff changeset
538
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
539 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
540 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
541 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
542 {
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
543 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
544 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
545 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
546 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
547 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
548 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
549
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
550 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
551 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
552 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
553 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
554 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
555 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
556 case MAIL_SORT_DISPLAYFROM:
61619cad4d0e imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
557 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
558 T_BEGIN {
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
559 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
560
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
561 str1 = t_str_new(256);
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
562 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
563 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
564 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
565 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
566 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
567
6968
09e1e8d4aa53 Simplified and optimized the sorting code.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
568 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
569 } 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
570 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
571 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
572 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
573 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
574 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
575
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
576 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
577 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
578 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
579
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
580 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
581 (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
582 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
583 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
584 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
585 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
586 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
587 else if (time1 == 0) {
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
588 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
589 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
590 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
591
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
592 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
593 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
594 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
595 else if (time2 == 0) {
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
596 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
597 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
598 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
599
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
600 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
601 (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
602 break;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
603 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
604 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
605 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
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 size1 = 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
21604
fb8ef6e2c2fe lib-storage: Add mail_sort_max_read_count setting.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21599
diff changeset
610 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
611 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
612 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
613 size2 = 0;
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
614 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
615
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
616 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
617 (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
618 break;
13112
10dcd83cd77d s/search score/search relevancy/
Timo Sirainen <tss@iki.fi>
parents: 13072
diff changeset
619 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
620 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
621 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
622 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
623 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
624 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
625 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
626
13113
2e15e70f5f2d lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 13112
diff changeset
627 /* 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
628 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
629 ret = float1 < float2 ? 1 :
2e15e70f5f2d lib-storage: Sorting by relevancy returned messages in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 13112
diff changeset
630 (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
631 break;
12989
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
632 case MAIL_SORT_POP3_ORDER:
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
633 /* 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
634 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
635 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
636 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
637 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
638 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
639 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
640 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
641
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
642 ret = size1 < size2 ? -1 :
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
643 (size1 > size2 ? 1 : 0);
fac2d4fe86b1 lib-storage: Added MAIL_SORT_POP3_ORDER
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
644 break;
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
645 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
646 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
647 (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
648 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
649 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
650 i_unreached();
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
7564
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
653 if (ret == 0) {
21599
a90f51ba2e9c lib-storage: Fix error handling when sorting mails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
654 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
655 seq1, seq2);
4a9ce9df52c5 Message sort index handling rewrite to fix several race conditions when
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
656 }
4303
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
657
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
658 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
659 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
660 return ret;
5f03738219a6 Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
diff changeset
661 }