annotate src/lib-storage/index/dbox-single/sdbox-sync.c @ 11820:76ee1fa16012

Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
author Timo Sirainen <tss@iki.fi>
date Wed, 14 Jul 2010 17:10:30 +0100
parents 8ec35eb6d7b3
children 28eaaa23f2c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10582
615eef3139c2 Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
1 /* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "sdbox-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "sdbox-file.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "sdbox-sync.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #define SDBOX_REBUILD_COUNT 3
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
10 static void
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
11 dbox_sync_file_move_if_needed(struct dbox_file *file,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
12 enum sdbox_sync_entry_type type)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 {
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
14 bool move_to_alt = type == SDBOX_SYNC_ENTRY_TYPE_MOVE_TO_ALT;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
15 bool deleted;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
17 if (move_to_alt != dbox_file_is_in_alt(file)) {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
18 /* move the file. if it fails, nothing broke so
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
19 don't worry about it. */
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
20 if (dbox_file_open(file, &deleted) > 0 && !deleted)
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 11658
diff changeset
21 (void)sdbox_file_move(file, move_to_alt);
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
22 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
25 static void dbox_sync_file_expunge(struct sdbox_sync_context *ctx,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
26 struct dbox_file *file, uint32_t seq)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 {
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
28 struct sdbox_file *sfile = (struct sdbox_file *)file;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
29 struct mailbox *box = &ctx->mbox->box;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
31 if (mail_index_transaction_is_expunged(ctx->trans, seq)) {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
32 /* already expunged within this transaction */
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
33 return;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
34 }
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
35 if (dbox_file_unlink(file) < 0) {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
36 /* some non-ENOENT error trying to unlink the file */
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
37 return;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
40 /* file was either unlinked by us or someone else */
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
41 mail_index_expunge(ctx->trans, seq);
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
42 if (box->v.sync_notify != NULL)
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
43 box->v.sync_notify(box, sfile->uid, MAILBOX_SYNC_TYPE_EXPUNGE);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
46 static void sdbox_sync_file(struct sdbox_sync_context *ctx,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
47 uint32_t seq, uint32_t uid,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
48 enum sdbox_sync_entry_type type)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 {
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
50 struct dbox_file *file;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
51
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
52 file = sdbox_file_init(ctx->mbox, uid);
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
53 switch (type) {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
54 case SDBOX_SYNC_ENTRY_TYPE_EXPUNGE:
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
55 dbox_sync_file_expunge(ctx, file, seq);
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
56 break;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
57 case SDBOX_SYNC_ENTRY_TYPE_MOVE_FROM_ALT:
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
58 case SDBOX_SYNC_ENTRY_TYPE_MOVE_TO_ALT:
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
59 dbox_sync_file_move_if_needed(file, type);
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
60 break;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
61 }
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
62 dbox_file_unref(&file);
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
63 }
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
64
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
65 static void sdbox_sync_add(struct sdbox_sync_context *ctx,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
66 const struct mail_index_sync_rec *sync_rec)
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
67 {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
68 uint32_t uid;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
69 enum sdbox_sync_entry_type type;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 uint32_t seq, seq1, seq2;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 if (sync_rec->type == MAIL_INDEX_SYNC_TYPE_EXPUNGE) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 /* we're interested */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
74 type = SDBOX_SYNC_ENTRY_TYPE_EXPUNGE;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 } else if (sync_rec->type == MAIL_INDEX_SYNC_TYPE_FLAGS) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 /* we care only about alt flag changes */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
77 if ((sync_rec->add_flags & DBOX_INDEX_FLAG_ALT) != 0)
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
78 type = SDBOX_SYNC_ENTRY_TYPE_MOVE_TO_ALT;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
79 else if ((sync_rec->remove_flags & DBOX_INDEX_FLAG_ALT) != 0)
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
80 type = SDBOX_SYNC_ENTRY_TYPE_MOVE_FROM_ALT;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
81 else
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
82 return;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 /* not interested */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
85 return;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 if (!mail_index_lookup_seq_range(ctx->sync_view,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 sync_rec->uid1, sync_rec->uid2,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 &seq1, &seq2)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 /* already expunged everything. nothing to do. */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
92 return;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 for (seq = seq1; seq <= seq2; seq++) {
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
96 mail_index_lookup_uid(ctx->sync_view, seq, &uid);
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
97 sdbox_sync_file(ctx, seq, uid, type);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 static int sdbox_sync_index(struct sdbox_sync_context *ctx)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
103 struct mailbox *box = &ctx->mbox->box;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 const struct mail_index_header *hdr;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 struct mail_index_sync_rec sync_rec;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 uint32_t seq1, seq2;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 hdr = mail_index_get_header(ctx->sync_view);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 if (hdr->uid_validity == 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 /* newly created index file */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 /* mark the newly seen messages as recent */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 if (mail_index_lookup_seq_range(ctx->sync_view, hdr->first_recent_uid,
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
116 hdr->next_uid, &seq1, &seq2))
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
117 index_mailbox_set_recent_seq(box, ctx->sync_view, seq1, seq2);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
119 while (mail_index_sync_next(ctx->index_sync_ctx, &sync_rec))
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
120 sdbox_sync_add(ctx, &sync_rec);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 if (box->v.sync_notify != NULL)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 box->v.sync_notify(box, 0, 0);
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
124 return 1;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 10678
diff changeset
127 static int
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 10678
diff changeset
128 sdbox_refresh_header(struct sdbox_mailbox *mbox, bool retry, bool log_error)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 struct mail_index_view *view;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 struct sdbox_index_header hdr;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 int ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
134 view = mail_index_view_open(mbox->box.index);
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 10678
diff changeset
135 ret = sdbox_read_header(mbox, &hdr, log_error);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 mail_index_view_close(&view);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137
11025
1e118fd825c7 sdbox: Removed unused code.
Timo Sirainen <tss@iki.fi>
parents: 11024
diff changeset
138 if (ret < 0 && retry) {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
139 (void)mail_index_refresh(mbox->box.index);
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 10678
diff changeset
140 return sdbox_refresh_header(mbox, FALSE, log_error);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 return ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 int sdbox_sync_begin(struct sdbox_mailbox *mbox, enum sdbox_sync_flags flags,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 struct sdbox_sync_context **ctx_r)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
148 struct mail_storage *storage = mbox->box.storage;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 struct sdbox_sync_context *ctx;
10678
9740c4858a57 Mailbox deletion: Fixed race condition where a mailbox couldn't get deleted.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
150 enum mail_index_sync_flags sync_flags;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 unsigned int i;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 int ret;
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
153 bool rebuild, force_rebuild;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
155 force_rebuild = (flags & SDBOX_SYNC_FLAG_FORCE_REBUILD) != 0;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
156 rebuild = force_rebuild ||
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
157 mbox->corrupted_rebuild_count != 0 ||
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
158 sdbox_refresh_header(mbox, TRUE, FALSE) < 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 ctx = i_new(struct sdbox_sync_context, 1);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 ctx->mbox = mbox;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 ctx->flags = flags;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163
10678
9740c4858a57 Mailbox deletion: Fixed race condition where a mailbox couldn't get deleted.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
164 sync_flags = index_storage_get_sync_flags(&mbox->box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 if (!rebuild && (flags & SDBOX_SYNC_FLAG_FORCE) == 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 if ((flags & SDBOX_SYNC_FLAG_FSYNC) != 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 sync_flags |= MAIL_INDEX_SYNC_FLAG_FSYNC;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 /* don't write unnecessary dirty flag updates */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 sync_flags |= MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 for (i = 0;; i++) {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
173 ret = mail_index_sync_begin(mbox->box.index,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 &ctx->index_sync_ctx,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 &ctx->sync_view, &ctx->trans,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 sync_flags);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 if (ret <= 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 if (ret < 0)
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
179 mail_storage_set_index_error(&mbox->box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 *ctx_r = NULL;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 return ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
185 if (rebuild)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 ret = 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 if ((ret = sdbox_sync_index(ctx)) > 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 break;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 /* failure. keep the index locked while we're doing a
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 rebuild. */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 if (ret == 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 if (i >= SDBOX_REBUILD_COUNT) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 mail_storage_set_critical(storage,
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
197 "sdbox %s: Index keeps breaking",
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
198 ctx->mbox->box.path);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 ret = -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 /* do a full resync and try again. */
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
202 i_warning("sdbox %s: Rebuilding index",
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
203 ctx->mbox->box.path);
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
204 rebuild = FALSE;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
205 ret = sdbox_sync_index_rebuild(mbox,
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
206 force_rebuild);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 mail_index_sync_rollback(&ctx->index_sync_ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 if (ret < 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 *ctx_r = ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 int sdbox_sync_finish(struct sdbox_sync_context **_ctx, bool success)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 struct sdbox_sync_context *ctx = *_ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 int ret = success ? 0 : -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 *_ctx = NULL;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 if (success) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 if (mail_index_sync_commit(&ctx->index_sync_ctx) < 0) {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
229 mail_storage_set_index_error(&ctx->mbox->box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 ret = -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 mail_index_sync_rollback(&ctx->index_sync_ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 return ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 int sdbox_sync(struct sdbox_mailbox *mbox, enum sdbox_sync_flags flags)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 struct sdbox_sync_context *sync_ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 if (sdbox_sync_begin(mbox, flags, &sync_ctx) < 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 if (sync_ctx == NULL)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 return sdbox_sync_finish(&sync_ctx, TRUE);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 struct mailbox_sync_context *
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 sdbox_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 enum sdbox_sync_flags sdbox_sync_flags = 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 int ret = 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 if (!box->opened) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 if (mailbox_open(box) < 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 ret = -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263
11025
1e118fd825c7 sdbox: Removed unused code.
Timo Sirainen <tss@iki.fi>
parents: 11024
diff changeset
264 if (ret == 0 && index_mailbox_want_full_sync(&mbox->box, flags)) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 if ((flags & MAILBOX_SYNC_FLAG_FORCE_RESYNC) != 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 sdbox_sync_flags |= SDBOX_SYNC_FLAG_FORCE_REBUILD;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 ret = sdbox_sync(mbox, sdbox_sync_flags);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 return index_mailbox_sync_init(box, flags, ret < 0);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 }