Mercurial > dovecot > core-2.2
changeset 7542:cf924043234d HEAD
dbox: Don't write message UID to u.* files' header, since the filename
itself specifies the UID already. When reading u.* files ignore the UID
field completely. This would allow hard linking u.* files, but the metadata
will then contain only a single mailbox's flags+keywords.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 25 May 2008 02:52:39 +0300 |
parents | a2a199667c05 |
children | 8a4ac809d472 |
files | src/lib-storage/index/dbox/dbox-file.c src/lib-storage/index/dbox/dbox-save.c |
diffstat | 2 files changed, 35 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox/dbox-file.c Sun May 25 02:50:23 2008 +0300 +++ b/src/lib-storage/index/dbox/dbox-file.c Sun May 25 02:52:39 2008 +0300 @@ -600,7 +600,10 @@ return 0; } - *uid_r = hex2dec(hdr.uid_hex, sizeof(hdr.uid_hex)); + /* Ignore the UID header with UID files */ + *uid_r = (file->file_id & DBOX_FILE_ID_FLAG_UID) != 0 ? + (file->file_id & ~DBOX_FILE_ID_FLAG_UID) : + hex2dec(hdr.uid_hex, sizeof(hdr.uid_hex)); *physical_size_r = hex2dec(hdr.message_size_hex, sizeof(hdr.message_size_hex)); return 1;
--- a/src/lib-storage/index/dbox/dbox-save.c Sun May 25 02:50:23 2008 +0300 +++ b/src/lib-storage/index/dbox/dbox-save.c Sun May 25 02:52:39 2008 +0300 @@ -218,6 +218,23 @@ o_stream_send(ctx->cur_output, "\n", 1); } +static int dbox_save_mail_write_header(struct dbox_save_mail *mail) +{ + struct dbox_message_header dbox_msg_hdr; + + i_assert(mail->file->msg_header_size == sizeof(dbox_msg_hdr)); + + mail->file->last_append_uid = mail->uid; + dbox_msg_header_fill(&dbox_msg_hdr, mail->uid, mail->message_size); + + if (pwrite_full(mail->file->fd, &dbox_msg_hdr, + sizeof(dbox_msg_hdr), mail->append_offset) < 0) { + dbox_file_set_syscall_error(mail->file, "write"); + return -1; + } + return 0; +} + int dbox_save_finish(struct mail_save_context *_ctx) { struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx; @@ -250,12 +267,6 @@ i_stream_unref(&ctx->input); count = array_count(&ctx->mails); - if (count >= ctx->mbox->max_open_files) { - /* too many open files, close one of them */ - save_mail = array_idx_modifiable(&ctx->mails, count - - ctx->mbox->max_open_files); - dbox_file_close(save_mail->file); - } save_mail = array_idx_modifiable(&ctx->mails, count - 1); if (ctx->failed) { dbox_file_cancel_append(save_mail->file, @@ -267,6 +278,12 @@ dbox_file_finish_append(save_mail->file); save_mail->message_size = offset - save_mail->append_offset - save_mail->file->msg_header_size; + + if (save_mail->file->append_count == 1 && + !dbox_file_can_append(save_mail->file, 0)) { + dbox_save_mail_write_header(save_mail); + dbox_file_close(save_mail->file); + } return 0; } } @@ -279,23 +296,6 @@ (void)dbox_save_finish(_ctx); } -static int dbox_save_mail_write_header(struct dbox_save_mail *mail) -{ - struct dbox_message_header dbox_msg_hdr; - - i_assert(mail->file->msg_header_size == sizeof(dbox_msg_hdr)); - - mail->file->last_append_uid = mail->uid; - dbox_msg_header_fill(&dbox_msg_hdr, mail->uid, mail->message_size); - - if (pwrite_full(mail->file->fd, &dbox_msg_hdr, - sizeof(dbox_msg_hdr), mail->append_offset) < 0) { - dbox_file_set_syscall_error(mail->file, "write"); - return -1; - } - return 0; -} - static int dbox_save_file_write_append_offset(struct dbox_file *file, uoff_t append_offset) { @@ -359,6 +359,14 @@ /* update headers */ qsort(mails, count, sizeof(*mails), dbox_save_mail_file_cmp); for (i = 0; i < count; i++) { + mails[i].file->last_append_uid = mails[i].uid; + if (mails[i].file->append_count == 1 && + !dbox_file_can_append(mails[i].file, 0)) { + /* UID file - there's no need to write it to the + header */ + continue; + } + if (dbox_file_open_if_needed(mails[i].file) < 0 || dbox_save_mail_write_header(&mails[i]) < 0) { ret = -1;