mail-transaction-log-view.c revision 1e16e4fb4b1d99e835f19f0f5720d6c75d8c6783
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (c) 2003-2012 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_view_open(struct mail_transaction_log *log)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen view = i_new(struct mail_transaction_log_view, 1);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen array_append(&view->file_refs, &view->head, 1);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenmail_transaction_log_view_unref_all(struct mail_transaction_log_view *view)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_transaction_log_file *const *files;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i, count;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < count; i++)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_transaction_log_view_close(struct mail_transaction_log_view **_view)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_transaction_log_view *view = *_view;
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen for (p = &view->log->views; *p != NULL; p = &(*p)->next) {
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainenint mail_transaction_log_view_set(struct mail_transaction_log_view *view,
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo 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 struct mail_transaction_log_file *file, *const *files, *tail;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i;
7888a9d2008eab9985096c46e1da9ee985c22a2aTimo Sirainen /* transaction log is closed already. this log view shouldn't
7888a9d2008eab9985096c46e1da9ee985c22a2aTimo Sirainen be used anymore. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* index file doesn't exist yet. this transaction log should
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen start from the beginning */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* but it doesn't */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (min_file_seq == tail->hdr.prev_file_seq &&
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainen min_file_offset == tail->hdr.prev_file_offset) {
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainen /* we can skip this */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* empty view */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (min_file_seq == max_file_seq && min_file_offset > max_file_offset) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* log file offset is probably corrupted in the index file. */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen min_file_seq, min_file_offset, max_file_offset);
if (ret <= 0) {
if (ret < 0)
if (min_file_offset == 0) {
if (ret <= 0)
return ret;
if (oldest_file_seq != 0 &&
&file) > 0) {
return TRUE;
return last;
const char *fmt, ...)
T_BEGIN {
} T_END;
return FALSE;
} else if (count == 0) {
return FALSE;
return FALSE;
return FALSE;
return TRUE;
const void *data)
return FALSE;
return FALSE;
if (rec_size == 0) {
return FALSE;
switch (rec_type) {
case MAIL_TRANSACTION_APPEND:
return FALSE;
case MAIL_TRANSACTION_EXPUNGE:
sizeof(struct mail_transaction_expunge));
case MAIL_TRANSACTION_EXPUNGE_GUID: {
unsigned int i, count;
return FALSE;
for (i = 0; i < count; i++) {
return FALSE;
sizeof(struct mail_transaction_flag_update));
case MAIL_TRANSACTION_KEYWORD_UPDATE: {
unsigned int seqset_offset;
return FALSE;
return FALSE;
sizeof(struct mail_transaction_keyword_reset));
case MAIL_TRANSACTION_EXT_INTRO: {
for (i = 0; i < rec_size; ) {
return FALSE;
return FALSE;
return TRUE;
const void **data_r)
const void *data;
int ret;
T_BEGIN {
} T_END;
if (ret > 0) {
return ret;
const void **data_r)
const void *data;
int ret = 0;
if (ret <= 0) {
if (ret < 0)
return ret;