mail-transaction-log.h revision 1be964ec6d835f95b4fdebf02add9265d58ad290
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#ifndef MAIL_TRANSACTION_LOG_H
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define MAIL_TRANSACTION_LOG_H
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#include "mail-index.h"
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define MAIL_TRANSACTION_LOG_SUFFIX ".log"
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define MAIL_TRANSACTION_LOG_MAJOR_VERSION 1
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define MAIL_TRANSACTION_LOG_MINOR_VERSION 2
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define MAIL_TRANSACTION_LOG_HEADER_MIN_SIZE 24
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_log_header {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t major_version;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t minor_version;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t hdr_size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t indexid;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t file_seq;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t prev_file_seq;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t prev_file_offset;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t create_stamp;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint64_t initial_modseq; /* v1.1+ (note: log's major/minor version) */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t compat_flags; /* enum mail_index_header_compat_flags, v1.2+ */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t unused[3];
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t unused2; /* so that this struct is 64bit aligned */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomienum mail_transaction_type {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXPUNGE = 0x00000001,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_APPEND = 0x00000002,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_FLAG_UPDATE = 0x00000004,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_HEADER_UPDATE = 0x00000020,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_INTRO = 0x00000040,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_RESET = 0x00000080,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_HDR_UPDATE = 0x00000100,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_REC_UPDATE = 0x00000200,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_KEYWORD_UPDATE = 0x00000400,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_KEYWORD_RESET = 0x00000800,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_ATOMIC_INC = 0x00001000,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXPUNGE_GUID = 0x00002000,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_MODSEQ_UPDATE = 0x00008000,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_HDR_UPDATE32 = 0x00010000,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_INDEX_DELETED = 0x00020000,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_INDEX_UNDELETED = 0x00040000,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_BOUNDARY = 0x00080000,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_TYPE_MASK = 0x000fffff,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define MAIL_TRANSACTION_EXT_MASK \
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (MAIL_TRANSACTION_EXT_INTRO | MAIL_TRANSACTION_EXT_RESET | \
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_HDR_UPDATE | MAIL_TRANSACTION_EXT_HDR_UPDATE32 | \
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_REC_UPDATE | MAIL_TRANSACTION_EXT_ATOMIC_INC)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* since we'll expunge mails based on data read from transaction log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi try to avoid the possibility of corrupted transaction log expunging
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi messages. this value is ORed to the actual MAIL_TRANSACTION_EXPUNGE*
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi flag. if it's not present, assume corrupted log. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXPUNGE_PROT = 0x0000cd90,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* Mailbox synchronization noticed this change. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXTERNAL = 0x10000000
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_header {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t type; /* enum mail_transaction_type */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_modseq_update {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t uid;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* don't use uint64_t here. it adds extra 32 bits of paddiong and also
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi causes problems with CPUs that require alignment */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t modseq_low32;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t modseq_high32;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_expunge {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t uid1, uid2;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_expunge_guid {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t uid;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi guid_128_t guid_128;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_flag_update {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t uid1, uid2;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t add_flags;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t remove_flags;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t padding;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_keyword_update {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t modify_type; /* enum modify_type : MODIFY_ADD / MODIFY_REMOVE */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t padding;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t name_size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char name[];
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi array of { uint32_t uid1, uid2; }
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_keyword_reset {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t uid1, uid2;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_header_update {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t offset;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char data[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomienum {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* Don't shrink hdr_size, record_size or record_align but grow them
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if necessary. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK = 0x01
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_ext_intro {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* old extension: set ext_id. don't set name.
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi new extension: ext_id = (uint32_t)-1. give name. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t ext_id;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t reset_id;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t hdr_size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t record_size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t record_align;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t flags;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t name_size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char name[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_ext_reset {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t new_reset_id;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t preserve_data;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t unused_padding[3];
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* these are set for the last ext_intro */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_ext_hdr_update {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t offset;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint16_t size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char data[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* this _update32 version should have been the only ext_hdr_update,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi but since 16bit integers were originally used for now we'll just use this
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi only when actually needed to be backwards compatible. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_ext_hdr_update32 {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t offset;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char data[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_ext_rec_update {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t uid;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char data[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_ext_atomic_inc {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t uid;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi int32_t diff;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_boundary {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t size;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_log_append_ctx {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi struct mail_transaction_log *log;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi buffer_t *output;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint64_t new_highest_modseq;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int external:1;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int append_sync_offset:1;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int sync_includes_this:1;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int want_fsync:1;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi};
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define LOG_IS_BEFORE(seq1, offset1, seq2, offset2) \
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (((offset1) < (offset2) && (seq1) == (seq2)) || (seq1) < (seq2))
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_log *
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_alloc(struct mail_index *index);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_free(struct mail_transaction_log **log);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Open the transaction log. Returns 1 if ok, 0 if file doesn't exist or it's
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi is corrupted, -1 if there was some I/O error. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_open(struct mail_transaction_log *log);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Create, or recreate, the transaction log. Returns 0 if ok, -1 if error. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_create(struct mail_transaction_log *log, bool reset);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Close all the open transactions log files. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_close(struct mail_transaction_log *log);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Notify of indexid change */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_indexid_changed(struct mail_transaction_log *log);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Returns the file seq/offset where the mailbox is currently synced at.
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi Since the log is rotated only when mailbox is fully synced, the sequence
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi points always to the latest file. This function doesn't actually find the
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi latest sync position, so you'll need to use eg. log_view_set() before
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi calling this. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_get_mailbox_sync_pos(struct mail_transaction_log *log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t *file_seq_r,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uoff_t *file_offset_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Set the current mailbox sync position. file_seq must always be the latest
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi log file's sequence. The offset written automatically to the log when
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi other transactions are being written. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_set_mailbox_sync_pos(struct mail_transaction_log *log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t file_seq,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uoff_t file_offset);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistruct mail_transaction_log_view *
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_open(struct mail_transaction_log *log);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_view_close(struct mail_transaction_log_view **view);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Set view boundaries. Returns -1 if error, 0 if files are lost, 1 if ok.
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi reset_r=TRUE if the whole index should be reset before applying any
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi changes. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_view_set(struct mail_transaction_log_view *view,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t min_file_seq, uoff_t min_file_offset,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t max_file_seq, uoff_t max_file_offset,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi bool *reset_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Clear the view. Keep oldest_file_seq and newer log files referenced so we
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi don't get desynced. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_view_clear(struct mail_transaction_log_view *view,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t oldest_file_seq);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Read next transaction record from current position. The position is updated.
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi Returns -1 if error, 0 if we're at end of the view, 1 if ok. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_view_next(struct mail_transaction_log_view *view,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const struct mail_transaction_header **hdr_r,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const void **data_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Mark the current view's position to the record returned previously with
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi _log_view_next(). */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_view_mark(struct mail_transaction_log_view *view);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Seek to previously marked position. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_view_rewind(struct mail_transaction_log_view *view);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Returns the position of the record returned previously with
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi mail_transaction_log_view_next() */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_get_prev_pos(struct mail_transaction_log_view *view,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t *file_seq_r,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uoff_t *file_offset_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Return the modseq of the change returned previously with _view_next(). */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiuint64_t
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_get_prev_modseq(struct mail_transaction_log_view *view);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Returns TRUE if we're at the end of the view window. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomibool mail_transaction_log_view_is_last(struct mail_transaction_log_view *view);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Marks the log file in current position to be corrupted. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_set_corrupted(struct mail_transaction_log_view *view,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *fmt, ...)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi ATTR_FORMAT(2, 3);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomibool
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_is_corrupted(struct mail_transaction_log_view *view);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_append_begin(struct mail_index *index, bool external,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi struct mail_transaction_log_append_ctx **ctx_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_append_add(struct mail_transaction_log_append_ctx *ctx,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi enum mail_transaction_type type,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const void *data, size_t size);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx **ctx);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Lock transaction log for index synchronization. Log cannot be read or
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi written to while it's locked. Returns end offset. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_sync_lock(struct mail_transaction_log *log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t *file_seq_r, uoff_t *file_offset_r);
bc038dfe3ea41392ab50cd4c1c1fdd620cc3deefAki Tuomivoid mail_transaction_log_sync_unlock(struct mail_transaction_log *log);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Returns the current head. Works only when log is locked. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_get_head(struct mail_transaction_log *log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t *file_seq_r, uoff_t *file_offset_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Returns the current tail from which all files are open to head. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_get_tail(struct mail_transaction_log *log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t *file_seq_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Returns TRUE if given seq/offset is current head log's rotate point. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomibool mail_transaction_log_is_head_prev(struct mail_transaction_log *log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t file_seq, uoff_t file_offset);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Move currently opened log head file to memory (called by
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi mail_index_move_to_memory()) */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_move_to_memory(struct mail_transaction_log *log);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Returns mtime of the transaction log head file.
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi If it doesn't exist, mtime_r is set to 0. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_get_mtime(struct mail_transaction_log *log,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi time_t *mtime_r);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Unlink transaction log files */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_unlink(struct mail_transaction_log *log);
c704b7fa16ac4fa95c1d84d82d93837ae5cf98e7Timo Sirainen
c704b7fa16ac4fa95c1d84d82d93837ae5cf98e7Timo Sirainen#endif
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi