From: Timo Sirainen Date: Sun, 26 May 2013 16:14:21 +0000 (+0300) Subject: dbox: Added support for POP3 message order. X-Git-Tag: 2.2.3~129 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=147a788fea2a88f7125b27226451271d55cf5b01;p=thirdparty%2Fdovecot%2Fcore.git dbox: Added support for POP3 message order. --- diff --git a/src/doveadm/doveadm-dump-dbox.c b/src/doveadm/doveadm-dump-dbox.c index 35aaa8a24e..17f4c24ff2 100644 --- a/src/doveadm/doveadm-dump-dbox.c +++ b/src/doveadm/doveadm-dump-dbox.c @@ -148,6 +148,9 @@ static void dump_msg_metadata(struct istream *input) case DBOX_METADATA_POP3_UIDL: printf("msg.pop3-uidl = %s\n", line + 1); break; + case DBOX_METADATA_POP3_ORDER: + printf("msg.pop3-order = %s\n", line + 1); + break; case DBOX_METADATA_RECEIVED_TIME: dump_timestamp(input, "msg.received", line + 1); break; diff --git a/src/lib-storage/index/dbox-common/dbox-file.h b/src/lib-storage/index/dbox-common/dbox-file.h index 5b94535546..f790a357aa 100644 --- a/src/lib-storage/index/dbox-common/dbox-file.h +++ b/src/lib-storage/index/dbox-common/dbox-file.h @@ -45,6 +45,8 @@ enum dbox_metadata_key { DBOX_METADATA_GUID = 'G', /* POP3 UIDL overriding the default format */ DBOX_METADATA_POP3_UIDL = 'P', + /* POP3 message ordering (for migrated mails) */ + DBOX_METADATA_POP3_ORDER = 'O', /* Received UNIX timestamp in hex */ DBOX_METADATA_RECEIVED_TIME = 'R', /* Physical message size in hex. Necessary only if it differs from diff --git a/src/lib-storage/index/dbox-common/dbox-mail.c b/src/lib-storage/index/dbox-common/dbox-mail.c index 3ec1e1bad2..90bf176190 100644 --- a/src/lib-storage/index/dbox-common/dbox-mail.c +++ b/src/lib-storage/index/dbox-common/dbox-mail.c @@ -165,12 +165,19 @@ dbox_get_cached_metadata(struct dbox_mail *mail, enum dbox_metadata_key key, INDEX_STORAGE_CONTEXT(imail->mail.mail.box); const char *value; string_t *str; + uint32_t order; str = str_new(imail->mail.data_pool, 64); if (mail_cache_lookup_field(imail->mail.mail.transaction->cache_view, str, imail->mail.mail.seq, ibox->cache_fields[cache_field].idx) > 0) { - *value_r = str_c(str); + if (cache_field != MAIL_CACHE_POP3_ORDER) + *value_r = str_c(str); + else { + i_assert(str_len(str) == sizeof(order)); + memcpy(&order, str_data(str), sizeof(order)); + *value_r = dec2str(order); + } return 0; } @@ -179,8 +186,15 @@ dbox_get_cached_metadata(struct dbox_mail *mail, enum dbox_metadata_key key, if (value == NULL) value = ""; - index_mail_cache_add_idx(imail, ibox->cache_fields[cache_field].idx, - value, strlen(value)+1); + if (cache_field != MAIL_CACHE_POP3_ORDER) { + index_mail_cache_add_idx(imail, ibox->cache_fields[cache_field].idx, + value, strlen(value)+1); + } else { + if (str_to_uint(value, &order) < 0) + order = 0; + index_mail_cache_add_idx(imail, ibox->cache_fields[cache_field].idx, + &order, sizeof(order)); + } /* don't return pointer to dbox metadata directly, since it may change unexpectedly */ @@ -202,6 +216,9 @@ int dbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field, case MAIL_FETCH_UIDL_BACKEND: return dbox_get_cached_metadata(mail, DBOX_METADATA_POP3_UIDL, MAIL_CACHE_POP3_UIDL, value_r); + case MAIL_FETCH_POP3_ORDER: + return dbox_get_cached_metadata(mail, DBOX_METADATA_POP3_ORDER, + MAIL_CACHE_POP3_ORDER, value_r); case MAIL_FETCH_GUID: return dbox_get_cached_metadata(mail, DBOX_METADATA_GUID, MAIL_CACHE_GUID, value_r); diff --git a/src/lib-storage/index/dbox-common/dbox-save.c b/src/lib-storage/index/dbox-common/dbox-save.c index e7d0e4cd46..1aaa67681d 100644 --- a/src/lib-storage/index/dbox-common/dbox-save.c +++ b/src/lib-storage/index/dbox-common/dbox-save.c @@ -164,6 +164,10 @@ void dbox_save_write_metadata(struct mail_save_context *_ctx, str_printfa(str, "%c%s\n", DBOX_METADATA_POP3_UIDL, mdata->pop3_uidl); } + if (mdata->pop3_order != 0) { + str_printfa(str, "%c%u\n", DBOX_METADATA_POP3_ORDER, + mdata->pop3_order); + } guid = mdata->guid; if (guid != NULL) diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index bb6929ddb3..dc3a25b8fc 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -46,6 +46,9 @@ struct mail_cache_field global_cache_fields[MAIL_INDEX_CACHE_FIELD_COUNT] = { .type = MAIL_CACHE_FIELD_STRING }, { .name = "pop3.uidl", .type = MAIL_CACHE_FIELD_STRING }, + { .name = "pop3.order", + .type = MAIL_CACHE_FIELD_FIXED_SIZE, + .field_size = sizeof(uint32_t) }, { .name = "guid", .type = MAIL_CACHE_FIELD_STRING }, { .name = "mime.parts", @@ -1871,6 +1874,8 @@ void index_mail_precache(struct mail *mail) (void)mail_get_physical_size(mail, &size); if ((cache & MAIL_FETCH_UIDL_BACKEND) != 0) (void)mail_get_special(mail, MAIL_FETCH_UIDL_BACKEND, &str); + if ((cache & MAIL_FETCH_POP3_ORDER) != 0) + (void)mail_get_special(mail, MAIL_FETCH_POP3_ORDER, &str); if ((cache & MAIL_FETCH_GUID) != 0) (void)mail_get_special(mail, MAIL_FETCH_GUID, &str); } diff --git a/src/lib-storage/index/index-mail.h b/src/lib-storage/index/index-mail.h index 4acf146a32..bc6d8af0cb 100644 --- a/src/lib-storage/index/index-mail.h +++ b/src/lib-storage/index/index-mail.h @@ -19,6 +19,7 @@ enum index_cache_field { MAIL_CACHE_IMAP_BODYSTRUCTURE, MAIL_CACHE_IMAP_ENVELOPE, MAIL_CACHE_POP3_UIDL, + MAIL_CACHE_POP3_ORDER, MAIL_CACHE_GUID, MAIL_CACHE_MESSAGE_PARTS, MAIL_CACHE_BINARY_PARTS,