From 4e45d7983c84c69e37e113b3bfa9005d8b4315d0 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 2 Jun 2008 20:00:45 +0300 Subject: [PATCH] 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. --HG-- branch : HEAD --- src/lib-storage/index/dbox/dbox-file-maildir.c | 16 +++++++++++----- src/lib-storage/index/dbox/dbox-file.c | 2 +- src/lib-storage/index/dbox/dbox-sync-file.c | 18 +++++++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/lib-storage/index/dbox/dbox-file-maildir.c b/src/lib-storage/index/dbox/dbox-file-maildir.c index 94fec3c4cb..6fe9dff3f8 100644 --- a/src/lib-storage/index/dbox/dbox-file-maildir.c +++ b/src/lib-storage/index/dbox/dbox-file-maildir.c @@ -40,11 +40,13 @@ const char *dbox_file_maildir_metadata_get(struct dbox_file *file, { 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 @@ const char *dbox_file_maildir_metadata_get(struct dbox_file *file, } } 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; } diff --git a/src/lib-storage/index/dbox/dbox-file.c b/src/lib-storage/index/dbox/dbox-file.c index c307b5fc53..8765cd6583 100644 --- a/src/lib-storage/index/dbox/dbox-file.c +++ b/src/lib-storage/index/dbox/dbox-file.c @@ -948,7 +948,7 @@ void dbox_file_metadata_set(struct dbox_file *file, enum dbox_metadata_key key, 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; diff --git a/src/lib-storage/index/dbox/dbox-sync-file.c b/src/lib-storage/index/dbox/dbox-sync-file.c index 069453f960..c7e6ef2423 100644 --- a/src/lib-storage/index/dbox/dbox-sync-file.c +++ b/src/lib-storage/index/dbox/dbox-sync-file.c @@ -196,15 +196,21 @@ static int 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_file_split(struct dbox_sync_context *ctx, struct dbox_file *in_file, 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); -- 2.47.3