Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/virtual/virtual-sync.c @ 7670:c8b19aca45d9 HEAD
virtual mailboxes: Use saved search results to find out which messages were
added/removed. Also several other fixes and optimizations.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 09 Jun 2008 02:32:15 +0300 |
parents | eb0f45d0c9f2 |
children | 29d6c17f2009 |
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" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "mail-search-build.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "virtual-storage.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include <stdlib.h> |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
13 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
|
14 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
|
15 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
|
16 }; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
17 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct virtual_sync_mail { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 uint32_t vseq; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct virtual_mail_index_record vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 }; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct virtual_sync_context { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct virtual_mailbox *mbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct mail_index_sync_ctx *index_sync_ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct mail_index *index; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct mail_index_view *sync_view; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct mail_index_transaction *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 const char *const *kw_all; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
31 /* 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
|
32 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
|
33 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
34 ARRAY_DEFINE(all_adds, struct virtual_add_record); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 enum mailbox_sync_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 uint32_t uid_validity; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 unsigned int expunge_removed:1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 }; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 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
|
41 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 uint32_t uid_validity = ioloop_time; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 mail_index_update_header(ctx->trans, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 offsetof(struct mail_index_header, uid_validity), |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 &uid_validity, sizeof(uid_validity), TRUE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 ctx->uid_validity = uid_validity; |
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 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 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
|
51 struct virtual_backend_box *bbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 uint32_t vseq, uint32_t real_uid) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 enum mail_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 const char *const *kw_names; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 struct mail_keywords *keywords; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 if (!mail_set_uid(bbox->sync_mail, real_uid)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 i_panic("UID lost unexpectedly"); |
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 /* copy flags */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 flags = mail_get_flags(bbox->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 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
|
64 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 /* copy keywords */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 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
|
67 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
|
68 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
|
69 mail_index_keywords_free(&keywords); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 } |
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 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
|
73 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 const struct virtual_sync_mail *m1 = p1, *m2 = p2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 if (m1->vrec.mailbox_id < m2->vrec.mailbox_id) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 if (m1->vrec.mailbox_id > m2->vrec.mailbox_id) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 return 1; |
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 if (m1->vrec.real_uid < m2->vrec.real_uid) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 if (m1->vrec.real_uid > m2->vrec.real_uid) |
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 /* broken */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 return 0; |
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 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
89 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
90 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
|
91 { |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
92 struct mailbox_transaction_context *trans; |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
94 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
|
95 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
|
96 bbox->sync_mail = mail_alloc(trans, 0, NULL); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 } |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
98 } |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
100 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
101 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
|
102 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
103 struct mailbox_transaction_context *trans; |
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 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
|
106 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
|
107 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
|
108 (void)mailbox_transaction_commit(&trans); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 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
|
113 const struct mail_index_sync_rec *sync_rec) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 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
|
116 struct virtual_backend_box *bbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 const struct virtual_mail_index_record *vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 const void *data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 enum mail_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 struct mail_keywords *keywords; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 enum modify_type modify_type; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 const char *kw_names[2]; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 uint32_t vseq, seq1, seq2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 bool expunged; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 switch (sync_rec->type) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 case MAIL_INDEX_SYNC_TYPE_APPEND: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 /* don't care */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 return; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 if (!mail_index_lookup_seq_range(ctx->sync_view, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 sync_rec->uid1, sync_rec->uid2, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 &seq1, &seq2)) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 /* already expunged, nothing to do. */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 return; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 for (vseq = seq1; vseq <= seq2; vseq++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 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
|
146 &data, &expunged); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 vrec = data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 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
|
150 if (bbox == NULL) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 continue; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
153 virtual_backend_box_sync_mail_set(bbox); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 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
|
155 i_panic("UID lost unexpectedly"); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 switch (sync_rec->type) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 mail_expunge(bbox->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 flags = sync_rec->add_flags & MAIL_FLAGS_NONRECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 if (flags != 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 mail_update_flags(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 MODIFY_ADD, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 flags = sync_rec->remove_flags & MAIL_FLAGS_NONRECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 if (flags != 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 mail_update_flags(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 MODIFY_REMOVE, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 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
|
176 kw_names[1] = NULL; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 keywords = mailbox_keywords_create_valid(bbox->box, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 kw_names); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 modify_type = sync_rec->type == |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD ? |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 MODIFY_ADD : MODIFY_REMOVE; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 mail_update_keywords(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 modify_type, keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 mailbox_keywords_free(bbox->box, &keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 kw_names[0] = NULL; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 keywords = mailbox_keywords_create_valid(bbox->box, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 kw_names); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 mail_update_keywords(bbox->sync_mail, MODIFY_REPLACE, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 mailbox_keywords_free(bbox->box, &keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 case MAIL_INDEX_SYNC_TYPE_APPEND: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 i_unreached(); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
201 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
|
202 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
203 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
|
204 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
|
205 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
206 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
|
207 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
|
208 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
|
209 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
|
210 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
|
211 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
212 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 static void virtual_sync_index(struct virtual_sync_context *ctx) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 struct mailbox *box = &ctx->mbox->ibox.box; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 const struct mail_index_header *hdr; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 uint32_t seq1, seq2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 hdr = mail_index_get_header(ctx->sync_view); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 if (hdr->uid_validity != 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 ctx->uid_validity = hdr->uid_validity; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 else |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 virtual_sync_set_uidvalidity(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 /* mark the newly seen messages as recent */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 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
|
227 hdr->next_uid, &seq1, &seq2)) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 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
|
229 seq1, seq2); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 if (box->v.sync_notify != NULL) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 box->v.sync_notify(box, 0, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
236 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
|
237 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 struct mailbox_transaction_context *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 struct mail_search_context *search_ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 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
|
241 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
|
242 enum mailbox_search_result_flags result_flags; |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 int ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
245 /* FIXME: build the initial search result from the saved view and |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
246 sync beginning from the saved modseq */ |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 trans = mailbox_transaction_begin(bbox->box, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 mail = mail_alloc(trans, 0, NULL); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 |
7666
eb0f45d0c9f2
Merged virtual mailbox support.
Timo Sirainen <tss@iki.fi>
parents:
7663
diff
changeset
|
250 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
|
251 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
|
252 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
253 /* 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
|
254 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
|
255 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
|
256 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
|
257 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
|
258 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
259 /* 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
|
260 memset(&uidmap, 0, sizeof(uidmap)); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 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
|
262 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
|
263 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
|
264 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
|
265 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
266 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 ret = mailbox_search_deinit(&search_ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 mail_free(&mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 |
7666
eb0f45d0c9f2
Merged virtual mailbox support.
Timo Sirainen <tss@iki.fi>
parents:
7663
diff
changeset
|
270 mail_search_args_deinit(bbox->search_args); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 (void)mailbox_transaction_commit(&trans); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 return ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
275 static int virtual_backend_uidmap_cmp(const void *key, 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
|
276 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
277 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
|
278 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
|
279 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
280 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
|
281 (*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
|
282 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
283 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
284 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
285 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
|
286 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
|
287 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
|
288 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
289 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
|
290 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
|
291 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
|
292 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
|
293 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
294 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
|
295 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
|
296 return; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
297 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
298 /* 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
|
299 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
|
300 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
|
301 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
302 /* 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
|
303 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
|
304 sizeof(*uidmap), |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
305 virtual_backend_uidmap_cmp, &src)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
306 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
307 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
308 /* remove the unwanted messages */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
309 for (i = dest = 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
|
310 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
|
311 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
|
312 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
|
313 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
|
314 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
315 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
316 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
|
317 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
|
318 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
|
319 &vseq)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
320 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
321 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
|
322 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
323 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
328 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
329 static void |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
340 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
|
341 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
|
342 return; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
343 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
|
344 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
345 /* 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
|
346 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
|
347 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
|
348 if (uids[0].seq1 > uidmap[rec_count-1].real_uid) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
349 /* 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
|
350 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
|
351 } 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
|
352 sizeof(*uidmap), |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
353 virtual_backend_uidmap_cmp, &dest)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
354 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
355 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
356 /* 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
|
357 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
|
358 &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
|
359 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
|
360 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
|
361 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
362 /* 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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 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
|
368 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
|
369 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
|
370 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
371 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
372 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
|
373 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
|
374 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
|
375 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
376 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
|
377 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
|
378 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
379 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
380 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
381 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
382 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
|
383 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
|
384 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
385 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
|
386 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
|
387 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
388 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
|
389 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
|
390 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
391 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
|
392 &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
|
393 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
394 /* 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
|
395 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
|
396 added_uids. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 &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
|
404 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
|
405 &temp_uids); |
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 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
408 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
409 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
|
410 /* 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
|
411 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
|
412 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
|
413 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
|
414 &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
|
415 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
|
416 &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
|
417 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
418 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
|
419 &removed_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
420 } 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
|
421 /* 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
|
422 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
|
423 &removed_uids); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
424 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
|
425 &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
|
426 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
|
427 } else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
428 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
|
429 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
430 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
|
431 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
432 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
433 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
|
434 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
|
435 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
|
436 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
|
437 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
438 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
|
439 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
|
440 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
|
441 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
|
442 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
443 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
|
444 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
|
445 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
|
446 (void)bsearch_insert_pos(&uid1, uidmap, count, sizeof(*uidmap), |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
447 virtual_backend_uidmap_cmp, &idx); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
448 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
|
449 return FALSE; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
450 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
451 *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
|
452 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
|
453 *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
|
454 return TRUE; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
455 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
456 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
457 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
|
458 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
|
459 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
|
460 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
461 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
|
462 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
|
463 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
|
464 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
|
465 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
|
466 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
467 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
|
468 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
|
469 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
|
470 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
|
471 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
|
472 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
|
473 /* 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
|
474 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
475 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
476 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
|
477 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
|
478 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
479 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
|
480 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
|
481 &idx1, &idx2)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
482 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
483 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
|
484 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
|
485 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
|
486 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
|
487 vuid, &vseq)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
488 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
489 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
|
490 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
|
491 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
492 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
493 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
|
494 break; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
495 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
496 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
497 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
|
498 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
499 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
500 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
|
501 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
|
502 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
503 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
|
504 int ret; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
505 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
506 /* 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
|
507 syncing starts. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
508 virtual_backend_box_sync_mail_unset(bbox); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
509 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
510 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
|
511 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
|
512 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
|
513 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
514 if (bbox->search_result == NULL) { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
515 /* initial sync, do a full search */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
516 if (mailbox_sync(bbox->box, sync_flags, 0, NULL) < 0) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
517 return -1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
518 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
519 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
|
520 ret = virtual_sync_backend_box_init(bbox); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
521 } else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
522 /* 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
|
523 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
|
524 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
|
525 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
|
526 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
|
527 } T_END; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
528 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
|
529 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
530 return ret; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
531 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
532 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
533 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
|
534 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
535 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
|
536 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
|
537 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
|
538 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
|
539 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
|
540 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
|
541 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
|
542 bool expunged; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
543 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
|
544 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
|
545 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
546 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
|
547 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
548 /* 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
|
549 real UID */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
550 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
|
551 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
|
552 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
|
553 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
|
554 &data, &expunged); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
555 vrec = data; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
556 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
|
557 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
|
558 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
559 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
|
560 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
561 /* 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
|
562 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
|
563 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
|
564 bbox = NULL; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
565 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
|
566 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
|
567 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
|
568 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
569 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
|
570 /* 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
|
571 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
|
572 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
|
573 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
|
574 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
575 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
|
576 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
|
577 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
|
578 /* 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
|
579 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
|
580 continue; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
581 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
582 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
|
583 &uidmap_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
584 j = 0; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
585 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
|
586 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
|
587 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
588 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
|
589 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
590 /* 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
|
591 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
|
592 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
|
593 break; |
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 /* 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
|
596 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
|
597 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
|
598 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
599 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
|
600 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
|
601 else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
602 /* 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
|
603 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
|
604 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
|
605 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
|
606 } |
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 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
|
609 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
610 /* 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
|
611 them */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
612 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
|
613 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
|
614 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
|
615 continue; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
616 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
617 add_rec.rec.mailbox_id = bboxes[i]->mailbox_id; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
618 uidmap = array_get_modifiable(&bbox->uids, &uidmap_count); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
619 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
|
620 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
|
621 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
|
622 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
623 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
624 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
625 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
626 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
|
627 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
628 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
|
629 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
630 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
|
631 return -1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
632 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
|
633 return 1; |
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 /* 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
|
636 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
|
637 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
|
638 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
|
639 return -1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
640 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
|
641 return 1; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
642 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
643 /* 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
|
644 and UID. */ |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
645 return 0; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
646 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
647 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
648 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
|
649 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
650 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
|
651 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
|
652 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
|
653 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
|
654 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
655 /* 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
|
656 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
|
657 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
|
658 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
|
659 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
660 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
|
661 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
|
662 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
|
663 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
664 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
|
665 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
666 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
|
667 &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
|
668 /* 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
|
669 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
|
670 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
671 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
672 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
673 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
|
674 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
675 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
676 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
|
677 { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
678 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
|
679 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
|
680 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
|
681 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
|
682 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
|
683 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
|
684 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
|
685 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
686 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
|
687 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
|
688 return; |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
689 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
690 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
|
691 /* 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
|
692 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
|
693 } else { |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
694 /* 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
|
695 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
|
696 } |
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 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
|
699 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
|
700 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
|
701 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
|
702 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
|
703 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
704 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
705 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
|
706 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
|
707 vrec, NULL); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
708 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
|
709 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
710 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
711 /* 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
|
712 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
|
713 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
|
714 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
715 /* 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
|
716 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
|
717 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
|
718 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
|
719 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
|
720 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
|
721 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
722 |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
723 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
|
724 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
|
725 sizeof(*uidmap), |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
726 virtual_backend_uidmap_cmp, &idx)) |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
727 i_unreached(); |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
728 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
|
729 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
|
730 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
731 } |
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
732 |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
733 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
|
734 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
735 struct virtual_backend_box *const *bboxes; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
736 unsigned int i, count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
737 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
738 i_array_init(&ctx->all_adds, 128); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
739 bboxes = array_get(&ctx->mbox->backend_boxes, &count); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
740 for (i = 0; i < count; i++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
741 if (virtual_sync_backend_box(ctx, bboxes[i]) < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
742 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
|
743 } |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
744 |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
745 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
|
746 /* 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
|
747 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
|
748 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
|
749 virtual_sync_backend_map_uids(ctx); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
750 } |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
751 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
|
752 array_free(&ctx->all_adds); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
753 return 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
754 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
755 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
756 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
|
757 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
758 struct virtual_backend_box *const *bboxes; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
759 unsigned int i, count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
760 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
761 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
|
762 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
|
763 virtual_backend_box_sync_mail_unset(bboxes[i]); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
764 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
766 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
|
767 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
768 int ret = success ? 0 : -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
769 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
770 virtual_sync_backend_boxes_finish(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
771 if (success) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
772 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
|
773 mail_storage_set_index_error(&ctx->mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
774 ret = -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
775 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
776 } else { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 mail_index_sync_rollback(&ctx->index_sync_ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
778 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
779 i_free(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
780 return 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
781 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
782 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
783 static int virtual_sync(struct virtual_mailbox *mbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
784 enum mailbox_sync_flags flags) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
785 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
786 struct virtual_sync_context *ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
787 enum mail_index_sync_flags index_sync_flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
788 int ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
789 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
790 ctx = i_new(struct virtual_sync_context, 1); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
791 ctx->mbox = mbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
792 ctx->flags = flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
793 ctx->index = mbox->ibox.index; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
794 /* Removed messages are expunged when |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
795 a) EXPUNGE is used |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
796 b) Mailbox is being opened (FIX_INCONSISTENT is set) */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
797 ctx->expunge_removed = |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
798 (ctx->flags & (MAILBOX_SYNC_FLAG_EXPUNGE | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
799 MAILBOX_SYNC_FLAG_FIX_INCONSISTENT)) != 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
800 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
801 index_sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
802 MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
803 if (!mbox->ibox.keep_recent) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
804 index_sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
805 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
806 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
|
807 &ctx->sync_view, &ctx->trans, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
808 index_sync_flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
809 if (ret <= 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
810 if (ret < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
811 mail_storage_set_index_error(&mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
812 i_free(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
813 return ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
814 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
815 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
816 /* update list of UIDs in mailboxes */ |
7670
c8b19aca45d9
virtual mailboxes: Use saved search results to find out which messages were
Timo Sirainen <tss@iki.fi>
parents:
7666
diff
changeset
|
817 virtual_sync_index_changes(ctx); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
818 if (virtual_sync_backend_boxes(ctx) < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
819 return virtual_sync_finish(ctx, FALSE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
820 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
821 virtual_sync_index(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
822 return virtual_sync_finish(ctx, TRUE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
823 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
824 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
825 struct mailbox_sync_context * |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
826 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
|
827 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 struct virtual_mailbox *mbox = (struct virtual_mailbox *)box; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
829 int ret = 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
830 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
831 if (!box->opened) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
832 index_storage_mailbox_open(&mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
833 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
834 if (index_mailbox_want_full_sync(&mbox->ibox, flags)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
835 ret = virtual_sync(mbox, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
836 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
837 return index_mailbox_sync_init(box, flags, ret < 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
838 } |