mdbox-storage.h revision a10ed8c47534b4c6b6bf2711ccfe577e720a47b4
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen#ifndef MDBOX_STORAGE_H
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MDBOX_STORAGE_H
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "index-storage.h"
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen#include "dbox-storage.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "mdbox-settings.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen#define MDBOX_STORAGE_NAME "mdbox"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MDBOX_GLOBAL_INDEX_PREFIX "dovecot.map.index"
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen#define MDBOX_GLOBAL_DIR_NAME "storage"
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen#define MDBOX_MAIL_FILE_PREFIX "m."
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MDBOX_MAIL_FILE_FORMAT MDBOX_MAIL_FILE_PREFIX"%u"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MDBOX_MAX_OPEN_UNUSED_FILES 2
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MDBOX_CLOSE_UNUSED_FILES_TIMEOUT_SECS 30
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen#define MDBOX_INDEX_HEADER_MIN_SIZE (sizeof(uint32_t))
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainenstruct mdbox_index_header {
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen uint32_t map_uid_validity;
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen guid_128_t mailbox_guid;
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mdbox_storage {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct dbox_storage storage;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct mdbox_settings *set;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* paths for storage directories */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const char *storage_dir, *alt_storage_dir;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mdbox_map *map;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ARRAY_DEFINE(open_files, struct mdbox_file *);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct timeout *to_close_unused_files;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ARRAY_TYPE(uint32_t) move_to_alt_map_uids;
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen ARRAY_TYPE(uint32_t) move_from_alt_map_uids;
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen /* if non-zero, storage should be rebuilt (except if rebuild_count
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen has changed from this value) */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t corrupted_rebuild_count;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen unsigned int corrupted:1;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen unsigned int rebuilding_storage:1;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen unsigned int preallocate_space:1;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mdbox_mail_index_record {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t map_uid;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* UNIX timestamp of when the message was saved/copied to this
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mailbox */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t save_date;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mdbox_mailbox {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox box;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mdbox_storage *storage;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t map_uid_validity;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t ext_id, hdr_ext_id, guid_ext_id;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int creating:1;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenextern struct mail_vfuncs mdbox_mail_vfuncs;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
3b49aee9ced3b0370a3be396aca53acd5f21418cTimo Sirainenint mdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r,
3b49aee9ced3b0370a3be396aca53acd5f21418cTimo Sirainen struct dbox_file **file_r);
3b49aee9ced3b0370a3be396aca53acd5f21418cTimo Sirainen
3b49aee9ced3b0370a3be396aca53acd5f21418cTimo Sirainen/* Get map_uid for wanted message. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mdbox_mail_lookup(struct mdbox_mailbox *mbox, struct mail_index_view *view,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t seq, uint32_t *map_uid_r);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenuint32_t dbox_get_uidvalidity_next(struct mailbox_list *list);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mdbox_read_header(struct mdbox_mailbox *mbox,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mdbox_index_header *hdr);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mdbox_update_header(struct mdbox_mailbox *mbox,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_index_transaction *trans,
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen const struct mailbox_update *update) ATTR_NULL(3);
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainenstruct mail_save_context *
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenmdbox_save_alloc(struct mailbox_transaction_context *_t);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mdbox_save_begin(struct mail_save_context *ctx, struct istream *input);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mdbox_save_finish(struct mail_save_context *ctx);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mdbox_save_cancel(struct mail_save_context *ctx);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct dbox_file *
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenmdbox_save_file_get_file(struct mailbox_transaction_context *t,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t seq, uoff_t *offset_r);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mdbox_transaction_save_commit_pre(struct mail_save_context *ctx);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mdbox_transaction_save_commit_post(struct mail_save_context *ctx,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_index_transaction_commit_result *result);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mdbox_transaction_save_rollback(struct mail_save_context *ctx);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mdbox_copy(struct mail_save_context *ctx, struct mail *mail);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mdbox_purge_alt_flag_change(struct mail *mail, bool move_to_alt);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mdbox_purge(struct mail_storage *storage);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainenvoid mdbox_storage_set_corrupted(struct mdbox_storage *storage);
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#endif
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen