mdbox-save.c revision 9047d770bfbb93ab6af5363dedb2d01363877243
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2007-2011 Dovecot authors, see the included COPYING file */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen struct dbox_file_append_context *cur_file_append;
1a1fcdbe27a8cee9a4c453a6b2f625a5be572a32Timo Sirainen struct mdbox_map_transaction_context *map_trans;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic struct dbox_file *
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenmdbox_copy_file_get_file(struct mailbox_transaction_context *t,
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen mail_index_lookup_ext(t->view, seq, ctx->mbox->ext_id,
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen if (mdbox_map_lookup(ctx->mbox->storage->map, rec->map_uid,
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen return mdbox_file_init(ctx->mbox->storage, file_id);
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainenmdbox_save_file_get_file(struct mailbox_transaction_context *t,
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen unsigned int count;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* copied mail */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen return mdbox_copy_file_get_file(t, seq, offset_r);
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen /* saved mail */
b014857be9961acf2d37ef7b76d941b20cc8c2d1Timo Sirainen if (dbox_file_append_flush(mail->file_append) < 0)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenmdbox_save_alloc(struct mailbox_transaction_context *t)
fab050cbfdf3da692441d2e2fb4b2a4c6ac9e0daTimo Sirainen struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)t->box;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen i_assert((t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
2a3fc652e13a574ca14ff2405b5c29a59232db49Timo Sirainen /* use the existing allocated structure */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen ctx->atomic = mdbox_map_atomic_begin(mbox->storage->map);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen ctx->append_ctx = mdbox_map_append_begin(ctx->atomic);
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainenint mdbox_save_begin(struct mail_save_context *_ctx, struct istream *input)
d65a556a5ec078cd7f1d0060adb16fc860d66b27Timo Sirainen struct mdbox_save_context *ctx = (struct mdbox_save_context *)_ctx;
e4ded29bff0662a590c2439ef2df8cda8a7cdd9bTimo Sirainen /* get the size of the mail to be saved, if possible */
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen if (i_stream_get_size(input, TRUE, &mail_size) <= 0) {
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen /* we couldn't find out the exact size. fallback to non-exact,
bc2d4f1c18222a3bd2a6b2b8b5f6abb560a865b3Timo Sirainen maybe it'll give something useful. the mail size is used
bc2d4f1c18222a3bd2a6b2b8b5f6abb560a865b3Timo Sirainen only to figure out if it's causing mdbox file to grow
345253fb28498b2e0a60f4a2a8644c65feee7e75Timo Sirainen too large. */
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen mail_size = st->st_size > 0 ? st->st_size : 0;
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen if (mdbox_map_append_next(ctx->append_ctx, mail_size, 0,
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen i_assert(ctx->ctx.dbox_output->offset <= (uint32_t)-1);
bc2d4f1c18222a3bd2a6b2b8b5f6abb560a865b3Timo Sirainen ctx->ctx.cur_file = ctx->cur_file_append->file;
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen save_mail->file_append = ctx->cur_file_append;
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainenstatic int mdbox_save_mail_write_metadata(struct mdbox_save_context *ctx,
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen struct dbox_file *file = mail->file_append->file;
af6c7862e6160ffaecec458f4cec43b94272ad57Timo Sirainen i_assert(file->msg_header_size == sizeof(dbox_msg_hdr));
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen mail->append_offset - mail->file_append->file->msg_header_size;
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen dbox_save_write_metadata(&ctx->ctx.ctx, ctx->ctx.dbox_output,
055f4599bba1874fa1148a8fa488517fa077619cTimo Sirainen /* save the 128bit GUID to index so if the map index gets corrupted
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen we can still find the message */
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen mail_index_update_ext(ctx->ctx.trans, ctx->ctx.seq,
bc2d4f1c18222a3bd2a6b2b8b5f6abb560a865b3Timo Sirainen dbox_msg_header_fill(&dbox_msg_hdr, message_size);
345253fb28498b2e0a60f4a2a8644c65feee7e75Timo Sirainen if (o_stream_pwrite(ctx->ctx.dbox_output, &dbox_msg_hdr,
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen sizeof(dbox_msg_hdr), mail->append_offset) < 0) {
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen dbox_file_set_syscall_error(file, "pwrite()");
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainenstatic int mdbox_save_finish_write(struct mail_save_context *_ctx)
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen struct mdbox_save_context *ctx = (struct mdbox_save_context *)_ctx;
} T_END;
int ret;
return ret;
unsigned int i, count;
const void *data;
bool expunged;
for (i = 0; i < count; i++) {
&last_map_uid) < 0) {
if (first_map_uid != 0)
result);
const void *data;
bool expunged;