Mercurial > dovecot > core-2.2
changeset 7592:c53e20911f07 HEAD
dbox: When converting maildir-format file to native dbox format, be sure to
set received/save dates in metadata. Try to write virtual size as well if it
exists in the maildir filename.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 02 Jun 2008 20:00:45 +0300 |
parents | a1a146de3ccc |
children | 2d367594b41c |
files | src/lib-storage/index/dbox/dbox-file-maildir.c src/lib-storage/index/dbox/dbox-file.c src/lib-storage/index/dbox/dbox-sync-file.c |
diffstat | 3 files changed, 29 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox/dbox-file-maildir.c Mon Jun 02 19:18:54 2008 +0300 +++ b/src/lib-storage/index/dbox/dbox-file-maildir.c Mon Jun 02 20:00:45 2008 +0300 @@ -40,11 +40,13 @@ { struct stat st; uoff_t size; + const char *p, *value = NULL; switch (key) { case DBOX_METADATA_FLAGS: case DBOX_METADATA_KEYWORDS: - return dbox_file_maildir_get_flags(file, key); + value = dbox_file_maildir_get_flags(file, key); + break; case DBOX_METADATA_RECEIVED_TIME: case DBOX_METADATA_SAVE_TIME: if (file->fd != -1) { @@ -61,18 +63,22 @@ } } if (key == DBOX_METADATA_RECEIVED_TIME) - return dec2str(st.st_mtime); + value = dec2str(st.st_mtime); else - return dec2str(st.st_ctime); + value = dec2str(st.st_ctime); + break; case DBOX_METADATA_VIRTUAL_SIZE: if (maildir_filename_get_size(file->fname, MAILDIR_EXTRA_VIRTUAL_SIZE, &size)) - return dec2str(size); + value = dec2str(size); + break; case DBOX_METADATA_EXPUNGED: case DBOX_METADATA_EXT_REF: case DBOX_METADATA_SPACE: break; } - return NULL; + if (value != NULL) + dbox_file_metadata_set(file, key, value); + return value; }
--- a/src/lib-storage/index/dbox/dbox-file.c Mon Jun 02 19:18:54 2008 +0300 +++ b/src/lib-storage/index/dbox/dbox-file.c Mon Jun 02 20:00:45 2008 +0300 @@ -948,7 +948,7 @@ const char **changes, *data; unsigned int i, count; - data = dbox_file_metadata_get(file, key); + data = file->maildir_file ? NULL : dbox_file_metadata_get(file, key); if (data != NULL && strcmp(data, value) == 0) { /* value didn't change */ return;
--- a/src/lib-storage/index/dbox/dbox-sync-file.c Mon Jun 02 19:18:54 2008 +0300 +++ b/src/lib-storage/index/dbox/dbox-sync-file.c Mon Jun 02 20:00:45 2008 +0300 @@ -196,15 +196,21 @@ dbox_sync_file_split(struct dbox_sync_context *ctx, struct dbox_file *in_file, uoff_t offset, uint32_t seq) { + static enum dbox_metadata_key maildir_metadata_keys[] = { + DBOX_METADATA_VIRTUAL_SIZE, + DBOX_METADATA_RECEIVED_TIME, + DBOX_METADATA_SAVE_TIME, + }; struct dbox_index_append_context *append_ctx; struct dbox_file *out_file; struct istream *input; struct ostream *output; struct dbox_message_header dbox_msg_hdr; struct dbox_mail_index_record rec; - const char *out_path; + const char *out_path, *value; uint32_t uid; uoff_t size, append_offset; + unsigned int i; int ret; bool expunged; @@ -233,6 +239,16 @@ dbox_sync_update_metadata(ctx, out_file, NULL, seq); } T_END; + /* set static metadata */ + for (i = 0; i < N_ELEMENTS(maildir_metadata_keys); i++) { + value = dbox_file_metadata_get(in_file, + maildir_metadata_keys[i]); + if (value != NULL) { + dbox_file_metadata_set(out_file, + maildir_metadata_keys[i], value); + } + } + /* copy the message */ out_path = dbox_file_get_path(out_file); o_stream_cork(output);