Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/mailbox-search-result.c @ 9354:687ac828b964 HEAD
lib-index: modseqs weren't tracked properly within session when changes were done.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 01 Sep 2009 13:05:03 -0400 |
parents | b9faf4db2a9f |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7898
diff
changeset
|
1 /* Copyright (c) 2008-2009 Dovecot authors, see the included COPYING file */ |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "mail-storage-private.h" |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mail-search.h" |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mailbox-search-result-private.h" |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 static void |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 mailbox_search_result_analyze_args(struct mail_search_result *result, |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 struct mail_search_arg *arg) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 for (; arg != NULL; arg = arg->next) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 switch (arg->type) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 case SEARCH_OR: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 case SEARCH_SUB: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 mailbox_search_result_analyze_args(result, |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 arg->value.subargs); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 case SEARCH_FLAGS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 result->args_have_flags = TRUE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 case SEARCH_KEYWORDS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 result->args_have_keywords = TRUE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 case SEARCH_MODSEQ: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 result->args_have_modseq = TRUE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 default: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 struct mail_search_result * |
7893
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
36 mailbox_search_result_alloc(struct mailbox *box, struct mail_search_args *args, |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
37 enum mailbox_search_result_flags flags) |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 struct mail_search_result *result; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 result = i_new(struct mail_search_result, 1); |
7893
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
42 result->box = box; |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 result->flags = flags; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 i_array_init(&result->uids, 32); |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
45 i_array_init(&result->never_uids, 128); |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 if ((result->flags & MAILBOX_SEARCH_RESULT_FLAG_UPDATE) != 0) { |
7893
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
48 result->search_args = args; |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 mail_search_args_ref(result->search_args); |
7893
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
50 mailbox_search_result_analyze_args(result, args->args); |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 array_append(&result->box->search_results, &result, 1); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 return result; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 void mailbox_search_result_free(struct mail_search_result **_result) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 struct mail_search_result *result = *_result; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 struct mail_search_result *const *results; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 unsigned int i, count; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 *_result = NULL; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 results = array_get(&result->box->search_results, &count); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 for (i = 0; i < count; i++) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 if (results[i] == result) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 array_delete(&result->box->search_results, i, 1); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 i_assert(i != count); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 if (result->search_args != NULL) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 mail_search_args_unref(&result->search_args); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 array_free(&result->uids); |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
78 array_free(&result->never_uids); |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 if (array_is_created(&result->removed_uids)) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 array_free(&result->removed_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 array_free(&result->added_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 i_free(result); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
7893
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
86 struct mail_search_result * |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
87 mailbox_search_result_save(struct mail_search_context *ctx, |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
88 enum mailbox_search_result_flags flags) |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
89 { |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
90 struct mail_search_result *result; |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
91 |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
92 result = mailbox_search_result_alloc(ctx->transaction->box, |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
93 ctx->args, flags); |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
94 array_append(&ctx->results, &result, 1); |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
95 return result; |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
96 } |
9e4be86d4b7d
Added mailbox_search_result_alloc() for building search results manually.
Timo Sirainen <tss@iki.fi>
parents:
7671
diff
changeset
|
97 |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7893
diff
changeset
|
98 void mailbox_search_result_initial_done(struct mail_search_result *result) |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 if ((result->flags & MAILBOX_SEARCH_RESULT_FLAG_QUEUE_SYNC) != 0) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 i_array_init(&result->removed_uids, 32); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 i_array_init(&result->added_uids, 32); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 } |
7655
ec49260ed4ee
SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
104 mail_search_args_seq2uid(result->search_args); |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 void mailbox_search_results_initial_done(struct mail_search_context *ctx) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 struct mail_search_result *const *results; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 unsigned int i, count; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 results = array_get(&ctx->results, &count); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 for (i = 0; i < count; i++) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 mailbox_search_result_initial_done(results[i]); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 void mailbox_search_result_add(struct mail_search_result *result, uint32_t uid) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 i_assert(uid > 0); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 if (seq_range_exists(&result->uids, uid)) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 return; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 seq_range_array_add(&result->uids, 0, uid); |
7667
303b71884a05
CONTEXT=SEARCH: Handle correctly if the same mail is added and removed (or
Timo Sirainen <tss@iki.fi>
parents:
7655
diff
changeset
|
125 if (array_is_created(&result->added_uids)) { |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 seq_range_array_add(&result->added_uids, 0, uid); |
7667
303b71884a05
CONTEXT=SEARCH: Handle correctly if the same mail is added and removed (or
Timo Sirainen <tss@iki.fi>
parents:
7655
diff
changeset
|
127 seq_range_array_remove(&result->removed_uids, uid); |
303b71884a05
CONTEXT=SEARCH: Handle correctly if the same mail is added and removed (or
Timo Sirainen <tss@iki.fi>
parents:
7655
diff
changeset
|
128 } |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 void mailbox_search_result_remove(struct mail_search_result *result, |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 uint32_t uid) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 if (seq_range_array_remove(&result->uids, uid)) { |
7667
303b71884a05
CONTEXT=SEARCH: Handle correctly if the same mail is added and removed (or
Timo Sirainen <tss@iki.fi>
parents:
7655
diff
changeset
|
135 if (array_is_created(&result->removed_uids)) { |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 seq_range_array_add(&result->removed_uids, 0, uid); |
7667
303b71884a05
CONTEXT=SEARCH: Handle correctly if the same mail is added and removed (or
Timo Sirainen <tss@iki.fi>
parents:
7655
diff
changeset
|
137 seq_range_array_remove(&result->added_uids, uid); |
303b71884a05
CONTEXT=SEARCH: Handle correctly if the same mail is added and removed (or
Timo Sirainen <tss@iki.fi>
parents:
7655
diff
changeset
|
138 } |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 void mailbox_search_results_add(struct mail_search_context *ctx, uint32_t uid) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 struct mail_search_result *const *results; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 unsigned int i, count; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 results = array_get(&ctx->results, &count); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 for (i = 0; i < count; i++) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 mailbox_search_result_add(results[i], uid); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 void mailbox_search_results_remove(struct mailbox *box, uint32_t uid) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 struct mail_search_result *const *results; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 unsigned int i, count; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 results = array_get(&box->search_results, &count); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 for (i = 0; i < count; i++) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 mailbox_search_result_remove(results[i], uid); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
162 void mailbox_search_result_never(struct mail_search_result *result, |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
163 uint32_t uid) |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
164 { |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
165 seq_range_array_add(&result->never_uids, 0, uid); |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
166 } |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
167 |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
168 void mailbox_search_results_never(struct mail_search_context *ctx, |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
169 uint32_t uid) |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
170 { |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
171 struct mail_search_result *const *results; |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
172 unsigned int i, count; |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
173 |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
174 if (ctx->update_result != NULL) |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
175 mailbox_search_result_never(ctx->update_result, uid); |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
176 |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
177 results = array_get(&ctx->results, &count); |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
178 for (i = 0; i < count; i++) |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
179 mailbox_search_result_never(results[i], uid); |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
180 } |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7667
diff
changeset
|
181 |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 const ARRAY_TYPE(seq_range) * |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 mailbox_search_result_get(struct mail_search_result *result) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 return &result->uids; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 void mailbox_search_result_sync(struct mail_search_result *result, |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 ARRAY_TYPE(seq_range) *removed_uids, |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 ARRAY_TYPE(seq_range) *added_uids) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 array_clear(removed_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 array_clear(added_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 array_append_array(removed_uids, &result->removed_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 array_append_array(added_uids, &result->added_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 array_clear(&result->removed_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 array_clear(&result->added_uids); |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 } |