dbox-storage.h revision 4dec2a9f173755b475550f4af858bfe073e76518
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen#ifndef __DBOX_STORAGE_H
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen#define __DBOX_STORAGE_H
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen#include "index-storage.h"
70ead6466f9baa8294e71fc2fba0a4f54f488b5eTimo Sirainen#include "mailbox-list-private.h"
a020eb653b2620a989e4795adceb6136037327b2Timo Sirainen#include "dbox-format.h"
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen
dd7cbb32412c2f4d2d223af66672535bc1237246Timo Sirainen#define DBOX_STORAGE_NAME "dbox"
57f5683fd9dc9bc79816c418bb30fdbc33b68a8cTimo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenstruct dbox_uidlist;
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8Timo Sirainenstruct dbox_storage {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct mail_storage storage;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen union mailbox_list_module_context list_module_ctx;
1701b354e81ff1dfd0b6c7bb4412b8d9c2b9f986Timo Sirainen
1701b354e81ff1dfd0b6c7bb4412b8d9c2b9f986Timo Sirainen struct dotlock_settings uidlist_dotlock_set;
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen struct dotlock_settings file_dotlock_set;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen struct dotlock_settings new_file_dotlock_set;
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstruct keyword_map {
87ca4b209c10954826b878da165d303d9b4dc5a2Timo Sirainen unsigned int index_idx;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen unsigned int file_idx;
70ead6466f9baa8294e71fc2fba0a4f54f488b5eTimo Sirainen};
1ae5d61ec366fdb2f3c5b150ca378d6141b0f4bdTimo Sirainen
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainenstruct dbox_file {
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen uint32_t file_seq;
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen char *path;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen int fd;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen struct istream *input;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen struct ostream *output; /* while appending mails */
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen uint16_t base_header_size;
c4478af52de63804efef2055580adf1dfc8679c6Timo Sirainen uint32_t header_size;
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen time_t create_time;
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen uint64_t append_offset;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen uint16_t mail_header_size;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen uint16_t mail_header_align;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen uint16_t keyword_count;
379175cfba8150d481d9898b78330b719d128d84Timo Sirainen uint64_t keyword_list_offset;
379175cfba8150d481d9898b78330b719d128d84Timo Sirainen uint32_t keyword_list_size_alloc;
379175cfba8150d481d9898b78330b719d128d84Timo Sirainen uint32_t keyword_list_size_used;
379175cfba8150d481d9898b78330b719d128d84Timo Sirainen struct dbox_file_header hdr;
379175cfba8150d481d9898b78330b719d128d84Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen uoff_t seeked_offset;
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen uoff_t seeked_mail_size;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen uint32_t seeked_uid;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen struct dbox_mail_header seeked_mail_header;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen unsigned char *seeked_keywords;
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen /* Keywords list, sorted by index_idx. */
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen ARRAY_DEFINE(idx_file_keywords, struct keyword_map);
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen /* idx -> index_idx array */
4c892b0d94c5b1d6853dbe8e0b38059ea5b08ecaTimo Sirainen ARRAY_DEFINE(file_idx_keywords, unsigned int);
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen};
33bd898e7756b289e65f43133312d9637afc1371Timo Sirainen
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainenstruct dbox_mailbox {
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen struct index_mailbox ibox;
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen struct dbox_storage *storage;
4c892b0d94c5b1d6853dbe8e0b38059ea5b08ecaTimo Sirainen struct dbox_uidlist *uidlist;
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen const char *path;
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen struct timeout *keep_lock_to;
013a8a91c83c6ea24bc75322b81235f19e26fa8fTimo Sirainen
d9076f5939edf5d20a261494b1a861dcbb0d32e2Timo Sirainen struct dbox_file *file;
a020eb653b2620a989e4795adceb6136037327b2Timo Sirainen uint32_t dbox_file_ext_idx;
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen uint32_t dbox_offset_ext_idx;
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen uoff_t rotate_size, rotate_min_size;
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen unsigned int rotate_days;
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen};
a8d47e2427558d5011dfc75694b704760c1ef8baTimo Sirainen
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainenstruct dbox_transaction_context {
379175cfba8150d481d9898b78330b719d128d84Timo Sirainen struct index_transaction_context ictx;
d80f37f025593d959bdfa9c378915e4322f4f504Timo Sirainen union mail_index_transaction_module_context module_ctx;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen uint32_t first_saved_mail_seq;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct dbox_save_context *save_ctx;
7b64db32b95286235612eebb5d37d296a49306f7Timo Sirainen};
7b64db32b95286235612eebb5d37d296a49306f7Timo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenextern struct mail_vfuncs dbox_mail_vfuncs;
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenvoid dbox_transaction_class_init(void);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenvoid dbox_transaction_class_deinit(void);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenint dbox_save_init(struct mailbox_transaction_context *_t,
7b64db32b95286235612eebb5d37d296a49306f7Timo Sirainen enum mail_flags flags, struct mail_keywords *keywords,
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen time_t received_date, int timezone_offset,
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen const char *from_envelope, struct istream *input,
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen struct mail *dest_mail, struct mail_save_context **ctx_r);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenint dbox_save_continue(struct mail_save_context *ctx);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenint dbox_save_finish(struct mail_save_context *ctx);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenvoid dbox_save_cancel(struct mail_save_context *ctx);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenint dbox_transaction_save_commit_pre(struct dbox_save_context *ctx);
7b64db32b95286235612eebb5d37d296a49306f7Timo Sirainenvoid dbox_transaction_save_commit_post(struct dbox_save_context *ctx);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenvoid dbox_transaction_save_rollback(struct dbox_save_context *ctx);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenint dbox_mail_lookup_offset(struct index_transaction_context *trans,
7b64db32b95286235612eebb5d37d296a49306f7Timo Sirainen uint32_t seq, uint32_t *file_seq_r,
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen uoff_t *offset_r);
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen#endif
0f5dc4da3982053036be65190e44bf28a67b1ca2Timo Sirainen