Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/virtual/virtual-sync.c @ 8270:3a579de74dae HEAD
Virtual mailboxes: Crashfix with more than one backend mailbox.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 12 Oct 2008 14:48:18 +0300 |
parents | eb320fbb87f0 |
children | ba6ec21af651 |
rev | line source |
---|---|
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2008 Dovecot authors, see the included COPYING file */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
5 #include "bsearch-insert-pos.h" |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "ioloop.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "str.h" |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
8 #include "mail-index-modseq.h" |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mail-search-build.h" |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
10 #include "mailbox-search-result-private.h" |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
11 #include "index-search-result.h" |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "virtual-storage.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include <stdlib.h> |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
16 struct virtual_add_record { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
17 struct virtual_mail_index_record rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
18 time_t received_date; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
19 }; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
20 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct virtual_sync_mail { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 uint32_t vseq; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct virtual_mail_index_record vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 }; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct virtual_sync_context { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct virtual_mailbox *mbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct mail_index_sync_ctx *index_sync_ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct mail_index *index; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct mail_index_view *sync_view; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct mail_index_transaction *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 const char *const *kw_all; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
34 /* messages expunged within this sync */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
35 ARRAY_TYPE(seq_range) sync_expunges; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
36 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
37 ARRAY_DEFINE(all_adds, struct virtual_add_record); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 enum mailbox_sync_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 uint32_t uid_validity; |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
40 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
41 unsigned int ext_header_changed:1; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
42 unsigned int ext_header_rewrite:1; |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 unsigned int expunge_removed:1; |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
44 unsigned int retry:1; |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 }; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 static void virtual_sync_set_uidvalidity(struct virtual_sync_context *ctx) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 uint32_t uid_validity = ioloop_time; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 mail_index_update_header(ctx->trans, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 offsetof(struct mail_index_header, uid_validity), |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 &uid_validity, sizeof(uid_validity), TRUE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 ctx->uid_validity = uid_validity; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 static void virtual_sync_external_flags(struct virtual_sync_context *ctx, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 struct virtual_backend_box *bbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 uint32_t vseq, uint32_t real_uid) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 enum mail_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 const char *const *kw_names; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 struct mail_keywords *keywords; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 if (!mail_set_uid(bbox->sync_mail, real_uid)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 i_panic("UID lost unexpectedly"); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 /* copy flags */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 flags = mail_get_flags(bbox->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 mail_index_update_flags(ctx->trans, vseq, MODIFY_REPLACE, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 /* copy keywords */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 kw_names = mail_get_keywords(bbox->sync_mail); |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
74 keywords = mail_index_keywords_create(ctx->index, kw_names); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
75 mail_index_update_keywords(ctx->trans, vseq, MODIFY_REPLACE, keywords); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
76 mail_index_keywords_free(&keywords); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 static int virtual_sync_mail_cmp(const void *p1, const void *p2) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 const struct virtual_sync_mail *m1 = p1, *m2 = p2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 if (m1->vrec.mailbox_id < m2->vrec.mailbox_id) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 if (m1->vrec.mailbox_id > m2->vrec.mailbox_id) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 return 1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 if (m1->vrec.real_uid < m2->vrec.real_uid) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 if (m1->vrec.real_uid > m2->vrec.real_uid) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 return 1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 /* broken */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 return 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
96 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
97 virtual_backend_box_sync_mail_set(struct virtual_backend_box *bbox) |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 { |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
99 struct mailbox_transaction_context *trans; |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
101 if (bbox->sync_mail == NULL) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
102 trans = mailbox_transaction_begin(bbox->box, 0); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
103 bbox->sync_mail = mail_alloc(trans, 0, NULL); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
105 } |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
107 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
108 virtual_backend_box_sync_mail_unset(struct virtual_backend_box *bbox) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
109 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
110 struct mailbox_transaction_context *trans; |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
112 if (bbox->sync_mail != NULL) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
113 trans = bbox->sync_mail->transaction; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
114 mail_free(&bbox->sync_mail); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
115 (void)mailbox_transaction_commit(&trans); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
119 static int bbox_mailbox_id_cmp(const void *p1, const void *p2) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
120 { |
8270
3a579de74dae
Virtual mailboxes: Crashfix with more than one backend mailbox.
Timo Sirainen <tss@iki.fi>
parents:
8268
diff
changeset
|
121 const struct virtual_backend_box *const *b1 = p1, *const *b2 = p2; |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
122 |
8270
3a579de74dae
Virtual mailboxes: Crashfix with more than one backend mailbox.
Timo Sirainen <tss@iki.fi>
parents:
8268
diff
changeset
|
123 if ((*b1)->mailbox_id < (*b2)->mailbox_id) |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
124 return -1; |
8270
3a579de74dae
Virtual mailboxes: Crashfix with more than one backend mailbox.
Timo Sirainen <tss@iki.fi>
parents:
8268
diff
changeset
|
125 if ((*b1)->mailbox_id > (*b2)->mailbox_id) |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
126 return 1; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
127 return 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
128 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
129 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
130 static bool virtual_sync_ext_header_read(struct virtual_sync_context *ctx) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
131 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
132 const struct virtual_mail_index_header *ext_hdr; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
133 const struct mail_index_header *hdr; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
134 const struct virtual_mail_index_mailbox_record *mailboxes; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
135 struct virtual_backend_box *bbox, **bboxes; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
136 const void *ext_data; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
137 size_t ext_size; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
138 unsigned int i, count, ext_name_offset, ext_mailbox_count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
139 uint32_t prev_mailbox_id; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
140 bool ret; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
141 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
142 hdr = mail_index_get_header(ctx->sync_view); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
143 mail_index_get_header_ext(ctx->sync_view, ctx->mbox->virtual_ext_id, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
144 &ext_data, &ext_size); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
145 ext_hdr = ext_data; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
146 if (ctx->mbox->sync_initialized && |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
147 ctx->mbox->prev_uid_validity == hdr->uid_validity && |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
148 ext_size >= sizeof(*ext_hdr) && |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
149 ctx->mbox->prev_change_counter == ext_hdr->change_counter) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
150 /* fully refreshed */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
151 return TRUE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
152 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
153 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
154 ctx->mbox->sync_initialized = TRUE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
155 ctx->mbox->prev_uid_validity = hdr->uid_validity; |
8268
eb320fbb87f0
Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox.
Timo Sirainen <tss@iki.fi>
parents:
8179
diff
changeset
|
156 if (ext_hdr == NULL || |
eb320fbb87f0
Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox.
Timo Sirainen <tss@iki.fi>
parents:
8179
diff
changeset
|
157 ctx->mbox->search_args_crc32 != ext_hdr->search_args_crc32) { |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
158 mailboxes = NULL; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
159 ext_name_offset = 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
160 ext_mailbox_count = 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
161 } else { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
162 ctx->mbox->prev_change_counter = ext_hdr->change_counter; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
163 mailboxes = (const void *)(ext_hdr + 1); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
164 ext_name_offset = sizeof(*ext_hdr) + |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
165 ext_hdr->mailbox_count * sizeof(*mailboxes); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
166 if (ext_name_offset >= ext_size || |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
167 ext_hdr->mailbox_count > INT_MAX/sizeof(*mailboxes)) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
168 i_error("virtual %s: Broken mailbox_count header", |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
169 ctx->mbox->path); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
170 ext_mailbox_count = 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
171 } else { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
172 ext_mailbox_count = ext_hdr->mailbox_count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
173 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
174 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
175 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
176 /* update mailbox backends */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
177 prev_mailbox_id = 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
178 for (i = 0; i < ext_mailbox_count; i++) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
179 if (mailboxes[i].id > ext_hdr->highest_mailbox_id || |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
180 mailboxes[i].id <= prev_mailbox_id) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
181 i_error("virtual %s: Broken mailbox id", |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
182 ctx->mbox->path); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
183 break; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
184 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
185 if (mailboxes[i].name_len == 0 || |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
186 mailboxes[i].name_len > ext_size) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
187 i_error("virtual %s: Broken mailbox name_len", |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
188 ctx->mbox->path); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
189 break; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
190 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
191 if (ext_name_offset + mailboxes[i].name_len > ext_size) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
192 i_error("virtual %s: Broken mailbox list", |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
193 ctx->mbox->path); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
194 break; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
195 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
196 T_BEGIN { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
197 const unsigned char *nameptr; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
198 const char *name; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
199 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
200 nameptr = CONST_PTR_OFFSET(ext_data, ext_name_offset); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
201 name = t_strndup(nameptr, mailboxes[i].name_len); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
202 bbox = virtual_backend_box_lookup_name(ctx->mbox, name); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
203 } T_END; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
204 if (bbox == NULL) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
205 /* mailbox no longer exists */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
206 ret = FALSE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
207 } else { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
208 bbox->mailbox_id = mailboxes[i].id; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
209 bbox->sync_uid_validity = mailboxes[i].uid_validity; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
210 bbox->sync_highest_modseq = mailboxes[i].highest_modseq; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
211 bbox->sync_next_uid = mailboxes[i].next_uid; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
212 bbox->sync_mailbox_idx = i; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
213 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
214 ext_name_offset += mailboxes[i].name_len; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
215 prev_mailbox_id = mailboxes[i].id; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
216 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
217 if (ext_hdr == NULL) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
218 ret = TRUE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
219 ctx->mbox->highest_mailbox_id = 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
220 } else { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
221 ret = i == ext_hdr->mailbox_count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
222 ctx->mbox->highest_mailbox_id = ext_hdr->highest_mailbox_id; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
223 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
224 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
225 /* assign new mailbox IDs if any are missing */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
226 bboxes = array_get_modifiable(&ctx->mbox->backend_boxes, &count); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
227 for (i = 0; i < count; i++) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
228 if (bboxes[i]->mailbox_id == 0) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
229 bboxes[i]->mailbox_id = ++ctx->mbox->highest_mailbox_id; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
230 ret = FALSE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
231 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
232 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
233 /* sort the backend mailboxes by mailbox_id. */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
234 qsort(bboxes, count, sizeof(*bboxes), bbox_mailbox_id_cmp); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
235 return ret; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
236 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
237 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
238 static void virtual_sync_ext_header_rewrite(struct virtual_sync_context *ctx) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
239 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
240 struct virtual_mail_index_header ext_hdr; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
241 struct virtual_mail_index_mailbox_record mailbox; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
242 struct virtual_backend_box **bboxes; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
243 buffer_t *buf; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
244 const void *ext_data; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
245 size_t ext_size; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
246 unsigned int i, mailbox_pos, name_pos, count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
247 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
248 bboxes = array_get_modifiable(&ctx->mbox->backend_boxes, &count); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
249 mailbox_pos = sizeof(ext_hdr); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
250 name_pos = mailbox_pos + sizeof(mailbox) * count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
251 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
252 memset(&ext_hdr, 0, sizeof(ext_hdr)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
253 memset(&mailbox, 0, sizeof(mailbox)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
254 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
255 ext_hdr.change_counter = ++ctx->mbox->prev_change_counter; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
256 ext_hdr.mailbox_count = count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
257 ext_hdr.highest_mailbox_id = ctx->mbox->highest_mailbox_id; |
8268
eb320fbb87f0
Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox.
Timo Sirainen <tss@iki.fi>
parents:
8179
diff
changeset
|
258 ext_hdr.search_args_crc32 = ctx->mbox->search_args_crc32; |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
259 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
260 buf = buffer_create_dynamic(pool_datastack_create(), name_pos + 256); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
261 buffer_append(buf, &ext_hdr, sizeof(ext_hdr)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
262 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
263 for (i = 0; i < count; i++) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
264 i_assert(i == 0 || |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
265 bboxes[i]->mailbox_id > bboxes[i-1]->mailbox_id); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
266 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
267 bboxes[i]->sync_mailbox_idx = i; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
268 mailbox.id = bboxes[i]->mailbox_id; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
269 mailbox.name_len = strlen(bboxes[i]->name); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
270 mailbox.uid_validity = bboxes[i]->sync_uid_validity; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
271 mailbox.highest_modseq = bboxes[i]->sync_highest_modseq; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
272 mailbox.next_uid = bboxes[i]->sync_next_uid; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
273 buffer_write(buf, mailbox_pos, &mailbox, sizeof(mailbox)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
274 buffer_write(buf, name_pos, bboxes[i]->name, mailbox.name_len); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
275 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
276 mailbox_pos += sizeof(mailbox); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
277 name_pos += mailbox.name_len; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
278 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
279 i_assert(buf->used == name_pos); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
280 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
281 mail_index_get_header_ext(ctx->sync_view, ctx->mbox->virtual_ext_id, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
282 &ext_data, &ext_size); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
283 if (ext_size < name_pos) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
284 mail_index_ext_resize(ctx->trans, ctx->mbox->virtual_ext_id, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
285 name_pos, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
286 sizeof(struct virtual_mail_index_record), |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
287 sizeof(uint32_t)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
288 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
289 mail_index_update_header_ext(ctx->trans, ctx->mbox->virtual_ext_id, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
290 0, buf->data, name_pos); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
291 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
292 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
293 static void virtual_sync_ext_header_update(struct virtual_sync_context *ctx) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
294 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
295 struct virtual_mail_index_header ext_hdr; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
296 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
297 if (!ctx->ext_header_changed) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
298 return; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
299 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
300 /* we changed something - update the change counter in header */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
301 ext_hdr.change_counter = ++ctx->mbox->prev_change_counter; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
302 mail_index_update_header_ext(ctx->trans, ctx->mbox->virtual_ext_id, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
303 offsetof(struct virtual_mail_index_header, change_counter), |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
304 &ext_hdr.change_counter, sizeof(ext_hdr.change_counter)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
305 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
306 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 static void virtual_sync_index_rec(struct virtual_sync_context *ctx, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 const struct mail_index_sync_rec *sync_rec) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 uint32_t virtual_ext_id = ctx->mbox->virtual_ext_id; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 struct virtual_backend_box *bbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 const struct virtual_mail_index_record *vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 const void *data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 enum mail_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 struct mail_keywords *keywords; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 enum modify_type modify_type; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 const char *kw_names[2]; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 uint32_t vseq, seq1, seq2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 bool expunged; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 switch (sync_rec->type) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 case MAIL_INDEX_SYNC_TYPE_APPEND: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 /* don't care */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 return; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 if (!mail_index_lookup_seq_range(ctx->sync_view, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 sync_rec->uid1, sync_rec->uid2, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 &seq1, &seq2)) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 /* already expunged, nothing to do. */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 return; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 for (vseq = seq1; vseq <= seq2; vseq++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 mail_index_lookup_ext(ctx->sync_view, vseq, virtual_ext_id, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 &data, &expunged); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 vrec = data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 bbox = virtual_backend_box_lookup(ctx->mbox, vrec->mailbox_id); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 if (bbox == NULL) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 continue; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
348 virtual_backend_box_sync_mail_set(bbox); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 if (!mail_set_uid(bbox->sync_mail, vrec->real_uid)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 i_panic("UID lost unexpectedly"); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 switch (sync_rec->type) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 mail_expunge(bbox->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 flags = sync_rec->add_flags & MAIL_FLAGS_NONRECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 if (flags != 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 mail_update_flags(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 MODIFY_ADD, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 flags = sync_rec->remove_flags & MAIL_FLAGS_NONRECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 if (flags != 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 mail_update_flags(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 MODIFY_REMOVE, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 kw_names[0] = ctx->kw_all[sync_rec->keyword_idx]; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 kw_names[1] = NULL; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 keywords = mailbox_keywords_create_valid(bbox->box, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 kw_names); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 modify_type = sync_rec->type == |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD ? |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 MODIFY_ADD : MODIFY_REMOVE; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 mail_update_keywords(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 modify_type, keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 mailbox_keywords_free(bbox->box, &keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 kw_names[0] = NULL; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 keywords = mailbox_keywords_create_valid(bbox->box, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 kw_names); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 mail_update_keywords(bbox->sync_mail, MODIFY_REPLACE, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 mailbox_keywords_free(bbox->box, &keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 case MAIL_INDEX_SYNC_TYPE_APPEND: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 i_unreached(); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
394 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
396 static void virtual_sync_index_changes(struct virtual_sync_context *ctx) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
397 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
398 const ARRAY_TYPE(keywords) *keywords; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
399 struct mail_index_sync_rec sync_rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
400 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
401 keywords = mail_index_get_keywords(ctx->index); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
402 ctx->kw_all = array_count(keywords) == 0 ? NULL : |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
403 array_idx(keywords, 0); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
404 while (mail_index_sync_next(ctx->index_sync_ctx, &sync_rec)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
405 virtual_sync_index_rec(ctx, &sync_rec); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
406 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
407 |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
408 static void virtual_sync_index_finish(struct virtual_sync_context *ctx) |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 struct mailbox *box = &ctx->mbox->ibox.box; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 const struct mail_index_header *hdr; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 uint32_t seq1, seq2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 hdr = mail_index_get_header(ctx->sync_view); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 if (hdr->uid_validity != 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
416 ctx->uid_validity = hdr->uid_validity; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 else |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 virtual_sync_set_uidvalidity(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 /* mark the newly seen messages as recent */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 if (mail_index_lookup_seq_range(ctx->sync_view, hdr->first_recent_uid, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
422 hdr->next_uid, &seq1, &seq2)) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 index_mailbox_set_recent_seq(&ctx->mbox->ibox, ctx->sync_view, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 seq1, seq2); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 } |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
426 if (ctx->ext_header_rewrite) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
427 /* entire mailbox list needs to be rewritten */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
428 virtual_sync_ext_header_rewrite(ctx); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
429 } else { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
430 /* update only changed parts in the header */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
431 virtual_sync_ext_header_update(ctx); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
432 } |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 if (box->v.sync_notify != NULL) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 box->v.sync_notify(box, 0, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
438 static int virtual_sync_backend_box_init(struct virtual_backend_box *bbox) |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 struct mailbox_transaction_context *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 struct mail_search_context *search_ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 struct mail *mail; |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
443 struct virtual_backend_uidmap uidmap; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
444 enum mailbox_search_result_flags result_flags; |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 int ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 trans = mailbox_transaction_begin(bbox->box, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
448 mail = mail_alloc(trans, 0, NULL); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 |
7666
eb0f45d0c9f2
Merged virtual mailbox support.
Timo Sirainen <tss@iki.fi>
parents:
7663
diff
changeset
|
450 mail_search_args_init(bbox->search_args, bbox->box, FALSE, NULL); |
eb0f45d0c9f2
Merged virtual mailbox support.
Timo Sirainen <tss@iki.fi>
parents:
7663
diff
changeset
|
451 search_ctx = mailbox_search_init(trans, bbox->search_args, NULL); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
453 /* save the result and keep it updated */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
454 result_flags = MAILBOX_SEARCH_RESULT_FLAG_UPDATE | |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
455 MAILBOX_SEARCH_RESULT_FLAG_QUEUE_SYNC; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
456 bbox->search_result = |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
457 mailbox_search_result_save(search_ctx, result_flags); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
458 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
459 /* add the found UIDs to uidmap. virtual_uid gets assigned later. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
460 memset(&uidmap, 0, sizeof(uidmap)); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 array_clear(&bbox->uids); |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
462 while (mailbox_search_next(search_ctx, mail) > 0) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
463 uidmap.real_uid = mail->uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
464 array_append(&bbox->uids, &uidmap, 1); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
465 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
466 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 ret = mailbox_search_deinit(&search_ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 mail_free(&mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 |
7666
eb0f45d0c9f2
Merged virtual mailbox support.
Timo Sirainen <tss@iki.fi>
parents:
7663
diff
changeset
|
470 mail_search_args_deinit(bbox->search_args); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 (void)mailbox_transaction_commit(&trans); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 return ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
475 static int virtual_backend_uidmap_cmp(const void *p1, const void *p2) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
476 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
477 const struct virtual_backend_uidmap *u1 = p1, *u2 = p2; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
478 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
479 if (u1->real_uid < u2->real_uid) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
480 return -1; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
481 if (u1->real_uid > u2->real_uid) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
482 return 1; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
483 return 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
484 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
485 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
486 static void |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
487 virtual_sync_backend_add_existing_uids(struct virtual_sync_context *ctx, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
488 struct virtual_backend_box *bbox, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
489 struct mail_search_result *result) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
490 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
491 struct virtual_backend_uidmap uidmap, *uids; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
492 const struct virtual_mail_index_record *vrec; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
493 const void *data; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
494 uint32_t vseq, vuid, messages; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
495 unsigned int uid_count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
496 bool expunged; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
497 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
498 /* add the currently existing UIDs to uidmap. */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
499 memset(&uidmap, 0, sizeof(uidmap)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
500 array_clear(&bbox->uids); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
501 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
502 messages = mail_index_view_get_messages_count(ctx->sync_view); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
503 for (vseq = 1; vseq <= messages; vseq++) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
504 mail_index_lookup_uid(ctx->sync_view, vseq, &vuid); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
505 mail_index_lookup_ext(ctx->sync_view, vseq, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
506 ctx->mbox->virtual_ext_id, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
507 &data, &expunged); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
508 vrec = data; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
509 if (vrec->mailbox_id == bbox->mailbox_id) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
510 seq_range_array_add(&result->uids, 0, vrec->real_uid); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
511 uidmap.real_uid = vrec->real_uid; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
512 uidmap.virtual_uid = vuid; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
513 array_append(&bbox->uids, &uidmap, 1); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
514 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
515 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
516 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
517 /* the uidmap must be sorted by real_uids */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
518 uids = array_get_modifiable(&bbox->uids, &uid_count); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
519 qsort(uids, uid_count, sizeof(*uids), virtual_backend_uidmap_cmp); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
520 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
521 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
522 static void |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
523 virtual_sync_backend_remove_expunged_uids(struct mail_search_result *result) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
524 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
525 struct index_mailbox *ibox = (struct index_mailbox *)result->box; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
526 const struct seq_range *range; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
527 unsigned int i, count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
528 uint32_t seq, uid; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
529 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
530 range = array_get(&result->uids, &count); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
531 for (i = 0; i < count; i++) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
532 for (uid = range[i].seq1; uid <= range[i].seq2; uid++) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
533 if (!mail_index_lookup_seq(ibox->view, uid, &seq)) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
534 mailbox_search_result_remove(result, uid); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
535 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
536 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
537 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
538 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
539 static int virtual_sync_backend_box_continue(struct virtual_sync_context *ctx, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
540 struct virtual_backend_box *bbox) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
541 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
542 const enum mailbox_search_result_flags result_flags = |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
543 MAILBOX_SEARCH_RESULT_FLAG_UPDATE | |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
544 MAILBOX_SEARCH_RESULT_FLAG_QUEUE_SYNC; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
545 struct index_mailbox *ibox = (struct index_mailbox *)bbox->box; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
546 struct mail_search_result *result; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
547 ARRAY_TYPE(seq_range) flag_updates; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
548 uint64_t modseq; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
549 uint32_t seq, old_msg_count; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
550 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
551 /* build the initial search result from the existing UIDs */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
552 result = mailbox_search_result_alloc(bbox->box, bbox->search_args, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
553 result_flags); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
554 mailbox_search_result_initial_done(result); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
555 virtual_sync_backend_add_existing_uids(ctx, bbox, result); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
556 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
557 /* changes done from now on must update the sync queue */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
558 virtual_sync_backend_remove_expunged_uids(result); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
559 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
560 /* get list of changed messages */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
561 if (!mail_index_lookup_seq_range(ibox->view, 1, bbox->sync_next_uid-1, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
562 &seq, &old_msg_count)) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
563 old_msg_count = 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
564 t_array_init(&flag_updates, I_MIN(128, old_msg_count)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
565 for (seq = 1; seq <= old_msg_count; seq++) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
566 modseq = mail_index_modseq_lookup(ibox->view, seq); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
567 if (modseq > bbox->sync_highest_modseq) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
568 seq_range_array_add(&flag_updates, 0, seq); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
569 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
570 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
571 if (index_search_result_update_flags(result, &flag_updates) < 0 || |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
572 index_search_result_update_appends(result, old_msg_count) < 0) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
573 mailbox_search_result_free(&result); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
574 return -1; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
575 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
576 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
577 bbox->search_result = result; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
578 return 0; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
579 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
580 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
581 static int virtual_backend_uidmap_bsearch_cmp(const void *key, const void *data) |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
582 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
583 const uint32_t *uidp = key; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
584 const struct virtual_backend_uidmap *uidmap = data; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
585 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
586 return *uidp < uidmap->real_uid ? -1 : |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
587 (*uidp > uidmap->real_uid ? 1 : 0); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
588 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
589 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
590 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
591 virtual_sync_mailbox_box_remove(struct virtual_sync_context *ctx, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
592 struct virtual_backend_box *bbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
593 const ARRAY_TYPE(seq_range) *removed_uids) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
594 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
595 const struct seq_range *uids; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
596 struct virtual_backend_uidmap *uidmap; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
597 unsigned int i, src, dest, uid_count, rec_count, left; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
598 uint32_t uid, vseq; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
599 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
600 uids = array_get(removed_uids, &uid_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
601 if (uid_count == 0) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
602 return; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
603 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
604 /* everything in removed_uids should exist in bbox->uids */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
605 uidmap = array_get_modifiable(&bbox->uids, &rec_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
606 i_assert(rec_count >= uid_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
607 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
608 /* find the first uidmap record to be removed */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
609 if (!bsearch_insert_pos(&uids[0].seq1, uidmap, rec_count, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
610 sizeof(*uidmap), |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
611 virtual_backend_uidmap_bsearch_cmp, &src)) |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
612 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
613 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
614 /* remove the unwanted messages */ |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
615 for (i = src = dest = 0; i < uid_count; i++) { |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
616 uid = uids[i].seq1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
617 while (uidmap[src].real_uid != uid) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
618 uidmap[dest++] = uidmap[src++]; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
619 i_assert(src < rec_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
620 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
621 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
622 for (; uid <= uids[i].seq2; uid++, src++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
623 if (!mail_index_lookup_seq(ctx->sync_view, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
624 uidmap[src].virtual_uid, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
625 &vseq)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
626 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
627 mail_index_expunge(ctx->trans, vseq); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
628 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
629 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
630 left = rec_count - src; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
631 memmove(uidmap + dest, uidmap + src, left); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
632 array_delete(&bbox->uids, dest + left, src - dest); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
633 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
634 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
635 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
636 virtual_sync_mailbox_box_add(struct virtual_sync_context *ctx, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
637 struct virtual_backend_box *bbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
638 const ARRAY_TYPE(seq_range) *added_uids) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
639 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
640 const struct seq_range *uids; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
641 struct virtual_backend_uidmap *uidmap; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
642 struct virtual_add_record rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
643 unsigned int i, src, dest, uid_count, add_count, rec_count; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
644 uint32_t uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
645 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
646 uids = array_get(added_uids, &uid_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
647 if (uid_count == 0) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
648 return; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
649 add_count = seq_range_count(added_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
650 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
651 /* none of added_uids should exist in bbox->uids. find the position |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
652 of the first inserted index. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
653 uidmap = array_get_modifiable(&bbox->uids, &rec_count); |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
654 if (rec_count == 0 || uids[0].seq1 > uidmap[rec_count-1].real_uid) { |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
655 /* fast path: usually messages are appended */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
656 dest = rec_count; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
657 } else if (bsearch_insert_pos(&uids[0].seq1, uidmap, rec_count, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
658 sizeof(*uidmap), |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
659 virtual_backend_uidmap_bsearch_cmp, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
660 &dest)) |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
661 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
662 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
663 /* make space for all added UIDs. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
664 array_copy(&bbox->uids.arr, dest + add_count, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
665 &bbox->uids.arr, dest, rec_count - dest); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
666 uidmap = array_get_modifiable(&bbox->uids, &rec_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
667 src = dest + add_count; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
668 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
669 /* add/move the UIDs to their correct positions */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
670 memset(&rec, 0, sizeof(rec)); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
671 rec.rec.mailbox_id = bbox->mailbox_id; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
672 for (i = 0; i < uid_count; i++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
673 uid = uids[i].seq1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
674 while (src < rec_count && uidmap[src].real_uid < uid) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
675 uidmap[dest++] = uidmap[src++]; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
676 i_assert(src < rec_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
677 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
678 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
679 for (; uid <= uids[i].seq2; uid++, dest++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
680 uidmap[dest].real_uid = uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
681 uidmap[dest].virtual_uid = 0; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
682 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
683 rec.rec.real_uid = uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
684 array_append(&ctx->all_adds, &rec, 1); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
685 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
686 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
687 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
688 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
689 static void virtual_sync_mailbox_box_update(struct virtual_sync_context *ctx, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
690 struct virtual_backend_box *bbox) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
691 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
692 ARRAY_TYPE(seq_range) removed_uids, added_uids, temp_uids; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
693 unsigned int count1, count2; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
694 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
695 t_array_init(&removed_uids, 128); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
696 t_array_init(&added_uids, 128); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
697 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
698 mailbox_search_result_sync(bbox->search_result, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
699 &removed_uids, &added_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
700 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
701 /* if any of the pending removes came back, we don't want to expunge |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
702 them anymore. also since they already exist, remove them from |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
703 added_uids. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
704 count1 = array_count(&bbox->sync_pending_removes); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
705 count2 = array_count(&added_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
706 if (count1 > 0 && count2 > 0) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
707 t_array_init(&temp_uids, count1); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
708 array_append_array(&temp_uids, &bbox->sync_pending_removes); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
709 if (seq_range_array_remove_seq_range( |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
710 &bbox->sync_pending_removes, &added_uids) > 0) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
711 seq_range_array_remove_seq_range(&added_uids, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
712 &temp_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
713 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
714 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
715 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
716 if (!ctx->expunge_removed) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
717 /* delay removing messages that don't match the search |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
718 criteria, but don't delay removing expunged messages */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
719 if (array_count(&ctx->sync_expunges) > 0) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
720 seq_range_array_remove_seq_range(&removed_uids, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
721 &ctx->sync_expunges); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
722 virtual_sync_mailbox_box_remove(ctx, bbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
723 &ctx->sync_expunges); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
724 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
725 seq_range_array_merge(&bbox->sync_pending_removes, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
726 &removed_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
727 } else if (array_count(&bbox->sync_pending_removes) > 0) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
728 /* remove all current and old */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
729 seq_range_array_merge(&bbox->sync_pending_removes, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
730 &removed_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
731 virtual_sync_mailbox_box_remove(ctx, bbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
732 &bbox->sync_pending_removes); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
733 array_clear(&bbox->sync_pending_removes); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
734 } else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
735 virtual_sync_mailbox_box_remove(ctx, bbox, &removed_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
736 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
737 virtual_sync_mailbox_box_add(ctx, bbox, &added_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
738 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
739 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
740 static bool virtual_sync_find_seqs(struct virtual_backend_box *bbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
741 const struct mailbox_sync_rec *sync_rec, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
742 unsigned int *idx1_r, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
743 unsigned int *idx2_r) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
744 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
745 struct index_mailbox *ibox = (struct index_mailbox *)bbox->box; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
746 const struct virtual_backend_uidmap *uidmap; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
747 unsigned int idx, count; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
748 uint32_t uid1, uid2; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
749 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
750 mail_index_lookup_uid(ibox->view, sync_rec->seq1, &uid1); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
751 mail_index_lookup_uid(ibox->view, sync_rec->seq2, &uid2); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
752 uidmap = array_get_modifiable(&bbox->uids, &count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
753 (void)bsearch_insert_pos(&uid1, uidmap, count, sizeof(*uidmap), |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
754 virtual_backend_uidmap_bsearch_cmp, &idx); |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
755 if (idx == count || uidmap[idx].real_uid > uid2) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
756 return FALSE; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
757 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
758 *idx1_r = idx; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
759 while (idx < count && uidmap[idx].real_uid <= uid2) idx++; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
760 *idx2_r = idx - 1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
761 return TRUE; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
762 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
763 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
764 static int virtual_sync_backend_box_sync(struct virtual_sync_context *ctx, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
765 struct virtual_backend_box *bbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
766 enum mailbox_sync_flags sync_flags) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
767 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
768 struct mailbox_sync_context *sync_ctx; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
769 const struct virtual_backend_uidmap *uidmap; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
770 struct mailbox_sync_rec sync_rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
771 unsigned int idx1, idx2; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
772 uint32_t vseq, vuid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
773 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
774 sync_ctx = mailbox_sync_init(bbox->box, sync_flags); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
775 virtual_backend_box_sync_mail_set(bbox); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
776 while (mailbox_sync_next(sync_ctx, &sync_rec)) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
777 switch (sync_rec.type) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
778 case MAILBOX_SYNC_TYPE_EXPUNGE: |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
779 if (ctx->expunge_removed) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
780 /* no need to keep track of expunges */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
781 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
782 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
783 seq_range_array_add_range(&ctx->sync_expunges, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
784 sync_rec.seq1, sync_rec.seq2); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
785 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
786 case MAILBOX_SYNC_TYPE_FLAGS: |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
787 if (!virtual_sync_find_seqs(bbox, &sync_rec, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
788 &idx1, &idx2)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
789 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
790 uidmap = array_idx(&bbox->uids, 0); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
791 for (; idx1 <= idx2; idx1++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
792 vuid = uidmap[idx1].virtual_uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
793 if (!mail_index_lookup_seq(ctx->sync_view, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
794 vuid, &vseq)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
795 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
796 virtual_sync_external_flags(ctx, bbox, vseq, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
797 uidmap[idx1].real_uid); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
798 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
799 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
800 case MAILBOX_SYNC_TYPE_MODSEQ: |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
801 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
802 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
803 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
804 return mailbox_sync_deinit(&sync_ctx, 0, NULL); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
805 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
806 |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
807 static void virtual_sync_backend_ext_header(struct virtual_sync_context *ctx, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
808 struct virtual_backend_box *bbox) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
809 { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
810 const unsigned int uidval_pos = |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
811 offsetof(struct virtual_mail_index_mailbox_record, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
812 uid_validity); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
813 struct mailbox_status status; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
814 struct virtual_mail_index_mailbox_record mailbox; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
815 unsigned int mailbox_offset; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
816 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
817 mailbox_get_status(bbox->box, STATUS_UIDVALIDITY | |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
818 STATUS_HIGHESTMODSEQ, &status); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
819 if (bbox->sync_uid_validity == status.uidvalidity && |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
820 bbox->sync_next_uid == status.uidnext && |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
821 bbox->sync_highest_modseq == status.highest_modseq) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
822 return; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
823 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
824 /* mailbox changed - update extension header */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
825 bbox->sync_uid_validity = status.uidvalidity; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
826 bbox->sync_highest_modseq = status.highest_modseq; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
827 bbox->sync_next_uid = status.uidnext; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
828 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
829 if (!ctx->ext_header_rewrite) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
830 /* we'll rewrite the entire header later */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
831 return; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
832 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
833 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
834 memset(&mailbox, 0, sizeof(mailbox)); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
835 mailbox.uid_validity = bbox->sync_uid_validity; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
836 mailbox.highest_modseq = bbox->sync_highest_modseq; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
837 mailbox.next_uid = bbox->sync_next_uid; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
838 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
839 mailbox_offset = sizeof(struct virtual_mail_index_header) + |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
840 bbox->sync_mailbox_idx * sizeof(mailbox); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
841 mail_index_update_header_ext(ctx->trans, ctx->mbox->virtual_ext_id, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
842 mailbox_offset + uidval_pos, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
843 CONST_PTR_OFFSET(&mailbox, uidval_pos), |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
844 sizeof(mailbox) - uidval_pos); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
845 ctx->ext_header_changed = TRUE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
846 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
847 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
848 static int virtual_sync_backend_box(struct virtual_sync_context *ctx, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
849 struct virtual_backend_box *bbox) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
850 { |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
851 struct index_mailbox *ibox = (struct index_mailbox *)bbox->box; |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
852 enum mailbox_sync_flags sync_flags; |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
853 struct mailbox_status status; |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
854 int ret; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
855 |
8179
414b6a5c35db
virtual: STATUS command on a virtual mailbox crashed.
Timo Sirainen <tss@iki.fi>
parents:
7898
diff
changeset
|
856 if (!bbox->box->opened) |
414b6a5c35db
virtual: STATUS command on a virtual mailbox crashed.
Timo Sirainen <tss@iki.fi>
parents:
7898
diff
changeset
|
857 index_storage_mailbox_open(ibox); |
414b6a5c35db
virtual: STATUS command on a virtual mailbox crashed.
Timo Sirainen <tss@iki.fi>
parents:
7898
diff
changeset
|
858 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
859 /* if we already did some changes to index, commit them before |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
860 syncing starts. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
861 virtual_backend_box_sync_mail_unset(bbox); |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
862 /* we use modseqs for speeding up initial search result build. |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
863 make sure the backend has them enabled. */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
864 mail_index_modseq_enable(ibox->index); |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
865 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
866 sync_flags = ctx->flags & (MAILBOX_SYNC_FLAG_FULL_READ | |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
867 MAILBOX_SYNC_FLAG_FULL_WRITE | |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
868 MAILBOX_SYNC_FLAG_FAST); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
869 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
870 if (bbox->search_result == NULL) { |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
871 /* first sync in this process */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
872 i_assert(ctx->expunge_removed); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
873 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
874 if (mailbox_sync(bbox->box, sync_flags, STATUS_UIDVALIDITY, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
875 &status) < 0) |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
876 return -1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
877 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
878 virtual_backend_box_sync_mail_set(bbox); |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
879 if (status.uidvalidity != bbox->sync_uid_validity) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
880 /* UID validity changed since last sync (or this is |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
881 the first sync), do a full search */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
882 ret = virtual_sync_backend_box_init(bbox); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
883 } else { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
884 /* build the initial search using the saved modseq. |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
885 we can't directly update the search result because |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
886 uidmap isn't finished for all messages yet, so |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
887 mark the sync to be retried. */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
888 ret = virtual_sync_backend_box_continue(ctx, bbox); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
889 ctx->retry = TRUE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
890 } |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
891 } else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
892 /* sync using the existing search result */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
893 i_array_init(&ctx->sync_expunges, 32); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
894 ret = virtual_sync_backend_box_sync(ctx, bbox, sync_flags); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
895 if (ret == 0) T_BEGIN { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
896 virtual_sync_mailbox_box_update(ctx, bbox); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
897 } T_END; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
898 array_free(&ctx->sync_expunges); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
899 } |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
900 |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
901 virtual_sync_backend_ext_header(ctx, bbox); |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
902 return ret; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
903 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
904 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
905 static void virtual_sync_backend_map_uids(struct virtual_sync_context *ctx) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
906 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
907 uint32_t virtual_ext_id = ctx->mbox->virtual_ext_id; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
908 struct virtual_sync_mail *vmails; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
909 struct virtual_backend_box *bbox, *const *bboxes; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
910 struct virtual_backend_uidmap *uidmap = NULL; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
911 struct virtual_add_record add_rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
912 const struct virtual_mail_index_record *vrec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
913 const void *data; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
914 bool expunged; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
915 uint32_t i, vseq, vuid, messages, count; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
916 unsigned int j = 0, uidmap_count = 0; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
917 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
918 messages = mail_index_view_get_messages_count(ctx->sync_view); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
919 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
920 /* sort the messages in current view by their backend mailbox and |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
921 real UID */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
922 vmails = messages == 0 ? NULL : |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
923 i_new(struct virtual_sync_mail, messages); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
924 for (vseq = 1; vseq <= messages; vseq++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
925 mail_index_lookup_ext(ctx->sync_view, vseq, virtual_ext_id, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
926 &data, &expunged); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
927 vrec = data; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
928 vmails[vseq-1].vseq = vseq; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
929 vmails[vseq-1].vrec = *vrec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
930 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
931 qsort(vmails, messages, sizeof(*vmails), virtual_sync_mail_cmp); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
932 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
933 /* create real mailbox uid -> virtual uid mapping and expunge |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
934 messages no longer matching the search rule */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
935 memset(&add_rec, 0, sizeof(add_rec)); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
936 bbox = NULL; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
937 for (i = 0; i < messages; i++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
938 vseq = vmails[i].vseq; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
939 vrec = &vmails[i].vrec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
940 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
941 if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
942 /* add the rest of the newly seen messages */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
943 for (; j < uidmap_count; j++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
944 add_rec.rec.real_uid = uidmap[j].real_uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
945 array_append(&ctx->all_adds, &add_rec, 1); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
946 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
947 bbox = virtual_backend_box_lookup(ctx->mbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
948 vrec->mailbox_id); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
949 if (bbox == NULL) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
950 /* the entire mailbox is lost */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
951 mail_index_expunge(ctx->trans, vseq); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
952 continue; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
953 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
954 uidmap = array_get_modifiable(&bbox->uids, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
955 &uidmap_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
956 j = 0; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
957 add_rec.rec.mailbox_id = bbox->mailbox_id; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
958 bbox->sync_seen = TRUE; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
959 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
960 mail_index_lookup_uid(ctx->sync_view, vseq, &vuid); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
961 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
962 /* if virtual record doesn't exist in uidmap, it's expunged */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
963 for (; j < uidmap_count; j++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
964 if (uidmap[j].real_uid >= vrec->real_uid) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
965 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
966 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
967 /* newly seen message */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
968 add_rec.rec.real_uid = uidmap[j].real_uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
969 array_append(&ctx->all_adds, &add_rec, 1); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
970 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
971 if (uidmap[j].real_uid != vrec->real_uid) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
972 mail_index_expunge(ctx->trans, vseq); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
973 else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
974 /* exists - update uidmap and flags */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
975 uidmap[j++].virtual_uid = vuid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
976 virtual_sync_external_flags(ctx, bbox, vseq, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
977 vrec->real_uid); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
978 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
979 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
980 i_free(vmails); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
981 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
982 /* if there are any mailboxes we didn't yet sync, add new messages in |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
983 them */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
984 bboxes = array_get(&ctx->mbox->backend_boxes, &count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
985 for (i = 0; i < count; i++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
986 if (bboxes[i]->sync_seen) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
987 continue; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
988 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
989 add_rec.rec.mailbox_id = bboxes[i]->mailbox_id; |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
990 uidmap = array_get_modifiable(&bboxes[i]->uids, &uidmap_count); |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
991 for (j = 0; j < uidmap_count; j++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
992 add_rec.rec.real_uid = uidmap[j].real_uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
993 array_append(&ctx->all_adds, &add_rec, 1); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
994 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
995 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
996 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
997 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
998 static int virtual_add_record_cmp(const void *p1, const void *p2) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
999 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1000 const struct virtual_add_record *add1 = p1, *add2 = p2; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1001 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1002 if (add1->received_date < add2->received_date) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1003 return -1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1004 if (add1->received_date > add2->received_date) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1005 return 1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1006 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1007 /* if they're in same mailbox, we can order them correctly by the UID. |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1008 if they're in different mailboxes, ordering by UID doesn't really |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1009 help but it doesn't really harm either. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1010 if (add1->rec.real_uid < add2->rec.real_uid) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1011 return -1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1012 if (add1->rec.real_uid > add2->rec.real_uid) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1013 return 1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1014 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1015 /* two messages in different mailboxes have the same received date |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1016 and UID. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1017 return 0; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1018 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1019 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1020 static void virtual_sync_backend_sort_new(struct virtual_sync_context *ctx) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1021 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1022 struct virtual_backend_box *bbox; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1023 struct virtual_add_record *adds; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1024 const struct virtual_mail_index_record *vrec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1025 unsigned int i, count; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1026 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1027 /* get all messages' received dates */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1028 adds = array_get_modifiable(&ctx->all_adds, &count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1029 for (bbox = NULL, i = 0; i < count; i++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1030 vrec = &adds[i].rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1031 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1032 if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1033 bbox = virtual_backend_box_lookup(ctx->mbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1034 vrec->mailbox_id); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1035 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1036 if (!mail_set_uid(bbox->sync_mail, vrec->real_uid)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1037 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1038 if (mail_get_received_date(bbox->sync_mail, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1039 &adds[i].received_date) < 0) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1040 /* probably expunged already, just add it somewhere */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1041 adds[i].received_date = 0; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1042 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1043 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1044 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1045 qsort(adds, count, sizeof(*adds), virtual_add_record_cmp); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1046 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1047 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1048 static void virtual_sync_backend_add_new(struct virtual_sync_context *ctx) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1049 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1050 uint32_t virtual_ext_id = ctx->mbox->virtual_ext_id; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1051 struct virtual_add_record *adds; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1052 struct virtual_backend_box *bbox; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1053 struct virtual_backend_uidmap *uidmap; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1054 const struct virtual_mail_index_record *vrec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1055 unsigned int i, count, idx, uid_count; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1056 uint32_t vseq, first_uid, next_uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1057 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1058 adds = array_get_modifiable(&ctx->all_adds, &count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1059 if (count == 0) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1060 return; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1061 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1062 if (adds[0].rec.mailbox_id == adds[count-1].rec.mailbox_id) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1063 /* all messages are from a single mailbox. add them in |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1064 the same order. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1065 } else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1066 /* sort new messages by received date to get the add order */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1067 virtual_sync_backend_sort_new(ctx); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1068 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1069 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1070 for (bbox = NULL, i = 0; i < count; i++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1071 vrec = &adds[i].rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1072 if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1073 bbox = virtual_backend_box_lookup(ctx->mbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1074 vrec->mailbox_id); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1075 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1076 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1077 mail_index_append(ctx->trans, 0, &vseq); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1078 mail_index_update_ext(ctx->trans, vseq, virtual_ext_id, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1079 vrec, NULL); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1080 virtual_sync_external_flags(ctx, bbox, vseq, vrec->real_uid); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1081 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1082 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1083 /* assign UIDs to new messages */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1084 first_uid = mail_index_get_header(ctx->sync_view)->next_uid; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1085 mail_index_append_assign_uids(ctx->trans, first_uid, &next_uid); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1086 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1087 /* update virtual UIDs in uidmap */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1088 for (bbox = NULL, i = 0; i < count; i++) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1089 vrec = &adds[i].rec; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1090 if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1091 bbox = virtual_backend_box_lookup(ctx->mbox, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1092 vrec->mailbox_id); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1093 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1094 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1095 uidmap = array_get_modifiable(&bbox->uids, &uid_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1096 if (!bsearch_insert_pos(&vrec->real_uid, uidmap, uid_count, |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1097 sizeof(*uidmap), |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1098 virtual_backend_uidmap_bsearch_cmp, |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1099 &idx)) |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1100 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1101 i_assert(uidmap[idx].virtual_uid == 0); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1102 uidmap[idx].virtual_uid = first_uid + i; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1103 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1104 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1105 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1106 static int virtual_sync_backend_boxes(struct virtual_sync_context *ctx) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1107 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1108 struct virtual_backend_box *const *bboxes; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1109 unsigned int i, count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1110 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1111 i_array_init(&ctx->all_adds, 128); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1112 bboxes = array_get(&ctx->mbox->backend_boxes, &count); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1113 for (i = 0; i < count; i++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1114 if (virtual_sync_backend_box(ctx, bboxes[i]) < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1115 return -1; |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1116 } |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1117 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1118 if (!ctx->mbox->uids_mapped) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1119 /* initial sync: assign virtual UIDs to existing messages and |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1120 sync all flags */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1121 ctx->mbox->uids_mapped = TRUE; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1122 virtual_sync_backend_map_uids(ctx); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1123 } |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1124 virtual_sync_backend_add_new(ctx); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1125 array_free(&ctx->all_adds); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1126 return 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1127 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1128 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1129 static void virtual_sync_backend_boxes_finish(struct virtual_sync_context *ctx) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1130 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1131 struct virtual_backend_box *const *bboxes; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1132 unsigned int i, count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1133 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1134 bboxes = array_get(&ctx->mbox->backend_boxes, &count); |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1135 for (i = 0; i < count; i++) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1136 virtual_backend_box_sync_mail_unset(bboxes[i]); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1137 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1138 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1139 static int virtual_sync_finish(struct virtual_sync_context *ctx, bool success) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1140 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1141 int ret = success ? 0 : -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1142 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1143 virtual_sync_backend_boxes_finish(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1144 if (success) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1145 if (mail_index_sync_commit(&ctx->index_sync_ctx) < 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1146 mail_storage_set_index_error(&ctx->mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1147 ret = -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1148 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1149 } else { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1150 mail_index_sync_rollback(&ctx->index_sync_ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1151 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1152 i_free(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1153 return 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1154 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1155 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1156 static int virtual_sync(struct virtual_mailbox *mbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1157 enum mailbox_sync_flags flags) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1158 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1159 struct virtual_sync_context *ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1160 enum mail_index_sync_flags index_sync_flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1161 int ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1162 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1163 ctx = i_new(struct virtual_sync_context, 1); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1164 ctx->mbox = mbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1165 ctx->flags = flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1166 ctx->index = mbox->ibox.index; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1167 /* Removed messages are expunged when |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1168 a) EXPUNGE is used |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1169 b) Mailbox is being opened (FIX_INCONSISTENT is set) */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1170 ctx->expunge_removed = |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1171 (ctx->flags & (MAILBOX_SYNC_FLAG_EXPUNGE | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1172 MAILBOX_SYNC_FLAG_FIX_INCONSISTENT)) != 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1173 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1174 index_sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1175 MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1176 if (!mbox->ibox.keep_recent) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1177 index_sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1178 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1179 ret = mail_index_sync_begin(ctx->index, &ctx->index_sync_ctx, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1180 &ctx->sync_view, &ctx->trans, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1181 index_sync_flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1182 if (ret <= 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1183 if (ret < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1184 mail_storage_set_index_error(&mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1185 i_free(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1186 return ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1187 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1188 |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1189 if (!virtual_sync_ext_header_read(ctx)) |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1190 ctx->ext_header_rewrite = TRUE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1191 /* apply changes from virtual index to backend mailboxes */ |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
1192 virtual_sync_index_changes(ctx); |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1193 /* update list of UIDs in backend mailboxes */ |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1194 ret = virtual_sync_backend_boxes(ctx); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1195 if (ctx->retry && ret == 0) { |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1196 ctx->retry = FALSE; |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1197 ret = virtual_sync_backend_boxes(ctx); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1198 i_assert(!ctx->retry); |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1199 } |
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1200 if (ret < 0) |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1201 return virtual_sync_finish(ctx, FALSE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1202 |
7898
29d6c17f2009
Virtual mailboxes: Speed up initial search result building using modseqs.
Timo Sirainen <tss@iki.fi>
parents:
7670
diff
changeset
|
1203 virtual_sync_index_finish(ctx); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1204 return virtual_sync_finish(ctx, TRUE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1205 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1206 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1207 struct mailbox_sync_context * |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1208 virtual_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1209 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1210 struct virtual_mailbox *mbox = (struct virtual_mailbox *)box; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1211 int ret = 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1212 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1213 if (!box->opened) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1214 index_storage_mailbox_open(&mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1215 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1216 if (index_mailbox_want_full_sync(&mbox->ibox, flags)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1217 ret = virtual_sync(mbox, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1218 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1219 return index_mailbox_sync_init(box, flags, ret < 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1220 } |