dovecot-1.2: dbox: In Maildir migrations preserve POP3 UIDL from...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Dec 19 16:24:42 EET 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/1efbbf9d0841
changeset: 8580:1efbbf9d0841
user: Timo Sirainen <tss at iki.fi>
date: Fri Dec 19 16:24:19 2008 +0200
description:
dbox: In Maildir migrations preserve POP3 UIDL from dovecot-uidlist.
diffstat:
5 files changed, 78 insertions(+), 10 deletions(-)
src/lib-storage/index/dbox/dbox-file-maildir.c | 28 +++++++++++++++++
src/lib-storage/index/dbox/dbox-file.c | 7 ++--
src/lib-storage/index/dbox/dbox-index.c | 38 ++++++++++++++++++++----
src/lib-storage/index/dbox/dbox-index.h | 4 +-
src/lib-storage/index/dbox/dbox-sync-rebuild.c | 11 ++++++
diffs (183 lines):
diff -r 3b16e400fa8c -r 1efbbf9d0841 src/lib-storage/index/dbox/dbox-file-maildir.c
--- a/src/lib-storage/index/dbox/dbox-file-maildir.c Fri Dec 19 13:03:51 2008 +0200
+++ b/src/lib-storage/index/dbox/dbox-file-maildir.c Fri Dec 19 16:24:19 2008 +0200
@@ -6,6 +6,7 @@
#include "dbox-storage.h"
#include "../maildir/maildir-storage.h"
#include "../maildir/maildir-filename.h"
+#include "dbox-index.h"
#include "dbox-file.h"
#include "dbox-file-maildir.h"
@@ -33,6 +34,29 @@ dbox_file_maildir_get_flags(struct dbox_
mail_index_keywords_free(&keywords);
}
return str_c(str);
+}
+
+static const char *
+dbox_file_maildir_get_old_metadata(struct dbox_file *file, char key)
+{
+ struct dbox_index_record *rec;
+ const char *p, *end;
+
+ rec = dbox_index_record_lookup(file->mbox->dbox_index, file->file_id);
+ if (rec == NULL)
+ return NULL;
+
+ for (p = strchr(rec->data, ' '); *p != '\0'; p++) {
+ if (*p == ' ') {
+ if (p[1] == key) {
+ end = strchr(p+2, ' ');
+ return t_strdup_until(p+2, end);
+ }
+ if (p[1] == ':')
+ break;
+ }
+ }
+ return NULL;
}
const char *dbox_file_maildir_metadata_get(struct dbox_file *file,
@@ -77,8 +101,12 @@ const char *dbox_file_maildir_metadata_g
MAILDIR_EXTRA_VIRTUAL_SIZE,
&size))
value = dec2str(size);
+ else
+ value = dbox_file_maildir_get_old_metadata(file, 'W');
break;
case DBOX_METADATA_POP3_UIDL:
+ value = dbox_file_maildir_get_old_metadata(file, 'P');
+ break;
case DBOX_METADATA_EXPUNGED:
case DBOX_METADATA_EXT_REF:
case DBOX_METADATA_SPACE:
diff -r 3b16e400fa8c -r 1efbbf9d0841 src/lib-storage/index/dbox/dbox-file.c
--- a/src/lib-storage/index/dbox/dbox-file.c Fri Dec 19 13:03:51 2008 +0200
+++ b/src/lib-storage/index/dbox/dbox-file.c Fri Dec 19 16:24:19 2008 +0200
@@ -141,10 +141,11 @@ dbox_file_id_get_fname(struct dbox_mailb
rec = dbox_index_record_lookup(mbox->dbox_index, file_id);
if (rec != NULL && rec->status == DBOX_INDEX_FILE_STATUS_MAILDIR) {
- /* data contains <uid> <filename> */
+ /* data contains <uid> [<fields>] :<filename> */
*maildir_file_r = TRUE;
- p = strchr(rec->data, ' ');
- return i_strdup_printf("%s", p + 1);
+ p = strstr(rec->data, " :");
+ i_assert(p != NULL);
+ return i_strdup_printf("%s", p + 2);
}
return i_strdup_printf(DBOX_MAIL_FILE_MULTI_FORMAT, file_id);
diff -r 3b16e400fa8c -r 1efbbf9d0841 src/lib-storage/index/dbox/dbox-index.c
--- a/src/lib-storage/index/dbox/dbox-index.c Fri Dec 19 13:03:51 2008 +0200
+++ b/src/lib-storage/index/dbox/dbox-index.c Fri Dec 19 16:24:19 2008 +0200
@@ -90,7 +90,7 @@ static int dbox_index_parse_maildir(stru
static int dbox_index_parse_maildir(struct dbox_index *index, const char *line,
struct dbox_index_record *rec)
{
- char *p;
+ char *p, *p2;
unsigned long uid;
if (*line++ != ' ')
@@ -100,7 +100,14 @@ static int dbox_index_parse_maildir(stru
if (*p++ != ' ' || *p == '\0' || uid == 0 || uid >= (uint32_t)-1)
return -1;
- rec->data = p_strdup(index->record_data_pool, line);
+ p2 = strstr(p, " :");
+ if (p2 != NULL)
+ rec->data = p_strdup(index->record_data_pool, line);
+ else {
+ /* convert to new format */
+ rec->data = p_strconcat(index->record_data_pool,
+ t_strdup_until(line, p), ":", p, NULL);
+ }
return 0;
}
@@ -762,6 +769,28 @@ void dbox_index_append_file(struct dbox_
array_append(&ctx->files, &file, 1);
}
+static const char *dbox_file_maildir_get_index_data(struct dbox_file *file)
+{
+ const char *pop3_uidl = NULL, *const *changes;
+ unsigned int i, count;
+
+ changes = array_get(&file->metadata_changes, &count);
+ for (i = 0; i < count; i++) {
+ if (*changes[i] == DBOX_METADATA_POP3_UIDL) {
+ pop3_uidl = changes[i] + 1;
+ break;
+ }
+ }
+
+ if (pop3_uidl == NULL) {
+ return t_strdup_printf("%u :%s", file->last_append_uid,
+ file->fname);
+ } else {
+ return t_strdup_printf("%u P%s :%s", file->last_append_uid,
+ pop3_uidl, file->fname);
+ }
+}
+
static int dbox_index_append_commit_new(struct dbox_index_append_context *ctx,
struct dbox_file *file, string_t *str)
{
@@ -808,9 +837,8 @@ static int dbox_index_append_commit_new(
rec.file_offset = ctx->output_offset + str_len(str);
if (file->maildir_file) {
rec.status = DBOX_INDEX_FILE_STATUS_MAILDIR;
- rec.data = p_strdup_printf(ctx->index->record_data_pool,
- "%u %s", file->last_append_uid,
- file->fname);
+ rec.data = p_strdup(ctx->index->record_data_pool,
+ dbox_file_maildir_get_index_data(file));
} else {
rec.status = dbox_file_can_append(file, 0) ?
diff -r 3b16e400fa8c -r 1efbbf9d0841 src/lib-storage/index/dbox/dbox-index.h
--- a/src/lib-storage/index/dbox/dbox-index.h Fri Dec 19 13:03:51 2008 +0200
+++ b/src/lib-storage/index/dbox/dbox-index.h Fri Dec 19 16:24:19 2008 +0200
@@ -43,7 +43,9 @@ enum dbox_index_file_status {
DBOX_INDEX_FILE_STATUS_UNLINKED = 'U',
/* File is a maildir file. Status-specific data contains
- <uid> <filename>. */
+ old: <uid> <filename>
+ new: <uid> [<maildir extra field>] :<filename>
+ */
DBOX_INDEX_FILE_STATUS_MAILDIR = 'M'
};
diff -r 3b16e400fa8c -r 1efbbf9d0841 src/lib-storage/index/dbox/dbox-sync-rebuild.c
--- a/src/lib-storage/index/dbox/dbox-sync-rebuild.c Fri Dec 19 13:03:51 2008 +0200
+++ b/src/lib-storage/index/dbox/dbox-sync-rebuild.c Fri Dec 19 16:24:19 2008 +0200
@@ -143,7 +143,7 @@ static int dbox_sync_index_file_next(str
{
uint32_t seq, uid;
uoff_t physical_size;
- const char *path;
+ const char *path, *value;
bool expunged;
int ret;
@@ -190,6 +190,15 @@ static int dbox_sync_index_file_next(str
i_warning("%s: Ignoring broken file (metadata)", path);
return 0;
}
+ if (file->maildir_file) {
+ /* preserve POP3 UIDL */
+ value = maildir_uidlist_lookup_ext(ctx->maildir_uidlist, uid,
+ MAILDIR_UIDLIST_REC_EXT_POP3_UIDL);
+ if (value != NULL) {
+ dbox_file_metadata_set(file, DBOX_METADATA_POP3_UIDL,
+ value);
+ }
+ }
if (!expunged) {
mail_index_append(ctx->trans, uid, &seq);
file->maildir_append_seq = seq;
More information about the dovecot-cvs
mailing list