dovecot-1.1: dbox: When converting maildir-format file to native...

dovecot at dovecot.org dovecot at dovecot.org
Mon Jun 2 20:01:49 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/c53e20911f07
changeset: 7592:c53e20911f07
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jun 02 20:00:45 2008 +0300
description:
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.

diffstat:

3 files changed, 29 insertions(+), 7 deletions(-)
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 +++++++++++++++++-

diffs (100 lines):

diff -r a1a146de3ccc -r c53e20911f07 src/lib-storage/index/dbox/dbox-file-maildir.c
--- 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 @@ const char *dbox_file_maildir_metadata_g
 {
 	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_g
 			}
 		}
 		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 -r a1a146de3ccc -r c53e20911f07 src/lib-storage/index/dbox/dbox-file.c
--- 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 @@ void dbox_file_metadata_set(struct dbox_
 	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 -r a1a146de3ccc -r c53e20911f07 src/lib-storage/index/dbox/dbox-sync-file.c
--- 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_co
 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;
 
@@ -232,6 +238,16 @@ dbox_sync_file_split(struct dbox_sync_co
 	T_BEGIN {
 		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);


More information about the dovecot-cvs mailing list