annotate src/lib-storage/index/dbox-multi/mdbox-storage.c @ 11170:c2c2c1dd252e HEAD

mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
author Timo Sirainen <tss@iki.fi>
date Mon, 19 Apr 2010 16:15:57 +0300
parents 3d585e69aa95
children a92389387cb7
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"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
10877
f1a2a8097903 Compiler warning fix.
Timo Sirainen <tss@iki.fi>
parents: 10868
diff changeset
5 #include "ioloop.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mkdir-parents.h"
11132
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
7 #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
8 #include "mail-index-modseq.h"
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
9 #include "mail-index-alloc-cache.h"
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
10 #include "mailbox-log.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #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
12 #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
13 #include "mdbox-map.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "mdbox-file.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "mdbox-sync.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "mdbox-storage-rebuild.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "mdbox-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 extern struct mail_storage mdbox_storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 extern struct mailbox mdbox_mailbox;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 extern struct dbox_storage_vfuncs mdbox_dbox_storage_vfuncs;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 static struct mail_storage *mdbox_storage_alloc(void)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct mdbox_storage *storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 pool_t pool;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
10684
e202b2b86702 Increased initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 10676
diff changeset
28 pool = pool_alloconly_create("mdbox storage", 2048);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 storage = p_new(pool, struct mdbox_storage, 1);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 storage->storage.v = mdbox_dbox_storage_vfuncs;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 storage->storage.storage = mdbox_storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 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
33 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
34 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 static int
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 mdbox_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 const char **error_r)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 struct mdbox_storage *storage = (struct mdbox_storage *)_storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 const char *dir;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 storage->set = mail_storage_get_driver_settings(_storage);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 if (*ns->list->set.mailbox_dir_name == '\0') {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 *error_r = "dbox: MAILBOXDIR must not be empty";
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
11132
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
50 #ifndef HAVE_FLOCK
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
51 if (master_service_get_client_limit(master_service) > 1) {
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
52 *error_r = "mdbox requires client_limit=1 for service "
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
53 "since your OS doesn't support flock()";
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
54 return -1;
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
55 }
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
56 #endif
3d585e69aa95 dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents: 11127
diff changeset
57
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 _storage->unique_root_dir =
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 p_strdup(_storage->pool, ns->list->set.root_dir);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 dir = mailbox_list_get_path(ns->list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 storage->storage_dir = p_strconcat(_storage->pool, dir,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 "/"MDBOX_GLOBAL_DIR_NAME, NULL);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 storage->alt_storage_dir = p_strconcat(_storage->pool,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 ns->list->set.alt_dir,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 "/"MDBOX_GLOBAL_DIR_NAME, NULL);
10868
863eafcf8428 mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents: 10805
diff changeset
67 i_array_init(&storage->open_files, 64);
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 storage->map = dbox_map_init(storage, ns->list, storage->storage_dir);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 static void mdbox_storage_destroy(struct mail_storage *_storage)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 struct mdbox_storage *storage = (struct mdbox_storage *)_storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 mdbox_files_free(storage);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 dbox_map_deinit(&storage->map);
10868
863eafcf8428 mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents: 10805
diff changeset
79 if (storage->to_close_unused_files != NULL)
863eafcf8428 mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents: 10805
diff changeset
80 timeout_remove(&storage->to_close_unused_files);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 array_free(&storage->open_files);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 struct mailbox *
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 mdbox_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
86 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
87 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 struct mdbox_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
89 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
90 pool_t pool;
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 /* 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
93 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
94
10726
44759fb882aa lib-storage: Increased initial mailbox pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 10719
diff changeset
95 pool = pool_alloconly_create("mdbox 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
96 mbox = p_new(pool, struct mdbox_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
97 mbox->box = mdbox_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
98 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
99 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
100 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
101 mbox->box.mail_vfuncs = &mdbox_mail_vfuncs;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
10690
b7c8221cea5b lib-storage: Removed input parameter from mailbox_alloc(), added mailbox_open_stream()
Timo Sirainen <tss@iki.fi>
parents: 10685
diff changeset
103 index_storage_mailbox_alloc(&mbox->box, name, flags, DBOX_INDEX_PREFIX);
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
104 mail_index_set_fsync_types(mbox->box.index,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 MAIL_INDEX_SYNC_TYPE_APPEND |
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 MAIL_INDEX_SYNC_TYPE_EXPUNGE);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
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
108 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
109 ibox->save_commit_pre = mdbox_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
110 ibox->save_commit_post = mdbox_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
111 ibox->save_rollback = mdbox_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
112 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
113 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
114
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 mbox->storage = (struct mdbox_storage *)storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 mbox->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
117 mail_index_ext_register(mbox->box.index, "mdbox", 0,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 sizeof(struct mdbox_mail_index_record),
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 sizeof(uint32_t));
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 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
121 mail_index_ext_register(mbox->box.index, "mdbox-hdr",
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 sizeof(struct mdbox_index_header), 0, 0);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 mbox->guid_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
124 mail_index_ext_register(mbox->box.index, "guid",
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 0, MAIL_GUID_128_SIZE, 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
126 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
127 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
10975
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
129 static void mdbox_mailbox_close(struct mailbox *box)
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
130 {
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
131 struct mdbox_storage *mstorage = (struct mdbox_storage *)box->storage;
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
132
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
133 if (mstorage->storage.files_corrupted &&
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
134 !mstorage->rebuilding_storage)
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
135 (void)mdbox_storage_rebuild(mstorage);
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
136
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
137 index_storage_mailbox_close(box);
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
138 }
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
139
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 int mdbox_read_header(struct mdbox_mailbox *mbox,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 struct mdbox_index_header *hdr)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 const void *data;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 size_t data_size;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145
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
146 mail_index_get_header_ext(mbox->box.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
147 &data, &data_size);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 if (data_size < MDBOX_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
149 (!mbox->creating || data_size != 0)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 mail_storage_set_critical(&mbox->storage->storage.storage,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 "dbox %s: Invalid dbox header size",
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
152 mbox->box.path);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 return -1;
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 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
156 memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr)));
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 void mdbox_update_header(struct mdbox_mailbox *mbox,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 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
162 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
163 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 struct mdbox_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
165
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 if (mdbox_read_header(mbox, &hdr) < 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 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
168
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 new_hdr = hdr;
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 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
172 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
173 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
174 } 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
175 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
176 }
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 new_hdr.map_uid_validity =
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 dbox_map_get_uid_validity(mbox->storage->map);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 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
181 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
182 &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
183 }
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 static int mdbox_write_index_header(struct mailbox *box,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 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
188 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 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
191 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
192 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
193
11127
2200450752bd mdbox: Purging shouldn't give "unknown error" if mdbox storage doesn't exist.
Timo Sirainen <tss@iki.fi>
parents: 10975
diff changeset
194 if (dbox_map_open_or_create(mbox->storage->map) < 0)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
10657
e7f066508299 lib-storage: Moved struct mail_index_* from index_mailbox to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10656
diff changeset
197 hdr = mail_index_get_header(box->view);
e7f066508299 lib-storage: Moved struct mail_index_* from index_mailbox to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10656
diff changeset
198 trans = mail_index_transaction_begin(box->view, 0);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
10350
d1d810348e65 mdbox: mailbox_update() was updating uidvalidity to random values.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
200 uid_validity = hdr->uid_validity;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 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
202 uid_validity = update->uid_validity;
10350
d1d810348e65 mdbox: mailbox_update() was updating uidvalidity to random values.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
203 else if (uid_validity == 0) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 /* set uidvalidity */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 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
206 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 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
209 if (hdr->uid_validity != 0) {
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
210 /* 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
211 mail_index_reset(trans);
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
212 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 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
214 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
215 &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
216 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 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
218 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
219 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
220 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
221 &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
222 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 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
224 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
225 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
226 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
227 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
228 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
10731
a3ec94b25456 mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents: 10726
diff changeset
230 mdbox_update_header(mbox, trans, update);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 if (mail_index_transaction_commit(&trans) < 0) {
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
232 mail_storage_set_index_error(box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 static int mdbox_mailbox_create_indexes(struct mailbox *box,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 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
240 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 int ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
10652
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
244 mbox->creating = TRUE;
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
245 ret = mdbox_write_index_header(box, update);
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
246 mbox->creating = FALSE;
bdb1ea37ccee dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
247 return ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10684
diff changeset
250 static int
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10684
diff changeset
251 mdbox_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
252 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 struct mdbox_index_header hdr;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 if (mdbox_read_header(mbox, &hdr) < 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 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
258
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 if (mail_guid_128_is_empty(hdr.mailbox_guid)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 /* regenerate it */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 if (mdbox_write_index_header(box, NULL) < 0 ||
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 mdbox_read_header(mbox, &hdr) < 0)
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10684
diff changeset
263 return -1;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 }
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10684
diff changeset
265 memcpy(guid, hdr.mailbox_guid, MAIL_GUID_128_SIZE);
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10684
diff changeset
266 return 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 static int
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 mdbox_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
271 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 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
273 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
274 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 }
10805
58e9e66050e9 mdbox: mailbox_update() ignored cache_fields.
Timo Sirainen <tss@iki.fi>
parents: 10731
diff changeset
276 if (update->cache_fields != NULL)
58e9e66050e9 mdbox: mailbox_update() ignored cache_fields.
Timo Sirainen <tss@iki.fi>
parents: 10731
diff changeset
277 index_storage_mailbox_update_cache_fields(box, update);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 return mdbox_write_index_header(box, update);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
281 static int mdbox_mailbox_unref_mails(struct mdbox_mailbox *mbox)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 {
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
283 struct dbox_map_transaction_context *map_trans;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 const struct mail_index_header *hdr;
11170
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
285 uint32_t seq, map_uid;
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
286 int ret = 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
11170
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
288 map_trans = dbox_map_transaction_begin(mbox->storage->map, FALSE);
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
289 hdr = mail_index_get_header(mbox->box.view);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 for (seq = 1; seq <= hdr->messages_count; seq++) {
11170
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
291 if (mdbox_mail_lookup(mbox, mbox->box.view, seq,
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
292 &map_uid) < 0) {
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
293 ret = -1;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 break;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 }
11170
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
296
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
297 if (dbox_map_update_refcount(map_trans, map_uid, -1) < 0) {
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
298 ret = -1;
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
299 break;
c2c2c1dd252e mdbox: Optimization: Don't update map UIDs' refcounts via array when it's not necessary.
Timo Sirainen <tss@iki.fi>
parents: 11132
diff changeset
300 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 if (ret == 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 ret = dbox_map_transaction_commit(map_trans);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 dbox_map_transaction_free(&map_trans);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 return ret;
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
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
309 static int mdbox_mailbox_delete(struct mailbox *box)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 {
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
311 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
313 if (box->opened) {
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
314 if (mdbox_mailbox_unref_mails(mbox) < 0)
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
315 return -1;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 }
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
317 return index_storage_mailbox_delete(box);
9977
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 struct mail_storage mdbox_storage = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10350
diff changeset
321 .name = MDBOX_STORAGE_NAME,
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10350
diff changeset
322 .class_flags = MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10350
diff changeset
324 .v = {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 mdbox_get_setting_parser_info,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 mdbox_storage_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 mdbox_storage_create,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 mdbox_storage_destroy,
10715
be5590207f20 lib-storage: Changed mailbox_list.iter_is_mailbox() API.
Timo Sirainen <tss@iki.fi>
parents: 10711
diff changeset
329 NULL,
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 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
331 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 mdbox_mailbox_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 mdbox_sync_purge
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 };
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 struct mailbox mdbox_mailbox = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 10350
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 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
340 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
341 index_storage_mailbox_enable,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 dbox_mailbox_open,
10975
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10877
diff changeset
343 mdbox_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
344 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
345 dbox_mailbox_create,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 mdbox_mailbox_update,
10676
1fd7833c16ca lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents: 10662
diff changeset
347 mdbox_mailbox_delete,
10711
292562f9b12c lib-storage: Mailbox renaming API changed.
Timo Sirainen <tss@iki.fi>
parents: 10690
diff changeset
348 index_storage_mailbox_rename,
10685
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10684
diff changeset
349 index_storage_get_status,
3609c8a35c36 lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents: 10684
diff changeset
350 mdbox_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
351 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 mdbox_storage_sync_init,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 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
355 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
356 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 dbox_notify_changes,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 index_transaction_begin,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 index_transaction_commit,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 index_transaction_rollback,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 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
362 index_keywords_create,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 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
364 index_keywords_ref,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 index_keywords_unref,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 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
367 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
368 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
369 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
370 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 NULL,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 dbox_mail_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 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
375 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
376 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
377 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
378 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
379 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
380 mdbox_save_alloc,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 mdbox_save_begin,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 dbox_save_continue,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 mdbox_save_finish,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 mdbox_save_cancel,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 mdbox_copy,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 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
387 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 };
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 struct dbox_storage_vfuncs mdbox_dbox_storage_vfuncs = {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 mdbox_file_unrefed,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 mdbox_file_create_fd,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 mdbox_mail_open,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 mdbox_mailbox_create_indexes
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 };