mail-transaction-log.h revision 5a07b37a9df398b5189c14872a600384208ab74b
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#ifndef __MAIL_TRANSACTION_LOG_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define __MAIL_TRANSACTION_LOG_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define MAIL_TRANSACTION_LOG_PREFIX ".log"
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen#define MAIL_TRANSACTION_LOG_ROTATE_SIZE (1024*128)
55a210942dc7da58b2fd0b11bed8da6b030af5c1Timo Sirainen#define MAIL_TRANSACTION_LOG_ROTATE_MIN_TIME (60*5)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_log_header {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t indexid;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t file_seq;
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen uint32_t prev_file_seq;
40ef82c46f6652412b068ebcdac7c3e74840a284Timo Sirainen uint32_t prev_file_offset;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenenum mail_transaction_type {
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen MAIL_TRANSACTION_EXPUNGE = 0x00000001,
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen MAIL_TRANSACTION_APPEND = 0x00000002,
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen MAIL_TRANSACTION_FLAG_UPDATE = 0x00000004,
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainen MAIL_TRANSACTION_CACHE_RESET = 0x00000008,
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainen MAIL_TRANSACTION_CACHE_UPDATE = 0x00000010,
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainen MAIL_TRANSACTION_HEADER_UPDATE = 0x00000020,
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen MAIL_TRANSACTION_EXTRA_INTRO = 0x00000040,
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen MAIL_TRANSACTION_EXTRA_RESET = 0x00000080,
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen MAIL_TRANSACTION_EXTRA_HDR_UPDATE = 0x00000100,
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen MAIL_TRANSACTION_EXTRA_REC_UPDATE = 0x00000200,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen MAIL_TRANSACTION_TYPE_MASK = 0x0000ffff,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* since we'll expunge mails based on data read from transaction log,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen try to avoid the possibility of corrupted transaction log expunging
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen messages. this value is ORed to the actual MAIL_TRANSACTION_EXPUNGE
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen flag. if it's not present, assume corrupted log. */
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen MAIL_TRANSACTION_EXPUNGE_PROT = 0x0000cd90,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* Mailbox synchronization noticed this change. */
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen MAIL_TRANSACTION_EXTERNAL = 0x10000000
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_header {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t size;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t type; /* enum mail_transaction_type */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_expunge {
659fe5d24825b160cae512538088020d97a60239Timo Sirainen uint32_t uid1, uid2;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_flag_update {
659fe5d24825b160cae512538088020d97a60239Timo Sirainen uint32_t uid1, uid2;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint8_t add_flags;
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen keywords_mask_t add_keywords;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint8_t remove_flags;
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen keywords_mask_t remove_keywords;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainenstruct mail_transaction_cache_reset {
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainen uint32_t new_file_seq;
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainen};
56f45b3f3ae20e5c933701f4657dda5ef1916855Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenstruct mail_transaction_cache_update {
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen uint32_t uid;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen uint32_t cache_offset;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen};
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenstruct mail_transaction_header_update {
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen uint16_t offset;
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen uint16_t size;
a928e7efabb1672b1476e597106d4b4b81ac6f3cTimo Sirainen /* unsigned char data[]; */
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen};
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainenstruct mail_transaction_extra_intro {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint32_t data_id; /* must be first */
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint32_t hdr_size;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint16_t record_size;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint16_t name_size;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen /* unsigned char name[]; */
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen};
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainenstruct mail_transaction_extra_hdr_update {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint32_t data_id; /* must be first */
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint16_t offset;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint16_t size;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen /* unsigned char data[]; */
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen};
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainenstruct mail_transaction_extra_rec_header {
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen uint32_t data_id; /* must be first */
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen};
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainenstruct mail_transaction_extra_rec_update {
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen uint32_t uid;
a928e7efabb1672b1476e597106d4b4b81ac6f3cTimo Sirainen /* unsigned char data[]; */
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen};
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_log *
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_open_or_create(struct mail_index *index);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_transaction_log_close(struct mail_transaction_log *log);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_transaction_log_view *
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_view_open(struct mail_transaction_log *log);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_transaction_log_view_close(struct mail_transaction_log_view *view);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Set view boundaries. Returns -1 if error, 0 if ok. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_view_set(struct mail_transaction_log_view *view,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t min_file_seq, uoff_t min_file_offset,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t max_file_seq, uoff_t max_file_offset,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen enum mail_transaction_type type_mask);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Read next transaction record from current position. The position is updated.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Returns -1 if error, 0 if we're at end of the view, 1 if ok. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_transaction_log_view_next(struct mail_transaction_log_view *view,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const struct mail_transaction_header **hdr_r,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const void **data_r, int *skipped_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Returns the position of the record returned previously with
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_transaction_log_view_next() */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_view_get_prev_pos(struct mail_transaction_log_view *view,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t *file_seq_r,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uoff_t *file_offset_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Marks the log file in current position to be corrupted. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_view_set_corrupted(struct mail_transaction_log_view *view,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *fmt, ...)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen __attr_format__(2, 3);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_view_is_corrupted(struct mail_transaction_log_view *view);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainenvoid mail_transaction_log_views_close(struct mail_transaction_log *log);
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Write data to transaction log. This is atomic operation. Sequences in
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen updates[] and expunges[] are relative to given view, they're modified
8a3d609fdd84f5938c82e8e7eeb84a24ab41b317Timo Sirainen to real ones. If nothing is written, log_file_seq_r and log_file_offset_r
8a3d609fdd84f5938c82e8e7eeb84a24ab41b317Timo Sirainen will be set to 0. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_transaction_log_append(struct mail_index_transaction *t,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t *log_file_seq_r,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uoff_t *log_file_offset_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Lock transaction log for index synchronization. Log cannot be read or
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen written to while it's locked. Returns end offset. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint mail_transaction_log_sync_lock(struct mail_transaction_log *log,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t *file_seq_r, uoff_t *file_offset_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_transaction_log_sync_unlock(struct mail_transaction_log *log);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Returns the current head. Works only when log is locked. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_transaction_log_get_head(struct mail_transaction_log *log,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t *file_seq_r, uoff_t *file_offset_r);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#endif