mail-transaction-log.h revision 1be964ec6d835f95b4fdebf02add9265d58ad290
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint64_t initial_modseq; /* v1.1+ (note: log's major/minor version) */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint8_t compat_flags; /* enum mail_index_header_compat_flags, v1.2+ */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi uint32_t unused2; /* so that this struct is 64bit aligned */
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 /* 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 /* Mailbox synchronization noticed this change. */
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 uint8_t modify_type; /* enum modify_type : MODIFY_ADD / MODIFY_REMOVE */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char name[];
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi array of { uint32_t uid1, uid2; }
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char data[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* Don't shrink hdr_size, record_size or record_align but grow them
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if necessary. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* old extension: set ext_id. don't set name.
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi new extension: ext_id = (uint32_t)-1. give name. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char name[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* these are set for the last ext_intro */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char data[]; */
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 Tuomi /* unsigned char data[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* unsigned char data[]; */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi#define LOG_IS_BEFORE(seq1, offset1, seq2, offset2) \
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (((offset1) < (offset2) && (seq1) == (seq2)) || (seq1) < (seq2))
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_alloc(struct mail_index *index);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_free(struct mail_transaction_log **log);
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/* Notify of indexid change */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_indexid_changed(struct mail_transaction_log *log);
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/* 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 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/* 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 Tuomiint mail_transaction_log_view_set(struct mail_transaction_log_view *view,
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/* 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 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/* Returns the position of the record returned previously with
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi mail_transaction_log_view_next() */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_get_prev_pos(struct mail_transaction_log_view *view,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Return the modseq of the change returned previously with _view_next(). */
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/* Marks the log file in current position to be corrupted. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_set_corrupted(struct mail_transaction_log_view *view,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *fmt, ...)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_transaction_log_view_is_corrupted(struct mail_transaction_log_view *view);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_append_begin(struct mail_index *index, bool external,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid mail_transaction_log_append_add(struct mail_transaction_log_append_ctx *ctx,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint mail_transaction_log_append_commit(struct mail_transaction_log_append_ctx **ctx);
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,
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/* 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/* 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/* 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/* Unlink transaction log files */