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;
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
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;
}
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 */
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);
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)
.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",
(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);
}
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,