Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/virtual/virtual-sync.c @ 7666:eb0f45d0c9f2 HEAD
Merged virtual mailbox support.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 07 Jun 2008 02:04:44 +0300 |
parents | 8fc919084252 |
children | c8b19aca45d9 |
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" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "ioloop.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "str.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-search-build.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "virtual-storage.h" |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include <stdlib.h> |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 struct virtual_sync_mail { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 uint32_t vseq; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 struct virtual_mail_index_record vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 }; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct virtual_sync_context { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct virtual_mailbox *mbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct mail_index_sync_ctx *index_sync_ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct mail_index *index; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct mail_index_view *sync_view; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 struct mail_index_transaction *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 const char *const *kw_all; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 enum mailbox_sync_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 uint32_t uid_validity; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 unsigned int expunge_removed:1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 }; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 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
|
31 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 uint32_t uid_validity = ioloop_time; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 mail_index_update_header(ctx->trans, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 offsetof(struct mail_index_header, uid_validity), |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 &uid_validity, sizeof(uid_validity), TRUE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 ctx->uid_validity = uid_validity; |
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_external_flags(struct virtual_sync_context *ctx, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 struct virtual_backend_box *bbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 uint32_t vseq, uint32_t real_uid) |
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 enum mail_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 const char *const *kw_names; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 struct mail_keywords *keywords; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 if (!mail_set_uid(bbox->sync_mail, real_uid)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 i_panic("UID lost unexpectedly"); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 /* copy flags */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 flags = mail_get_flags(bbox->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 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
|
54 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 /* copy keywords */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 kw_names = mail_get_keywords(bbox->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 if (kw_names[0] != NULL) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 keywords = mail_index_keywords_create(ctx->index, kw_names); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 mail_index_update_keywords(ctx->trans, vseq, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 MODIFY_REPLACE, keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 mail_index_keywords_free(&keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |
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 static void virtual_sync_external_appends(struct virtual_sync_context *ctx, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 struct virtual_backend_box *bbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 uint32_t uid1, uint32_t uid2) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 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
|
70 struct virtual_mail_index_record vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 uint32_t uid, vseq; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 vrec.mailbox_id = bbox->mailbox_id; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 for (uid = uid1; uid <= uid2; uid++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 mail_index_append(ctx->trans, 0, &vseq); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 vrec.real_uid = uid; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 mail_index_update_ext(ctx->trans, vseq, virtual_ext_id, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 &vrec, NULL); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 virtual_sync_external_flags(ctx, bbox, vseq, uid); |
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 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 static void |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 virtual_sync_external_appends_finish_box(struct virtual_sync_context *ctx, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 struct virtual_backend_box *bbox) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 const struct seq_range *seqs; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 unsigned int seqs_count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 uint32_t first_ruid, last_ruid; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 seqs = array_get(&bbox->uids, &seqs_count); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 while (bbox->sync_iter_idx < seqs_count) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 /* max(seq1,prev_uid+1)..seq2 contain newly seen UIDs */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 first_ruid = I_MAX(seqs[bbox->sync_iter_idx].seq1, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 bbox->sync_iter_prev_real_uid + 1); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 last_ruid = seqs[bbox->sync_iter_idx].seq2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 if (first_ruid <= last_ruid) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 virtual_sync_external_appends(ctx, bbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 first_ruid, last_ruid); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 bbox->sync_iter_idx++; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 static void |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 virtual_sync_external_appends_finish(struct virtual_sync_context *ctx) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 struct virtual_backend_box *const *bboxes; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 unsigned int i, count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 uint32_t next_uid; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 next_uid = mail_index_get_header(ctx->sync_view)->next_uid; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 bboxes = array_get(&ctx->mbox->backend_boxes, &count); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 for (i = 0; i < count; i++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 virtual_sync_external_appends_finish_box(ctx, bboxes[i]); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 mail_index_append_assign_uids(ctx->trans, next_uid, &next_uid); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 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
|
122 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 const struct virtual_sync_mail *m1 = p1, *m2 = p2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 if (m1->vrec.mailbox_id < m2->vrec.mailbox_id) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 if (m1->vrec.mailbox_id > m2->vrec.mailbox_id) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 return 1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 if (m1->vrec.real_uid < m2->vrec.real_uid) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 if (m1->vrec.real_uid > m2->vrec.real_uid) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 return 1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 /* broken */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 return 0; |
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 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 static void virtual_sync_external(struct virtual_sync_context *ctx) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 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
|
141 struct virtual_backend_box *bbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 struct virtual_sync_mail *vmails; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 const struct virtual_mail_index_record *vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 const void *data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 const struct seq_range *seqs; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 unsigned int i, seqs_count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 uint32_t vseq, first_ruid, last_ruid, messages; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 bool expunged; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 messages = mail_index_view_get_messages_count(ctx->sync_view); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 /* sort the messages by their backend mailbox and real UID */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 vmails = messages == 0 ? NULL : |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 i_new(struct virtual_sync_mail, messages); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 for (vseq = 1; vseq <= messages; vseq++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 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
|
157 &data, &expunged); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 vrec = data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 vmails[vseq-1].vseq = vseq; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 vmails[vseq-1].vrec = *vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 qsort(vmails, messages, sizeof(*vmails), virtual_sync_mail_cmp); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 bbox = NULL; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 for (i = 0; i < messages; i++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 vseq = vmails[i].vseq; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 vrec = &vmails[i].vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 if (bbox == NULL || bbox->mailbox_id != vrec->mailbox_id) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 bbox = virtual_backend_box_lookup(ctx->mbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 vrec->mailbox_id); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 if (bbox == NULL) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 /* the entire mailbox is lost */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 mail_index_expunge(ctx->trans, vseq); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 continue; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 seqs = array_get(&bbox->uids, &seqs_count); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 while (bbox->sync_iter_idx < seqs_count) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 /* max(seq1,prev_uid+1)..min(seq2,uid-1) contain |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 newly seen UIDs */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 first_ruid = I_MAX(seqs[bbox->sync_iter_idx].seq1, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 bbox->sync_iter_prev_real_uid + 1); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 last_ruid = I_MIN(seqs[bbox->sync_iter_idx].seq2, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 vrec->real_uid - 1); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 if (first_ruid <= last_ruid) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 virtual_sync_external_appends(ctx, bbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 first_ruid, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 last_ruid); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 if (vrec->real_uid <= seqs[bbox->sync_iter_idx].seq2) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 bbox->sync_iter_idx++; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 if (bbox->sync_iter_idx >= seqs_count || |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 vrec->real_uid < seqs[bbox->sync_iter_idx].seq1) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 if (ctx->expunge_removed) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 mail_index_expunge(ctx->trans, vseq); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 continue; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 /* uid is within seq1..seq2 */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 bbox->sync_iter_prev_real_uid = vrec->real_uid; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 virtual_sync_external_flags(ctx, bbox, vseq, vrec->real_uid); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 i_free(vmails); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 virtual_sync_external_appends_finish(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 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
|
214 const struct mail_index_sync_rec *sync_rec) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 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
|
217 struct virtual_backend_box *bbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 const struct virtual_mail_index_record *vrec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 const void *data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 enum mail_flags flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 struct mail_keywords *keywords; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 enum modify_type modify_type; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 const char *kw_names[2]; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 uint32_t vseq, seq1, seq2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 bool expunged; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 switch (sync_rec->type) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 case MAIL_INDEX_SYNC_TYPE_APPEND: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 /* don't care */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 return; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 break; |
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 if (!mail_index_lookup_seq_range(ctx->sync_view, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 sync_rec->uid1, sync_rec->uid2, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 &seq1, &seq2)) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 /* already expunged, nothing to do. */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 return; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 for (vseq = seq1; vseq <= seq2; vseq++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 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
|
247 &data, &expunged); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 vrec = data; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 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
|
251 if (bbox == NULL) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 continue; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 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
|
255 i_panic("UID lost unexpectedly"); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 switch (sync_rec->type) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 mail_expunge(bbox->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 flags = sync_rec->add_flags & MAIL_FLAGS_NONRECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 if (flags != 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 mail_update_flags(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 MODIFY_ADD, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 flags = sync_rec->remove_flags & MAIL_FLAGS_NONRECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 if (flags != 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 mail_update_flags(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 MODIFY_REMOVE, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 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
|
276 kw_names[1] = NULL; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 keywords = mailbox_keywords_create_valid(bbox->box, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 kw_names); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 modify_type = sync_rec->type == |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD ? |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 MODIFY_ADD : MODIFY_REMOVE; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 mail_update_keywords(bbox->sync_mail, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 modify_type, keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 mailbox_keywords_free(bbox->box, &keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 kw_names[0] = NULL; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 keywords = mailbox_keywords_create_valid(bbox->box, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 kw_names); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 mail_update_keywords(bbox->sync_mail, MODIFY_REPLACE, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 mailbox_keywords_free(bbox->box, &keywords); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 break; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 case MAIL_INDEX_SYNC_TYPE_APPEND: |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 i_unreached(); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 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
|
302 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 struct mailbox *box = &ctx->mbox->ibox.box; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 const ARRAY_TYPE(keywords) *keywords; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 const struct mail_index_header *hdr; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 struct mail_index_sync_rec sync_rec; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 uint32_t seq1, seq2; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 hdr = mail_index_get_header(ctx->sync_view); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 if (hdr->uid_validity != 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 ctx->uid_validity = hdr->uid_validity; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 else |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 virtual_sync_set_uidvalidity(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 /* mark the newly seen messages as recent */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 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
|
317 hdr->next_uid, &seq1, &seq2)) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 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
|
319 seq1, seq2); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 keywords = mail_index_get_keywords(ctx->index); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 ctx->kw_all = array_count(keywords) == 0 ? NULL : |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 array_idx(keywords, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 while (mail_index_sync_next(ctx->index_sync_ctx, &sync_rec)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 virtual_sync_index_rec(ctx, &sync_rec); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 if (box->v.sync_notify != NULL) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 box->v.sync_notify(box, 0, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 static int virtual_sync_backend_box(struct virtual_sync_context *ctx, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 struct virtual_backend_box *bbox) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 struct mailbox_transaction_context *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 struct mail_search_context *search_ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 struct mail *mail; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 enum mailbox_sync_flags sync_flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 int ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 sync_flags = ctx->flags & (MAILBOX_SYNC_FLAG_FULL_READ | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 MAILBOX_SYNC_FLAG_FULL_WRITE | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 MAILBOX_SYNC_FLAG_FAST); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 if (mailbox_sync(bbox->box, sync_flags, 0, NULL) < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 trans = mailbox_transaction_begin(bbox->box, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 mail = mail_alloc(trans, 0, NULL); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 |
7666
eb0f45d0c9f2
Merged virtual mailbox support.
Timo Sirainen <tss@iki.fi>
parents:
7663
diff
changeset
|
350 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
|
351 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
|
352 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 array_clear(&bbox->uids); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 while (mailbox_search_next(search_ctx, mail) > 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 seq_range_array_add(&bbox->uids, 0, mail->uid); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 ret = mailbox_search_deinit(&search_ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 mail_free(&mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 |
7666
eb0f45d0c9f2
Merged virtual mailbox support.
Timo Sirainen <tss@iki.fi>
parents:
7663
diff
changeset
|
359 mail_search_args_deinit(bbox->search_args); |
7663
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 (void)mailbox_transaction_commit(&trans); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 return ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 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
|
365 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 struct virtual_backend_box *const *bboxes; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 struct mailbox_transaction_context *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 unsigned int i, count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 bboxes = array_get(&ctx->mbox->backend_boxes, &count); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 for (i = 0; i < count; i++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 if (virtual_sync_backend_box(ctx, bboxes[i]) < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 return -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 bboxes[i]->sync_iter_idx = 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 bboxes[i]->sync_iter_prev_real_uid = 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 i_assert(bboxes[i]->sync_mail == NULL); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 trans = mailbox_transaction_begin(bboxes[i]->box, 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 bboxes[i]->sync_mail = mail_alloc(trans, 0, NULL); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 return 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 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
|
386 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 struct virtual_backend_box *const *bboxes; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 struct mailbox_transaction_context *trans; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 unsigned int i, count; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 bboxes = array_get(&ctx->mbox->backend_boxes, &count); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 for (i = 0; i < count; i++) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 if (bboxes[i]->sync_mail != NULL) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
394 trans = bboxes[i]->sync_mail->transaction; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 mail_free(&bboxes[i]->sync_mail); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 (void)mailbox_transaction_commit(&trans); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 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
|
402 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
403 int ret = success ? 0 : -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 virtual_sync_backend_boxes_finish(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 if (success) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 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
|
408 mail_storage_set_index_error(&ctx->mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 ret = -1; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 } else { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 mail_index_sync_rollback(&ctx->index_sync_ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 i_free(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 return 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
416 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 static int virtual_sync(struct virtual_mailbox *mbox, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 enum mailbox_sync_flags flags) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 struct virtual_sync_context *ctx; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
422 enum mail_index_sync_flags index_sync_flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 int ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 ctx = i_new(struct virtual_sync_context, 1); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 ctx->mbox = mbox; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 ctx->flags = flags; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 ctx->index = mbox->ibox.index; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 /* Removed messages are expunged when |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 a) EXPUNGE is used |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 b) Mailbox is being opened (FIX_INCONSISTENT is set) */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 ctx->expunge_removed = |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 (ctx->flags & (MAILBOX_SYNC_FLAG_EXPUNGE | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 MAILBOX_SYNC_FLAG_FIX_INCONSISTENT)) != 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 index_sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY | |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 if (!mbox->ibox.keep_recent) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 index_sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 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
|
442 &ctx->sync_view, &ctx->trans, |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 index_sync_flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 if (ret <= 0) { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 if (ret < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 mail_storage_set_index_error(&mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 i_free(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
448 return ret; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 /* update list of UIDs in mailboxes */ |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 if (virtual_sync_backend_boxes(ctx) < 0) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
453 return virtual_sync_finish(ctx, FALSE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 virtual_sync_index(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 virtual_sync_external(ctx); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 return virtual_sync_finish(ctx, TRUE); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 } |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 struct mailbox_sync_context * |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 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
|
462 { |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 struct virtual_mailbox *mbox = (struct virtual_mailbox *)box; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 int ret = 0; |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 if (!box->opened) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 index_storage_mailbox_open(&mbox->ibox); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 if (index_mailbox_want_full_sync(&mbox->ibox, flags)) |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
470 ret = virtual_sync(mbox, flags); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 return index_mailbox_sync_init(box, flags, ret < 0); |
8fc919084252
Added initial support for virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 } |