annotate src/plugins/virtual/virtual-sync.c @ 8270:3a579de74dae HEAD

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