annotate src/lib-storage/index/dbox-single/sdbox-storage.c @ 12550:2c299c0e3bc8

lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata(). The idea is now that all status items are tracked all the time after mailbox is opened and they can always be looked up without failure. The metadata items are looked up lazily and the lookups may fail at any time. mailbox_get_status() can be used after mailbox_alloc() to indicate that the mailbox doesn't necessarily have to be opened, just that the status fields get returned. If mailbox is already known to be open, mailbox_get_open_status() can be used. It never fails.
author Timo Sirainen <tss@iki.fi>
date Sat, 01 Jan 2011 15:52:39 +0200
parents 9507a067233b
children 4073ccc8123f
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);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
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
52 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
53 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
54 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
55 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
56 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
57 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
58
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 mbox->storage = (struct sdbox_storage *)storage;
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
60 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
61 }
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 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
64 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
65 {
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
66 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
67 const void *data;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 size_t data_size;
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
69 int ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
71 view = mail_index_view_open(mbox->box.index);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
72 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
73 &data, &data_size);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 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
75 (!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
76 if (log_error) {
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
77 mail_storage_set_critical(
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
78 &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
79 "sdbox %s: Invalid dbox header size",
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12414
diff changeset
80 mailbox_get_path(&mbox->box));
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
81 }
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
82 ret = -1;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
83 } else {
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
84 memset(hdr, 0, sizeof(*hdr));
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
85 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
86 ret = 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 }
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
88 mail_index_view_close(&view);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
89 return ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 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
93 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
94 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
95 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 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
97
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 11023
diff changeset
98 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
99 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
100
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 new_hdr = hdr;
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 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
104 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
105 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
106 } 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
107 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
108 }
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 (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
111 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
112 &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
113 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 }
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 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
117 const struct mailbox_update *update,
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
118 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
119 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 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
121 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
122 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
123 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
124
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
125 if (trans == NULL) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
126 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
127 trans = new_trans;
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
128 }
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
129
10657
e7f066508299 lib-storage: Moved struct mail_index_* from index_mailbox to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10656
diff changeset
130 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
131 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
132 uid_validity = update->uid_validity;
11023
46ede677961d sdbox: mailbox_update() could have changed UIDVALIDITY incorrectly.
Timo Sirainen <tss@iki.fi>
parents: 10806
diff changeset
133 else if (hdr->uid_validity != 0)
46ede677961d sdbox: mailbox_update() could have changed UIDVALIDITY incorrectly.
Timo Sirainen <tss@iki.fi>
parents: 10806
diff changeset
134 uid_validity = hdr->uid_validity;
46ede677961d sdbox: mailbox_update() could have changed UIDVALIDITY incorrectly.
Timo Sirainen <tss@iki.fi>
parents: 10806
diff changeset
135 else {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 /* set uidvalidity */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 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
138 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 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
141 if (hdr->uid_validity != 0) {
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
142 /* 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
143 mail_index_reset(trans);
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
144 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 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
146 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
147 &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
148 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 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
150 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
151 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
152 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
153 &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
154 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 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
156 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
157 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
158 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
159 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
160 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
161 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
10731
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
163 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
164 if (new_trans != NULL) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
165 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
166 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
167 mail_index_reset_error(box->index);
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
168 return -1;
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
169 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 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
175 const struct mailbox_update *update,
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
176 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
177 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 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
179 int ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
10652
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
181 mbox->creating = TRUE;
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
182 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
183 mbox->creating = FALSE;
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
184 return ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
187 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
188 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
189 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
190 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
191
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
192 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
193 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
194 file->uid);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
195 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
196
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
197 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
198 {
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
199 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
200 struct sdbox_index_header hdr;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
201
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
202 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
203 mbox->corrupted_rebuild_count = 1;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
204 else
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
205 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
206 }
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
207
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
208 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
209 {
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
210 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
211
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
212 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
213 }
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
214
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
215 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
216 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
217 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
218 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
219
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
220 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
221 return -1;
12521
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
222 mbox->hdr_ext_id =
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
223 mail_index_ext_register(box->index, "dbox-hdr",
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
224 sizeof(struct sdbox_index_header), 0, 0);
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
225
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
226 /* get/generate mailbox guid */
12414
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
227 if (sdbox_read_header(mbox, &hdr, FALSE) < 0) {
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
228 /* it's possible that this mailbox is just now being created
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
229 by another process. lock it first and see if the header is
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
230 available then. */
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
231 struct mail_index_sync_ctx *sync_ctx;
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
232 struct mail_index_view *view;
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
233 struct mail_index_transaction *trans;
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
234
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
235 if (mail_index_sync_begin(box->index, &sync_ctx,
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
236 &view, &trans, 0) > 0)
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
237 (void)mail_index_sync_commit(&sync_ctx);
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
238
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
239 if (sdbox_read_header(mbox, &hdr, TRUE) < 0)
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
240 memset(&hdr, 0, sizeof(hdr));
dbcbf6a46710 sdbox: Fixed race condition when one session opens a mailbox while another is still creating it.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
241 }
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
242
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
243 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
244 /* regenerate it */
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
245 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
246 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
247 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
248 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
249 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
250 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
251 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
252 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
253
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
254 static void sdbox_mailbox_close(struct mailbox *box)
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
255 {
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
256 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
257
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
258 if (mbox->corrupted_rebuild_count != 0)
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
259 (void)sdbox_sync(mbox, 0);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
260 index_storage_mailbox_close(box);
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
261 }
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
262
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
263 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
264 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
265 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
266 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
267 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
268 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
269 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
270 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
271 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
272
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
273 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
274 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
275
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
276 /* 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
277 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
278 return -1;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
279
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
280 /* 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
281 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
282
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
283 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
284 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
285 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
286 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
287
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
288 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
289 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
290 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
291 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
292 (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
293 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
294 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
295 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
296
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
297 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
298 /* 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
299 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
300 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
301
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
302 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
303 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 12174
diff changeset
304
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10676
diff changeset
305 static int
12550
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
306 sdbox_mailbox_get_metadata(struct mailbox *box,
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
307 enum mailbox_metadata_items items,
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
308 struct mailbox_metadata *metadata_r)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 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
311
12550
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
312 if ((items & MAILBOX_METADATA_GUID) != 0) {
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
313 memcpy(metadata_r->guid, mbox->mailbox_guid,
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
314 MAIL_GUID_128_SIZE);
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
315 }
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
316 return index_mailbox_get_metadata(box, items, metadata_r);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 static int
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 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
321 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 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
323 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
324 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 }
10806
c77e71e0c5bd dbox: mailbox_update() ignored cache_fields.
Timo Sirainen <tss@iki.fi>
parents: 10731
diff changeset
326 if (update->cache_fields != NULL)
c77e71e0c5bd dbox: mailbox_update() ignored cache_fields.
Timo Sirainen <tss@iki.fi>
parents: 10731
diff changeset
327 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
328 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
329 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
331 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
332 .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
333 .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
334
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
335 .v = {
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
336 NULL,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
337 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
338 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
339 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
340 NULL,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
341 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
342 NULL,
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
343 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
344 NULL
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
345 }
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
346 };
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11707
diff changeset
347
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 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
349 .name = "dbox", /* alias */
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
350 .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
351
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 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 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
355 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
356 dbox_storage_destroy,
10715
be5590207f20 lib-storage: Changed mailbox_list.iter_is_mailbox() API.
Timo Sirainen <tss@iki.fi>
parents: 10711
diff changeset
357 NULL,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 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
359 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 sdbox_mailbox_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 NULL
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 };
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 struct mailbox sdbox_mailbox = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
366 .v = {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 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
368 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
369 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
370 sdbox_mailbox_open,
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
371 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
372 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
373 dbox_mailbox_create,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 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
375 sdbox_mailbox_delete,
10711
292562f9b12c lib-storage: Mailbox renaming API changed.
Timo Sirainen <tss@iki.fi>
parents: 10710
diff changeset
376 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
377 index_storage_get_status,
12550
2c299c0e3bc8 lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents: 12545
diff changeset
378 sdbox_mailbox_get_metadata,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 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
382 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
383 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
384 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 dbox_notify_changes,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 index_transaction_begin,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 index_transaction_commit,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 index_transaction_rollback,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 dbox_mail_alloc,
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_init,
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_deinit,
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_nonblock,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 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
395 sdbox_save_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 sdbox_save_begin,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 dbox_save_continue,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 sdbox_save_finish,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 sdbox_save_cancel,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 sdbox_copy,
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 };