]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dbox: When converting maildir-format file to native dbox format, be sure to
authorTimo Sirainen <tss@iki.fi>
Mon, 2 Jun 2008 17:00:45 +0000 (20:00 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 2 Jun 2008 17:00:45 +0000 (20:00 +0300)
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
src/lib-storage/index/dbox/dbox-file.c
src/lib-storage/index/dbox/dbox-sync-file.c

index 94fec3c4cb935f4b6d1527178ec24b4cdee83744..6fe9dff3f84c96cf5d050f79c96d0f2a0aabc90a 100644 (file)
@@ -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;
 }
index c307b5fc536413d82e4d3c87b8c0911815f15d77..8765cd6583ed2c6749af93c4d023e7d236b2dc10 100644 (file)
@@ -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;
index 069453f96051ae61efab4ac5fac72ba1729dc2e8..c7e6ef2423e53ddfa75bc8d06b2114e0276251f8 100644 (file)
@@ -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);