annotate src/lib-storage/index/dbox-single/sdbox-storage.c @ 12312:28eaaa23f2c6

lib-storage: Added support for saving mail attachments separately via filesystem API. Currently this works only with sdbox and mdbox backends.
author Timo Sirainen <tss@iki.fi>
date Tue, 19 Oct 2010 18:47:17 +0100
parents 1070b54b9471
children dbcbf6a46710
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: 10410
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"
11132
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11024
diff changeset
4 #include "master-service.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "mail-index-modseq.h"
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
6 #include "mail-search-build.h"
11476
3e51c846f293 Avoid including mailbox-list-private.h everywhere.
Timo Sirainen <tss@iki.fi>
parents: 11216
diff changeset
7 #include "mailbox-list-private.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "dbox-mail.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "dbox-save.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #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
11 #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
12 #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
13
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
14 extern struct mail_storage dbox_storage, sdbox_storage;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 extern struct mailbox sdbox_mailbox;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 extern struct dbox_storage_vfuncs sdbox_dbox_storage_vfuncs;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 static struct mail_storage *sdbox_storage_alloc(void)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 struct sdbox_storage *storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 pool_t pool;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
23 pool = pool_alloconly_create("sdbox storage", 512+256);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 storage = p_new(pool, struct sdbox_storage, 1);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 storage->storage.v = sdbox_dbox_storage_vfuncs;
12174
1070b54b9471 sdbox: Use "sdbox" name in the internal storage structure.
Timo Sirainen <tss@iki.fi>
parents: 11824
diff changeset
26 storage->storage.storage = sdbox_storage;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 storage->storage.storage.pool = pool;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 return &storage->storage.storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
10690
b7c8221cea5b lib-storage: Removed input parameter from mailbox_alloc(), added mailbox_open_stream()
Timo Sirainen <tss@iki.fi>
parents: 10685
diff changeset
31 static struct mailbox *
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 sdbox_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
10690
b7c8221cea5b lib-storage: Removed input parameter from mailbox_alloc(), added mailbox_open_stream()
Timo Sirainen <tss@iki.fi>
parents: 10685
diff changeset
33 const char *name, enum mailbox_flags flags)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 struct sdbox_mailbox *mbox;
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
36 struct index_mailbox_context *ibox;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 pool_t pool;
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 /* dbox can't work without index files */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 flags &= ~MAILBOX_FLAG_NO_INDEX_FILES;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
42 pool = pool_alloconly_create("sdbox mailbox", 1024*3);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 mbox = p_new(pool, struct sdbox_mailbox, 1);
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
44 mbox->box = sdbox_mailbox;
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
45 mbox->box.pool = pool;
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
46 mbox->box.storage = storage;
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
47 mbox->box.list = list;
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
48 mbox->box.mail_vfuncs = &sdbox_mail_vfuncs;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
10690
b7c8221cea5b lib-storage: Removed input parameter from mailbox_alloc(), added mailbox_open_stream()
Timo Sirainen <tss@iki.fi>
parents: 10685
diff changeset
50 index_storage_mailbox_alloc(&mbox->box, name, flags, DBOX_INDEX_PREFIX);
11634
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
51 mail_index_set_fsync_mode(mbox->box.index,
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
52 storage->set->parsed_fsync_mode,
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
53 MAIL_INDEX_SYNC_TYPE_APPEND |
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
54 MAIL_INDEX_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
55
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
56 ibox = INDEX_STORAGE_CONTEXT(&mbox->box);
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
57 ibox->save_commit_pre = sdbox_transaction_save_commit_pre;
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
58 ibox->save_commit_post = sdbox_transaction_save_commit_post;
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
59 ibox->save_rollback = sdbox_transaction_save_rollback;
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
60 ibox->index_flags |= MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS |
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 mbox->storage = (struct sdbox_storage *)storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 mbox->hdr_ext_id =
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
65 mail_index_ext_register(mbox->box.index, "dbox-hdr",
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 sizeof(struct sdbox_index_header), 0, 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
67 return &mbox->box;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 int sdbox_read_header(struct sdbox_mailbox *mbox,
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
71 struct sdbox_index_header *hdr, 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
72 {
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
73 struct mail_index_view *view;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 const void *data;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 size_t data_size;
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
76 int ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
78 view = mail_index_view_open(mbox->box.index);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
79 mail_index_get_header_ext(view, mbox->hdr_ext_id,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 &data, &data_size);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 if (data_size < SDBOX_INDEX_HEADER_MIN_SIZE &&
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 (!mbox->creating || data_size != 0)) {
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
83 if (log_error) {
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
84 mail_storage_set_critical(
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
85 &mbox->storage->storage.storage,
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
86 "sdbox %s: Invalid dbox header size",
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
87 mbox->box.path);
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
88 }
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
89 ret = -1;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
90 } else {
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
91 memset(hdr, 0, sizeof(*hdr));
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
92 memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr)));
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
93 ret = 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 }
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
95 mail_index_view_close(&view);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
96 return ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 }
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 void sdbox_update_header(struct sdbox_mailbox *mbox,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 struct mail_index_transaction *trans,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 const struct mailbox_update *update)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 struct sdbox_index_header hdr, new_hdr;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
105 if (sdbox_read_header(mbox, &hdr, TRUE) < 0)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 memset(&hdr, 0, sizeof(hdr));
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 new_hdr = hdr;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if (update != NULL && !mail_guid_128_is_empty(update->mailbox_guid)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 memcpy(new_hdr.mailbox_guid, update->mailbox_guid,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 sizeof(new_hdr.mailbox_guid));
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 } else if (mail_guid_128_is_empty(new_hdr.mailbox_guid)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 mail_generate_guid_128(new_hdr.mailbox_guid);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 if (memcmp(&hdr, &new_hdr, sizeof(hdr)) != 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 mail_index_update_header_ext(trans, mbox->hdr_ext_id, 0,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 &new_hdr, sizeof(new_hdr));
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 }
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 static int sdbox_write_index_header(struct mailbox *box,
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
124 const struct mailbox_update *update,
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
125 struct mail_index_transaction *trans)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
128 struct mail_index_transaction *new_trans = NULL;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 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
130 uint32_t uid_validity, uid_next;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
132 if (trans == NULL) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
133 new_trans = mail_index_transaction_begin(box->view, 0);
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
134 trans = new_trans;
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
135 }
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
136
10657
e7f066508299 lib-storage: Moved struct mail_index_* from index_mailbox to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10656
diff changeset
137 hdr = mail_index_get_header(box->view);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 if (update != NULL && update->uid_validity != 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 uid_validity = update->uid_validity;
11023
46ede677961d sdbox: mailbox_update() could have changed UIDVALIDITY incorrectly.
Timo Sirainen <tss@iki.fi>
parents: 10806
diff changeset
140 else if (hdr->uid_validity != 0)
46ede677961d sdbox: mailbox_update() could have changed UIDVALIDITY incorrectly.
Timo Sirainen <tss@iki.fi>
parents: 10806
diff changeset
141 uid_validity = hdr->uid_validity;
46ede677961d sdbox: mailbox_update() could have changed UIDVALIDITY incorrectly.
Timo Sirainen <tss@iki.fi>
parents: 10806
diff changeset
142 else {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 /* set uidvalidity */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 uid_validity = dbox_get_uidvalidity_next(box->list);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 if (hdr->uid_validity != uid_validity) {
10731
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
148 if (hdr->uid_validity != 0) {
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
149 /* UIDVALIDITY change requires index to be reset */
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
150 mail_index_reset(trans);
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
151 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 mail_index_update_header(trans,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 offsetof(struct mail_index_header, uid_validity),
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 &uid_validity, sizeof(uid_validity), TRUE);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 if (update != NULL && hdr->next_uid < update->min_next_uid) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 uid_next = update->min_next_uid;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 mail_index_update_header(trans,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 offsetof(struct mail_index_header, next_uid),
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 &uid_next, sizeof(uid_next), TRUE);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 if (update != NULL && update->min_highest_modseq != 0 &&
10657
e7f066508299 lib-storage: Moved struct mail_index_* from index_mailbox to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10656
diff changeset
163 mail_index_modseq_get_highest(box->view) <
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 update->min_highest_modseq) {
11707
3f9435c616e4 lib-storage: When mailbox_update() sets highest-modseq, make sure modseqs are enabled.
Timo Sirainen <tss@iki.fi>
parents: 11658
diff changeset
165 mail_index_modseq_enable(box->index);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 mail_index_update_highest_modseq(trans,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 update->min_highest_modseq);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169
10731
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
170 sdbox_update_header(mbox, trans, update);
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
171 if (new_trans != NULL) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
172 if (mail_index_transaction_commit(&new_trans) < 0) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
173 mail_storage_set_internal_error(box->storage);
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
174 mail_index_reset_error(box->index);
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
175 return -1;
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
176 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 static int sdbox_mailbox_create_indexes(struct mailbox *box,
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
182 const struct mailbox_update *update,
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
183 struct mail_index_transaction *trans)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 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
186 int ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
10652
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
188 mbox->creating = TRUE;
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
189 ret = sdbox_write_index_header(box, update, trans);
10652
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
190 mbox->creating = FALSE;
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
191 return ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
194 static const char *
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
195 sdbox_get_attachment_path_suffix(struct dbox_file *_file)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
196 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
197 struct sdbox_file *file = (struct sdbox_file *)_file;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
198
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
199 return t_strdup_printf("-%s-%u",
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
200 mail_guid_128_to_string(file->mbox->mailbox_guid),
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
201 file->uid);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
202 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
203
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
204 static void sdbox_set_mailbox_corrupted(struct mailbox *box)
11216
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
205 {
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
206 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
207 struct sdbox_index_header hdr;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
208
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
209 if (sdbox_read_header(mbox, &hdr, TRUE) < 0 || hdr.rebuild_count == 0)
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
210 mbox->corrupted_rebuild_count = 1;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
211 else
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
212 mbox->corrupted_rebuild_count = hdr.rebuild_count;
11216
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
213 }
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
214
11652
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
215 static void sdbox_set_file_corrupted(struct dbox_file *_file)
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
216 {
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
217 struct sdbox_file *file = (struct sdbox_file *)_file;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
218
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
219 sdbox_set_mailbox_corrupted(&file->mbox->box);
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
220 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
221
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
222 static int sdbox_mailbox_open(struct mailbox *box)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
223 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
224 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
225 struct sdbox_index_header hdr;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
226
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
227 if (dbox_mailbox_open(box) < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
228 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
229
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
230 /* get/generate mailbox guid */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
231 if (sdbox_read_header(mbox, &hdr, TRUE) < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
232 memset(&hdr, 0, sizeof(hdr));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
233
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
234 if (mail_guid_128_is_empty(hdr.mailbox_guid)) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
235 /* regenerate it */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
236 if (sdbox_write_index_header(box, NULL, NULL) < 0 ||
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
237 sdbox_read_header(mbox, &hdr, TRUE) < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
238 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
239 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
240 memcpy(mbox->mailbox_guid, hdr.mailbox_guid,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
241 sizeof(mbox->mailbox_guid));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
242 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
243 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
244
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
245 static void sdbox_mailbox_close(struct mailbox *box)
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
246 {
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
247 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
248
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
249 if (mbox->corrupted_rebuild_count != 0)
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
250 (void)sdbox_sync(mbox, 0);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
251 index_storage_mailbox_close(box);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
252 }
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
253
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
254 static int sdbox_mailbox_delete(struct mailbox *box)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
255 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
256 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
257 struct mail_search_context *ctx;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
258 struct mailbox_transaction_context *t;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
259 struct mail *mail;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
260 struct mail_search_args *search_args;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
261 struct dbox_file *file;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
262 struct sdbox_file *sfile;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
263
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
264 if (!box->opened || mbox->storage->storage.attachment_dir == NULL)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
265 return index_storage_mailbox_delete(box);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
266
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
267 /* mark the mailbox deleted to avoid race conditions */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
268 if (mailbox_mark_index_deleted(box, TRUE) < 0)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
269 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
270
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
271 /* ulink all dbox mails and their attachements in the mailbox. */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
272 t = mailbox_transaction_begin(box, 0);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
273
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
274 search_args = mail_search_build_init();
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
275 mail_search_build_add_all(search_args);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
276 ctx = mailbox_search_init(t, search_args, NULL);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
277 mail_search_args_unref(&search_args);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
278
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
279 mail = mail_alloc(t, 0, NULL);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
280 while (mailbox_search_next(ctx, mail)) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
281 file = sdbox_file_init(mbox, mail->uid);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
282 sfile = (struct sdbox_file *)file;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
283 (void)sdbox_file_unlink_with_attachments(sfile);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
284 dbox_file_unref(&file);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
285 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
286 mail_free(&mail);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
287
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
288 if (mailbox_search_deinit(&ctx) < 0) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
289 /* maybe we missed some mails. oh well, can't help it. */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
290 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
291 mailbox_transaction_rollback(&t);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
292
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
293 return index_storage_mailbox_delete(box);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
294 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
295
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10676
diff changeset
296 static int
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10676
diff changeset
297 sdbox_mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE])
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 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
300
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
301 memcpy(guid, mbox->mailbox_guid, MAIL_GUID_128_SIZE);
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10676
diff changeset
302 return 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 static int
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 dbox_mailbox_update(struct mailbox *box, const struct mailbox_update *update)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 if (!box->opened) {
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
309 if (index_storage_mailbox_open(box, FALSE) < 0)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 }
10806
c77e71e0c5bd dbox: mailbox_update() ignored cache_fields.
Timo Sirainen <tss@iki.fi>
parents: 10731
diff changeset
312 if (update->cache_fields != NULL)
c77e71e0c5bd dbox: mailbox_update() ignored cache_fields.
Timo Sirainen <tss@iki.fi>
parents: 10731
diff changeset
313 index_storage_mailbox_update_cache_fields(box, update);
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
314 return sdbox_write_index_header(box, update, NULL);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
317 struct mail_storage sdbox_storage = {
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
318 .name = SDBOX_STORAGE_NAME,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
319 .class_flags = 0,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
320
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
321 .v = {
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
322 NULL,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
323 sdbox_storage_alloc,
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
324 dbox_storage_create,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
325 dbox_storage_destroy,
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
326 NULL,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
327 dbox_storage_get_list_settings,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
328 NULL,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
329 sdbox_mailbox_alloc,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
330 NULL
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
331 }
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
332 };
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
333
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 struct mail_storage dbox_storage = {
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
335 .name = "dbox", /* alias */
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
336 .class_flags = 0,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
338 .v = {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 sdbox_storage_alloc,
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
341 dbox_storage_create,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
342 dbox_storage_destroy,
10715
be5590207f20 lib-storage: Changed mailbox_list.iter_is_mailbox() API.
Timo Sirainen <tss@iki.fi>
parents: 10711
diff changeset
343 NULL,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 dbox_storage_get_list_settings,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 sdbox_mailbox_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 NULL
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 };
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 struct mailbox sdbox_mailbox = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
352 .v = {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 index_storage_is_readonly,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 index_storage_allow_new_keywords,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 index_storage_mailbox_enable,
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
356 sdbox_mailbox_open,
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
357 sdbox_mailbox_close,
10719
debbf3f39e0c lib-storage: Use a default non-NULL mailbox.free() so plugins don't have to check for it.
Timo Sirainen <tss@iki.fi>
parents: 10718
diff changeset
358 index_storage_mailbox_free,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 dbox_mailbox_create,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 dbox_mailbox_update,
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
361 sdbox_mailbox_delete,
10711
292562f9b12c lib-storage: Mailbox renaming API changed.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
362 index_storage_mailbox_rename,
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10676
diff changeset
363 index_storage_get_status,
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10676
diff changeset
364 sdbox_mailbox_get_guid,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 sdbox_storage_sync_init,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 index_mailbox_sync_next,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 index_mailbox_sync_deinit,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 dbox_notify_changes,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 index_transaction_begin,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 index_transaction_commit,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 index_transaction_rollback,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 index_transaction_set_max_modseq,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 index_keywords_create,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 index_keywords_create_from_indexes,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 index_keywords_ref,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 index_keywords_unref,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 index_keyword_is_valid,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 index_storage_get_seq_range,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 index_storage_get_uid_range,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 index_storage_get_expunges,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 dbox_mail_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 index_header_lookup_init,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 index_header_lookup_deinit,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 index_storage_search_init,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 index_storage_search_deinit,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 index_storage_search_next_nonblock,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 index_storage_search_next_update_seq,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 sdbox_save_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 sdbox_save_begin,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 dbox_save_continue,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 sdbox_save_finish,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 sdbox_save_cancel,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 sdbox_copy,
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
400 NULL,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 index_storage_is_inconsistent
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 };
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 struct dbox_storage_vfuncs sdbox_dbox_storage_vfuncs = {
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
406 sdbox_file_free,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 sdbox_file_create_fd,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 sdbox_mail_open,
11216
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
409 sdbox_mailbox_create_indexes,
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
410 sdbox_get_attachment_path_suffix,
11652
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11634
diff changeset
411 sdbox_set_mailbox_corrupted,
11216
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
412 sdbox_set_file_corrupted
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 };