mail-transaction-log-append.c revision 105addcb709523868418cc3e3baad7ad3453a91e
/* 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)
hdr_size =
if (file->first_append_size == 0) {
/* size will be written later once everything is in disk */
} else {
}
return -1;
if (hdr_data_size > 0) {
file->sync_offset) < 0)
return -1;
}
return -1;
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;
/* new extension */
}
if (t->ext_resizes == NULL) {
size = 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 (t->ext_rec_updates == NULL) {
update_count = 0;
} else {
}
if (t->ext_resizes == NULL) {
resize_count = 0;
} else {
}
if (t->ext_resets == NULL) {
reset_count = 0;
} else {
}
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 (t->ext_rec_updates == NULL) {
size = 0;
} else {
}
if (t->ext_resets == NULL) {
reset_count = 0;
} else {
}
continue;
return -1;
t->external) < 0)
return -1;
}
return 0;
}
struct mail_index_transaction *t)
{
for (i = 0; i < size; 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;
int ret;
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;
}
/* 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()");
}
t->hide_transaction) {
}
/* 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) {
"pwrite()");
}
}
if (ret < 0)
return ret;
}