mail-transaction-log-append.c revision 4b231ca0bbe3b536acbd350101e183441ce0247a
/* Copyright (C) 2003-2004 Timo Sirainen */
#include "lib.h"
#include "ioloop.h"
#include "buffer.h"
#include "write-full.h"
#include "mail-index-private.h"
#include "mail-index-view-private.h"
#include "mail-index-transaction-private.h"
#include "mail-transaction-log-private.h"
{
struct mail_transaction_header hdr;
if (size == 0)
return 0;
} else {
hdr_data_size = 0;
}
if (type == MAIL_TRANSACTION_EXPUNGE)
if (external)
if (!MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) {
if (file->first_append_size == 0) {
/* size will be written later once everything is in
disk */
} else {
}
file->sync_offset) < 0)
return -1;
if (hdr_data_size > 0) {
file->sync_offset) < 0)
return -1;
}
return -1;
} else {
file->sync_offset);
}
return 0;
}
static const buffer_t *
log_get_hdr_update_buffer(struct mail_index_transaction *t)
{
struct mail_transaction_header_update u;
int state = 0;
memset(&u, 0, sizeof(u));
if (state == 0) {
state++;
}
} else {
if (state > 0) {
u.size);
state = 0;
}
}
}
return buf;
}
struct mail_index_transaction *t,
{
const struct mail_index_ext *ext;
struct mail_transaction_ext_intro *intro;
unsigned int count;
/* new extension */
}
if (!array_is_created(&t->ext_resizes)) {
count = 0;
} else {
}
/* we're resizing it */
} else {
/* generate a new intro structure */
}
if (reset_id != 0) {
/* we're going to reset this extension in this transaction */
/* use the existing reset_id */
const struct mail_index_ext *map_ext =
} else {
/* new extension, reset_id defaults to 0 */
}
t->external);
}
static int
struct mail_index_transaction *t)
{
const struct mail_transaction_ext_intro *resize;
struct mail_transaction_ext_reset ext_reset;
if (!array_is_created(&t->ext_rec_updates)) {
update_count = 0;
} else {
}
if (!array_is_created(&t->ext_resizes)) {
resize_count = 0;
} else {
}
if (!array_is_created(&t->ext_resets)) {
reset_count = 0;
} else {
}
(ext_id < update_count &&
ext_reset.new_reset_id != 0) {
return -1;
}
if (ext_reset.new_reset_id != 0) {
t->external) < 0)
return -1;
}
}
return 0;
}
struct mail_index_transaction *t)
{
if (!array_is_created(&t->ext_rec_updates)) {
count = 0;
} else {
}
if (!array_is_created(&t->ext_resets)) {
reset_count = 0;
} else {
}
continue;
return -1;
t->external) < 0)
return -1;
}
return 0;
}
struct mail_index_transaction *t)
{
unsigned int i, count;
for (i = 0; i < count; i++) {
if (!array_is_created(&updates[i]))
continue;
t->external) < 0)
return -1;
}
return 0;
}
int mail_transaction_log_append(struct mail_index_transaction *t,
{
struct mail_index *index;
struct mail_transaction_log *log;
struct mail_transaction_log_file *file;
struct mail_index_header idx_hdr;
unsigned int lock_id;
if (!t->log_updates) {
/* nothing to append */
*log_file_seq_r = 0;
*log_file_offset_r = 0;
return 0;
}
} else {
if (mail_transaction_log_lock_head(log) < 0)
return -1;
/* update sync_offset */
(uoff_t)-1) < 0) {
return -1;
}
}
/* we might want to rotate, but check first that everything is
synced in index. */
return -1;
}
return -1;
}
/* that didn't work. well, try to continue
anyway */
}
}
}
file->first_append_size = 0;
ret = 0;
/* send all extension introductions and resizes before appends
to avoid resize overhead as much as possible */
}
t->external);
}
/* keyword resets before updates */
t->external);
}
}
}
if (t->hdr_changed && ret == 0) {
t->external);
}
if (ret < 0) {
"pwrite()");
}
}
if (!MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) {
/* we don't know how much of it got written,
it may be corrupted now.. */
"fsync()");
ret = -1;
}
/* synced - rewrite first record's header */
sizeof(uint32_t), append_offset);
if (ret < 0) {
}
}
}
if (ret < 0)
return ret;
}