mail-transaction-log.h revision e0f4fbf127b192667c62af7875c4f2ca294b6c7a
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_HEADER_MIN_SIZE 24
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define MAIL_TRANSACTION_LOG_VERSION_FULL(major, 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#define MAIL_TRANSACTION_LOG_VERSION_COMPAT_FLAGS \
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint64_t initial_modseq; /* v1.1+ (note: log's major/minor version) */
499fec3443374cc89fb8c83b8027c1614097d7a3Timo Sirainen uint8_t compat_flags; /* enum mail_index_header_compat_flags, v1.2+ */
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainen uint32_t unused2; /* so that this struct is 64bit aligned */
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_EXT_HDR_UPDATE32 = 0x00010000,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen MAIL_TRANSACTION_INDEX_UNDELETED = 0x00040000,
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen MAIL_TRANSACTION_ATTRIBUTE_UPDATE = 0x00100000,
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)
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. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* Mailbox storage backend synchronization noticed this change. */
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. */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen uint32_t type; /* enum mail_transaction_type */
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 */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen uint8_t modify_type; /* enum modify_type : MODIFY_ADD / MODIFY_REMOVE */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* unsigned char name[];
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen array of { uint32_t uid1, uid2; }
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* unsigned char data[]; */
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 /* old extension: set ext_id. don't set name.
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen new extension: ext_id = (uint32_t)-1. give name. */
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen /* unsigned char name[]; */
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen/* these are set for the last ext_intro */
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen /* unsigned char data[]; */
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 Sirainen /* unsigned char data[]; */
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen /* unsigned char data[]; */
15b5076a239682277b44880e33ea23b55fff7e71Timo Sirainen /* same as mail_index_transaction->sync_transaction */
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen /* same as mail_index_transaction->tail_offset_changed */
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen#define LOG_IS_BEFORE(seq1, offset1, seq2, offset2) \
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen (((offset1) < (offset2) && (seq1) == (seq2)) || (seq1) < (seq2))
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenmail_transaction_log_alloc(struct mail_index *index);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenvoid mail_transaction_log_free(struct mail_transaction_log **log);
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/* Notify of indexid change */
074055dadbca01626437cc4724853a374acab6a8Timo Sirainenvoid mail_transaction_log_indexid_changed(struct mail_transaction_log *log);
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/* 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,
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/* 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 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/* 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/* 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,
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);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen/* Returns the position of the record returned previously with
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mail_transaction_log_view_next() */
d22301419109ed4a38351715e6760011421dadecTimo Sirainenmail_transaction_log_view_get_prev_pos(struct mail_transaction_log_view *view,
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen/* Return the modseq of the change returned previously with _view_next(). */
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);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Marks the log file in current position to be corrupted. */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenmail_transaction_log_view_set_corrupted(struct mail_transaction_log_view *view,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen const char *fmt, ...)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenmail_transaction_log_view_is_corrupted(struct mail_transaction_log_view *view);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenint mail_transaction_log_append_begin(struct mail_index *index,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct mail_transaction_log_append_ctx **ctx_r);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenvoid mail_transaction_log_append_add(struct mail_transaction_log_append_ctx *ctx,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenint mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx **ctx);
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 Sirainenvoid mail_transaction_log_sync_unlock(struct mail_transaction_log *log,
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/* 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/* 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/* 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/* Unlink transaction log files */