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