Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/cydir/cydir-sync.c @ 9658:8ba4253adc9b HEAD tip
*-login: SSL connections didn't get closed when the client got destroyed.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 08 May 2014 16:41:29 +0300 |
parents | 00cd9aacd03c |
children |
rev | line source |
---|---|
9532
00cd9aacd03c
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1 /* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */ |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "cydir-storage.h" |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "cydir-sync.h" |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6267
diff
changeset
|
9 static void cydir_sync_set_uidvalidity(struct cydir_sync_context *ctx) |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 uint32_t uid_validity = ioloop_time; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
5643
453128e12b11
mail_index_sync_begin() returns now transaction directly so the syncing code
Timo Sirainen <tss@iki.fi>
parents:
5564
diff
changeset
|
13 mail_index_update_header(ctx->trans, |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 offsetof(struct mail_index_header, uid_validity), |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 &uid_validity, sizeof(uid_validity), TRUE); |
6267
3a1eed408cad
mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
16 ctx->uid_validity = uid_validity; |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 static string_t *cydir_get_path_prefix(struct cydir_mailbox *mbox) |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 { |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
21 string_t *path = str_new(default_pool, 256); |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 const char *dir; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
5459
78eaf595359c
Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents:
5458
diff
changeset
|
24 dir = mailbox_list_get_path(mbox->storage->storage.list, |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 mbox->ibox.box.name, |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 MAILBOX_LIST_PATH_TYPE_MAILBOX); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 str_append(path, dir); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 str_append_c(path, '/'); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 return path; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6267
diff
changeset
|
32 static void |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
33 cydir_sync_expunge(struct cydir_sync_context *ctx, uint32_t seq1, uint32_t seq2) |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
34 { |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
35 struct mailbox *box = &ctx->mbox->ibox.box; |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
36 uint32_t uid; |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
37 |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
38 if (ctx->path == NULL) { |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
39 ctx->path = cydir_get_path_prefix(ctx->mbox); |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
40 ctx->path_dir_prefix_len = str_len(ctx->path); |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
41 } |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
42 |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
43 for (; seq1 <= seq2; seq1++) { |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6267
diff
changeset
|
44 mail_index_lookup_uid(ctx->sync_view, seq1, &uid); |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
45 |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
46 str_truncate(ctx->path, ctx->path_dir_prefix_len); |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
47 str_printfa(ctx->path, "%u.", uid); |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
48 if (unlink(str_c(ctx->path)) == 0) { |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
49 if (box->v.sync_notify != NULL) { |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
50 box->v.sync_notify(box, uid, |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
51 MAILBOX_SYNC_TYPE_EXPUNGE); |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
52 } |
5743
1fa32e040ea5
Treat non-external expunges as requests for expunging messages. If it's
Timo Sirainen <tss@iki.fi>
parents:
5643
diff
changeset
|
53 mail_index_expunge(ctx->trans, seq1); |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
54 } else if (errno != ENOENT) { |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
55 mail_storage_set_critical(&ctx->mbox->storage->storage, |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
56 "unlink(%s) failed: %m", str_c(ctx->path)); |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
57 /* continue anyway */ |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
58 } |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
59 } |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
60 } |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
61 |
6278
ce83635191d4
mail_index_sync_next() can't fail anymore.
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
62 static void cydir_sync_index(struct cydir_sync_context *ctx) |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 { |
5564
47274663a71c
Call sync_notify() once at the end of syncing. Allow accessing mails even
Timo Sirainen <tss@iki.fi>
parents:
5562
diff
changeset
|
64 struct mailbox *box = &ctx->mbox->ibox.box; |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 const struct mail_index_header *hdr; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 struct mail_index_sync_rec sync_rec; |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
67 uint32_t seq1, seq2; |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 hdr = mail_index_get_header(ctx->sync_view); |
6267
3a1eed408cad
mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
70 if (hdr->uid_validity != 0) |
3a1eed408cad
mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
Timo Sirainen <tss@iki.fi>
parents:
6037
diff
changeset
|
71 ctx->uid_validity = hdr->uid_validity; |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6267
diff
changeset
|
72 else |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6267
diff
changeset
|
73 cydir_sync_set_uidvalidity(ctx); |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
75 /* mark the newly seen messages as recent */ |
6677
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6453
diff
changeset
|
76 if (mail_index_lookup_seq_range(ctx->sync_view, hdr->first_recent_uid, |
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6453
diff
changeset
|
77 hdr->next_uid, &seq1, &seq2)) { |
6037
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
78 index_mailbox_set_recent_seq(&ctx->mbox->ibox, ctx->sync_view, |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
79 seq1, seq2); |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
80 } |
d911d943438e
Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents:
5779
diff
changeset
|
81 |
6278
ce83635191d4
mail_index_sync_next() can't fail anymore.
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
82 while (mail_index_sync_next(ctx->index_sync_ctx, &sync_rec)) { |
6677
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6453
diff
changeset
|
83 if (!mail_index_lookup_seq_range(ctx->sync_view, |
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6453
diff
changeset
|
84 sync_rec.uid1, sync_rec.uid2, |
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6453
diff
changeset
|
85 &seq1, &seq2)) { |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
86 /* already expunged, nothing to do. */ |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 continue; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
90 switch (sync_rec.type) { |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
91 case MAIL_INDEX_SYNC_TYPE_APPEND: |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
92 /* don't care */ |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
93 break; |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
94 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
6267
diff
changeset
|
95 cydir_sync_expunge(ctx, seq1, seq2); |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
96 break; |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
97 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
98 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
99 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
100 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
101 /* FIXME: should be bother calling sync_notify()? */ |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
102 break; |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
5564
47274663a71c
Call sync_notify() once at the end of syncing. Allow accessing mails even
Timo Sirainen <tss@iki.fi>
parents:
5562
diff
changeset
|
105 |
47274663a71c
Call sync_notify() once at the end of syncing. Allow accessing mails even
Timo Sirainen <tss@iki.fi>
parents:
5562
diff
changeset
|
106 if (box->v.sync_notify != NULL) |
47274663a71c
Call sync_notify() once at the end of syncing. Allow accessing mails even
Timo Sirainen <tss@iki.fi>
parents:
5562
diff
changeset
|
107 box->v.sync_notify(box, 0, 0); |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 int cydir_sync_begin(struct cydir_mailbox *mbox, |
6809
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
111 struct cydir_sync_context **ctx_r, bool force) |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 struct cydir_sync_context *ctx; |
5779
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5743
diff
changeset
|
114 enum mail_index_sync_flags sync_flags; |
6809
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
115 int ret; |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 ctx = i_new(struct cydir_sync_context, 1); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 ctx->mbox = mbox; |
5779
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5743
diff
changeset
|
119 |
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5743
diff
changeset
|
120 sync_flags = MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY; |
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5743
diff
changeset
|
121 if (!mbox->ibox.keep_recent) |
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5743
diff
changeset
|
122 sync_flags |= MAIL_INDEX_SYNC_FLAG_DROP_RECENT; |
6809
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
123 if (!force) |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
124 sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES; |
5779
b25c9ca2142b
mail_index_sync_begin() takes now flags parameter instead of two booleans.
Timo Sirainen <tss@iki.fi>
parents:
5743
diff
changeset
|
125 |
6809
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
126 ret = mail_index_sync_begin(mbox->ibox.index, &ctx->index_sync_ctx, |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
127 &ctx->sync_view, &ctx->trans, |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
128 sync_flags); |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
129 if (ret <= 0) { |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
130 if (ret < 0) |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
131 mail_storage_set_index_error(&mbox->ibox); |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 i_free(ctx); |
6809
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
133 *ctx_r = NULL; |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
134 return ret; |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
6278
ce83635191d4
mail_index_sync_next() can't fail anymore.
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
137 cydir_sync_index(ctx); |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 *ctx_r = ctx; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 return 0; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 int cydir_sync_finish(struct cydir_sync_context **_ctx, bool success) |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 struct cydir_sync_context *ctx = *_ctx; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 int ret = success ? 0 : -1; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 *_ctx = NULL; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 if (success) { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 if (mail_index_sync_commit(&ctx->index_sync_ctx) < 0) { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 mail_storage_set_index_error(&ctx->mbox->ibox); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 ret = -1; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 } else { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 mail_index_sync_rollback(&ctx->index_sync_ctx); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } |
5562
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
156 if (ctx->path != NULL) |
24b751bc0995
Added sync_notify() callback to struct mail_storage. It's now called for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
157 str_free(&ctx->path); |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 i_free(ctx); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 return 0; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
6453
d98617723bc2
Don't sync mailbox when committing transaction. It's not needed.
Timo Sirainen <tss@iki.fi>
parents:
6430
diff
changeset
|
162 static int cydir_sync(struct cydir_mailbox *mbox) |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 struct cydir_sync_context *sync_ctx; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 |
6809
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
166 if (cydir_sync_begin(mbox, &sync_ctx, FALSE) < 0) |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 return -1; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 |
6809
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
169 return sync_ctx == NULL ? 0 : |
9d8c00d4c467
Added MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES flag and changed
Timo Sirainen <tss@iki.fi>
parents:
6677
diff
changeset
|
170 cydir_sync_finish(&sync_ctx, TRUE); |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 } |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 struct mailbox_sync_context * |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 cydir_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 { |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 struct cydir_mailbox *mbox = (struct cydir_mailbox *)box; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 int ret = 0; |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 if (!box->opened) |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 index_storage_mailbox_open(&mbox->ibox); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 |
7291
db65d921b0e1
Check and update sync_last_check in one common function.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
182 if (index_mailbox_want_full_sync(&mbox->ibox, flags)) |
5458
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 ret = cydir_sync(mbox); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 return index_mailbox_sync_init(box, flags, ret < 0); |
daca7ed634c0
Added a simple cydir mail storage backend. It trusts index files completely:
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } |