mail-transaction-log.h revision e0f4fbf127b192667c62af7875c4f2ca294b6c7a
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch#ifndef MAIL_TRANSACTION_LOG_H
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_H
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "mail-index.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_SUFFIX ".log"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_MAJOR_VERSION 1
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_MINOR_VERSION 2
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_HEADER_MIN_SIZE 24
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_VERSION_FULL(major, minor) \
7a7d2aa11e46195e2d92d6c337d7e78052a5ce67Timo Sirainen ((major) << 8 | (minor))
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_VERSION_HAVE(version, wanted_feature) \
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen ((version) >= MAIL_TRANSACTION_LOG_VERSION_##wanted_feature)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_HDR_VERSION(hdr) \
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAIL_TRANSACTION_LOG_VERSION_FULL((hdr)->major_version, (hdr)->minor_version)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_VERSION_COMPAT_FLAGS \
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAIL_TRANSACTION_LOG_VERSION_FULL(1, 2)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_transaction_log_header {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint8_t major_version;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint8_t minor_version;
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen uint16_t hdr_size;
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen uint32_t indexid;
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen uint32_t file_seq;
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen uint32_t prev_file_seq;
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen uint32_t prev_file_offset;
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen uint32_t create_stamp;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint64_t initial_modseq; /* v1.1+ (note: log's major/minor version) */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
499fec3443374cc89fb8c83b8027c1614097d7a3Timo Sirainen uint8_t compat_flags; /* enum mail_index_header_compat_flags, v1.2+ */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint8_t unused[3];
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainen uint32_t unused2; /* so that this struct is 64bit aligned */
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainen};
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainenenum mail_transaction_type {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAIL_TRANSACTION_EXPUNGE = 0x00000001,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_APPEND = 0x00000002,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_FLAG_UPDATE = 0x00000004,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_HEADER_UPDATE = 0x00000020,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_INTRO = 0x00000040,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_RESET = 0x00000080,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_HDR_UPDATE = 0x00000100,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_REC_UPDATE = 0x00000200,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_KEYWORD_UPDATE = 0x00000400,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_KEYWORD_RESET = 0x00000800,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_ATOMIC_INC = 0x00001000,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXPUNGE_GUID = 0x00002000,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_MODSEQ_UPDATE = 0x00008000,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_HDR_UPDATE32 = 0x00010000,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen MAIL_TRANSACTION_INDEX_DELETED = 0x00020000,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen MAIL_TRANSACTION_INDEX_UNDELETED = 0x00040000,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_BOUNDARY = 0x00080000,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_ATTRIBUTE_UPDATE = 0x00100000,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen MAIL_TRANSACTION_TYPE_MASK = 0x0fffffff,
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen#define MAIL_TRANSACTION_EXT_MASK \
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen (MAIL_TRANSACTION_EXT_INTRO | MAIL_TRANSACTION_EXT_RESET | \
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen MAIL_TRANSACTION_EXT_HDR_UPDATE | MAIL_TRANSACTION_EXT_HDR_UPDATE32 | \
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_REC_UPDATE | MAIL_TRANSACTION_EXT_ATOMIC_INC)
11352dc3e4b29f3d2763c82f8ea4f99e8daf4fa3Timo Sirainen
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen /* since we'll expunge mails based on data read from transaction log,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen try to avoid the possibility of corrupted transaction log expunging
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen messages. this value is ORed to the actual MAIL_TRANSACTION_EXPUNGE*
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen flag. if it's not present, assume corrupted log. */
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen MAIL_TRANSACTION_EXPUNGE_PROT = 0x0000cd90,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* Mailbox storage backend synchronization noticed this change. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAIL_TRANSACTION_EXTERNAL = 0x10000000,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* This change syncs the state with another mailbox (dsync),
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i.e. the change isn't something that a user requested locally. */
cd8507179823de33d6e8242e10dbc15d136245b5Timo Sirainen MAIL_TRANSACTION_SYNC = 0x20000000
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_transaction_header {
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen uint32_t size;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t type; /* enum mail_transaction_type */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct mail_transaction_modseq_update {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t uid;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen /* don't use uint64_t here. it adds extra 32 bits of paddiong and also
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen causes problems with CPUs that require alignment */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t modseq_low32;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t modseq_high32;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct mail_transaction_expunge {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t uid1, uid2;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct mail_transaction_expunge_guid {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t uid;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen guid_128_t guid_128;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct mail_transaction_flag_update {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t uid1, uid2;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint8_t add_flags;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint8_t remove_flags;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint8_t modseq_inc_flag;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint8_t padding;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen};
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstruct mail_transaction_keyword_update {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint8_t modify_type; /* enum modify_type : MODIFY_ADD / MODIFY_REMOVE */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint8_t padding;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint16_t name_size;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* unsigned char name[];
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen array of { uint32_t uid1, uid2; }
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen};
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenstruct mail_transaction_keyword_reset {
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen uint32_t uid1, uid2;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen};
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenstruct mail_transaction_header_update {
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen uint16_t offset;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen uint16_t size;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* unsigned char data[]; */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenenum {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* Don't shrink hdr_size, record_size or record_align but grow them
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if necessary. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK = 0x01
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_transaction_ext_intro {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* old extension: set ext_id. don't set name.
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen new extension: ext_id = (uint32_t)-1. give name. */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen uint32_t ext_id;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t reset_id;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t hdr_size;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint16_t record_size;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint16_t record_align;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint16_t flags;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint16_t name_size;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen /* unsigned char name[]; */
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen};
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainenstruct mail_transaction_ext_reset {
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen uint32_t new_reset_id;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen uint8_t preserve_data;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen uint8_t unused_padding[3];
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen};
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen/* these are set for the last ext_intro */
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainenstruct mail_transaction_ext_hdr_update {
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen uint16_t offset;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen uint16_t size;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen /* unsigned char data[]; */
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen};
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen/* this _update32 version should have been the only ext_hdr_update,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen but since 16bit integers were originally used for now we'll just use this
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen only when actually needed to be backwards compatible. */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenstruct mail_transaction_ext_hdr_update32 {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen uint32_t offset;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen uint32_t size;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen /* unsigned char data[]; */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen};
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenstruct mail_transaction_ext_rec_update {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen uint32_t uid;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen /* unsigned char data[]; */
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen};
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainenstruct mail_transaction_ext_atomic_inc {
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen uint32_t uid;
8305127d1074cf9a1e25dec9be2735276462079dTimo Sirainen int32_t diff;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen};
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainenstruct mail_transaction_boundary {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t size;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mail_transaction_log_append_ctx {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mail_transaction_log *log;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen buffer_t *output;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen enum mail_transaction_type trans_flags;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
596433ccbca59ce2328dc1d029586154cd937155Timo Sirainen uint64_t new_highest_modseq;
596433ccbca59ce2328dc1d029586154cd937155Timo Sirainen unsigned int transaction_count;
15b5076a239682277b44880e33ea23b55fff7e71Timo Sirainen
15b5076a239682277b44880e33ea23b55fff7e71Timo Sirainen /* same as mail_index_transaction->sync_transaction */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool index_sync_transaction:1;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen /* same as mail_index_transaction->tail_offset_changed */
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen bool tail_offset_changed:1;
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen bool sync_includes_this:1;
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen bool want_fsync:1;
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainen};
61cf001f1944d92eb25f113ba4c08985d6e30d53Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen#define LOG_IS_BEFORE(seq1, offset1, seq2, offset2) \
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen (((offset1) < (offset2) && (seq1) == (seq2)) || (seq1) < (seq2))
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenstruct mail_transaction_log *
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenmail_transaction_log_alloc(struct mail_index *index);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenvoid mail_transaction_log_free(struct mail_transaction_log **log);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen/* Open the transaction log. Returns 1 if ok, 0 if file doesn't exist or it's
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen is corrupted, -1 if there was some I/O error. */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenint mail_transaction_log_open(struct mail_transaction_log *log);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen/* Create, or recreate, the transaction log. Returns 0 if ok, -1 if error. */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenint mail_transaction_log_create(struct mail_transaction_log *log, bool reset);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen/* Close all the open transactions log files. */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenvoid mail_transaction_log_close(struct mail_transaction_log *log);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen/* Notify of indexid change */
074055dadbca01626437cc4724853a374acab6a8Timo Sirainenvoid mail_transaction_log_indexid_changed(struct mail_transaction_log *log);
074055dadbca01626437cc4724853a374acab6a8Timo Sirainen
963842c00ef1714db2855c8952f1b46d78cba1caTimo Sirainen/* Returns the file seq/offset where the mailbox is currently synced at.
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen Since the log is rotated only when mailbox is fully synced, the sequence
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen points always to the latest file. This function doesn't actually find the
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen latest sync position, so you'll need to use eg. log_view_set() before
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen calling this. */
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainenvoid mail_transaction_log_get_mailbox_sync_pos(struct mail_transaction_log *log,
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen uint32_t *file_seq_r,
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen uoff_t *file_offset_r);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen/* Set the current mailbox sync position. file_seq must always be the latest
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen log file's sequence. The offset written automatically to the log when
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen other transactions are being written. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mail_transaction_log_set_mailbox_sync_pos(struct mail_transaction_log *log,
7f3b826a89bcb7a72759912e99f574b28309fe1bTimo Sirainen uint32_t file_seq,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uoff_t file_offset);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainenstruct mail_transaction_log_view *
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainenmail_transaction_log_view_open(struct mail_transaction_log *log);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainenvoid mail_transaction_log_view_close(struct mail_transaction_log_view **view);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen/* Set view boundaries. Returns -1 if error, 0 if files are lost or corrupted,
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen 1 if ok. reset_r=TRUE if the whole index should be reset before applying any
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen changes. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenint mail_transaction_log_view_set(struct mail_transaction_log_view *view,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t min_file_seq, uoff_t min_file_offset,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t max_file_seq, uoff_t max_file_offset,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool *reset_r, const char **reason_r);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Scan through all of the log files that we can find.
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen Returns -1 if error, 0 if ok. */
e10d8b1291090c26b9ef499637e6e632485ca5beTimo Sirainenint mail_transaction_log_view_set_all(struct mail_transaction_log_view *view);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Clear the view. If oldest_file_seq > 0, keep it and newer log files
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen referenced so we don't get desynced. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mail_transaction_log_view_clear(struct mail_transaction_log_view *view,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t oldest_file_seq);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Read next transaction record from current position. The position is updated.
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen Returns -1 if error, 0 if we're at end of the view, 1 if ok. */
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenint mail_transaction_log_view_next(struct mail_transaction_log_view *view,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen const struct mail_transaction_header **hdr_r,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const void **data_r);
18ccd19c244f49665fe03cda785efa066d2c38dfTimo Sirainen/* Mark the current view's position to the record returned previously with
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen _log_view_next(). */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mail_transaction_log_view_mark(struct mail_transaction_log_view *view);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Seek to previously marked position. */
c529313e1cbc22244d4528e80aa3e485f8806cd3Timo Sirainenvoid mail_transaction_log_view_rewind(struct mail_transaction_log_view *view);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen/* Returns the position of the record returned previously with
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mail_transaction_log_view_next() */
d22301419109ed4a38351715e6760011421dadecTimo Sirainenvoid
d22301419109ed4a38351715e6760011421dadecTimo Sirainenmail_transaction_log_view_get_prev_pos(struct mail_transaction_log_view *view,
d22301419109ed4a38351715e6760011421dadecTimo Sirainen uint32_t *file_seq_r,
aa41b2e17912d6cad3151babea6a85dd88539d28Timo Sirainen uoff_t *file_offset_r);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen/* Return the modseq of the change returned previously with _view_next(). */
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainenuint64_t
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenmail_transaction_log_view_get_prev_modseq(struct mail_transaction_log_view *view);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Returns TRUE if we're at the end of the view window. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenbool mail_transaction_log_view_is_last(struct mail_transaction_log_view *view);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Marks the log file in current position to be corrupted. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenmail_transaction_log_view_set_corrupted(struct mail_transaction_log_view *view,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen const char *fmt, ...)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen ATTR_FORMAT(2, 3);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenbool
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenmail_transaction_log_view_is_corrupted(struct mail_transaction_log_view *view);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenint mail_transaction_log_append_begin(struct mail_index *index,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen enum mail_transaction_type flags,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct mail_transaction_log_append_ctx **ctx_r);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenvoid mail_transaction_log_append_add(struct mail_transaction_log_append_ctx *ctx,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen enum mail_transaction_type type,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen const void *data, size_t size);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenint mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx **ctx);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen/* Lock transaction log for index synchronization. Log cannot be read or
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen written to while it's locked. Returns end offset. */
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenint mail_transaction_log_sync_lock(struct mail_transaction_log *log,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen const char *lock_reason,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen uint32_t *file_seq_r, uoff_t *file_offset_r);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenvoid mail_transaction_log_sync_unlock(struct mail_transaction_log *log,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen const char *lock_reason);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen/* Returns the current head. Works only when log is locked. */
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenvoid mail_transaction_log_get_head(struct mail_transaction_log *log,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen uint32_t *file_seq_r, uoff_t *file_offset_r);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen/* Returns the current tail from which all files are open to head. */
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenvoid mail_transaction_log_get_tail(struct mail_transaction_log *log,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t *file_seq_r);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen/* Returns TRUE if given seq/offset is current head log's rotate point. */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenbool mail_transaction_log_is_head_prev(struct mail_transaction_log *log,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen uint32_t file_seq, uoff_t file_offset);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen/* Move currently opened log head file to memory (called by
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen mail_index_move_to_memory()) */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenvoid mail_transaction_log_move_to_memory(struct mail_transaction_log *log);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen/* Returns mtime of the transaction log head file.
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen If it doesn't exist, mtime_r is set to 0. */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenint mail_transaction_log_get_mtime(struct mail_transaction_log *log,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen time_t *mtime_r);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen/* Unlink transaction log files */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenint mail_transaction_log_unlink(struct mail_transaction_log *log);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen#endif
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen