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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }