diff options
Diffstat (limited to 'src/lib-storage/index/dbox-multi/mdbox-storage.h')
-rw-r--r-- | src/lib-storage/index/dbox-multi/mdbox-storage.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/lib-storage/index/dbox-multi/mdbox-storage.h b/src/lib-storage/index/dbox-multi/mdbox-storage.h new file mode 100644 index 0000000..ea99532 --- /dev/null +++ b/src/lib-storage/index/dbox-multi/mdbox-storage.h @@ -0,0 +1,118 @@ +#ifndef MDBOX_STORAGE_H +#define MDBOX_STORAGE_H + +#include "index-storage.h" +#include "dbox-storage.h" +#include "mdbox-settings.h" + +#define MDBOX_STORAGE_NAME "mdbox" +#define MDBOX_DELETED_STORAGE_NAME "mdbox_deleted" +#define MDBOX_GLOBAL_INDEX_PREFIX "dovecot.map.index" +#define MDBOX_GLOBAL_DIR_NAME "storage" +#define MDBOX_MAIL_FILE_PREFIX "m." +#define MDBOX_MAIL_FILE_FORMAT MDBOX_MAIL_FILE_PREFIX"%u" +#define MDBOX_MAX_OPEN_UNUSED_FILES 2 +#define MDBOX_CLOSE_UNUSED_FILES_TIMEOUT_SECS 30 + +#define MDBOX_INDEX_HEADER_MIN_SIZE (sizeof(uint32_t)) +struct mdbox_index_header { + uint32_t map_uid_validity; + guid_128_t mailbox_guid; + uint8_t flags; /* enum dbox_index_header_flags */ + uint8_t unused[3]; +}; + +struct mdbox_storage { + struct dbox_storage storage; + const struct mdbox_settings *set; + + /* paths for storage directories */ + const char *storage_dir, *alt_storage_dir; + struct mdbox_map *map; + + ARRAY(struct mdbox_file *) open_files; + struct timeout *to_close_unused_files; + + ARRAY_TYPE(uint32_t) move_to_alt_map_uids; + ARRAY_TYPE(uint32_t) move_from_alt_map_uids; + + /* if non-zero, storage should be rebuilt (except if rebuild_count + has changed from this value) */ + uint32_t corrupted_rebuild_count; + + bool corrupted:1; + bool rebuilding_storage:1; + bool preallocate_space:1; +}; + +struct mdbox_mail_index_record { + uint32_t map_uid; + /* UNIX timestamp of when the message was saved/copied to this + mailbox */ + uint32_t save_date; +}; + +struct mdbox_mailbox { + struct mailbox box; + struct mdbox_storage *storage; + + uint32_t map_uid_validity; + uint32_t ext_id, hdr_ext_id, guid_ext_id; + + bool mdbox_deleted_synced:1; + bool creating:1; +}; + +#define MDBOX_DBOX_STORAGE(s) container_of(s, struct mdbox_storage, storage) +#define MDBOX_STORAGE(s) MDBOX_DBOX_STORAGE(DBOX_STORAGE(s)) +#define MDBOX_MAILBOX(s) container_of(s, struct mdbox_mailbox, box) + +extern struct dbox_storage_vfuncs mdbox_dbox_storage_vfuncs; +extern struct mail_vfuncs mdbox_mail_vfuncs; + +int mdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r, + struct dbox_file **file_r); + +/* Get map_uid for wanted message. */ +int mdbox_mail_lookup(struct mdbox_mailbox *mbox, struct mail_index_view *view, + uint32_t seq, uint32_t *map_uid_r); +uint32_t dbox_get_uidvalidity_next(struct mailbox_list *list); +int mdbox_read_header(struct mdbox_mailbox *mbox, + struct mdbox_index_header *hdr, bool *need_resize_r); +void mdbox_update_header(struct mdbox_mailbox *mbox, + struct mail_index_transaction *trans, + const struct mailbox_update *update) ATTR_NULL(3); +int mdbox_mailbox_create_indexes(struct mailbox *box, + const struct mailbox_update *update, + struct mail_index_transaction *trans); + +struct mail_save_context * +mdbox_save_alloc(struct mailbox_transaction_context *_t); +int mdbox_save_begin(struct mail_save_context *ctx, struct istream *input); +int mdbox_save_finish(struct mail_save_context *ctx); +void mdbox_save_cancel(struct mail_save_context *ctx); + +struct dbox_file * +mdbox_save_file_get_file(struct mailbox_transaction_context *t, + uint32_t seq, uoff_t *offset_r); + +int mdbox_transaction_save_commit_pre(struct mail_save_context *ctx); +void mdbox_transaction_save_commit_post(struct mail_save_context *ctx, + struct mail_index_transaction_commit_result *result); +void mdbox_transaction_save_rollback(struct mail_save_context *ctx); + +int mdbox_copy(struct mail_save_context *ctx, struct mail *mail); + +void mdbox_purge_alt_flag_change(struct mail *mail, bool move_to_alt); +int mdbox_purge(struct mail_storage *storage); + +int mdbox_storage_create(struct mail_storage *_storage, + struct mail_namespace *ns, const char **error_r); +void mdbox_storage_destroy(struct mail_storage *_storage); +int mdbox_mailbox_open(struct mailbox *box); + +void mdbox_storage_set_corrupted(struct mdbox_storage *storage); +void mdbox_set_mailbox_corrupted(struct mailbox *box); +void mdbox_set_file_corrupted(struct dbox_file *file); + +#endif |