]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dbox: Added support for POP3 message order.
authorTimo Sirainen <tss@iki.fi>
Sun, 26 May 2013 16:14:21 +0000 (19:14 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 26 May 2013 16:14:21 +0000 (19:14 +0300)
src/doveadm/doveadm-dump-dbox.c
src/lib-storage/index/dbox-common/dbox-file.h
src/lib-storage/index/dbox-common/dbox-mail.c
src/lib-storage/index/dbox-common/dbox-save.c
src/lib-storage/index/index-mail.c
src/lib-storage/index/index-mail.h

index 35aaa8a24ecd8e9ce2ac0f1b28bddf4d756d1824..17f4c24ff24d9c64e4f5375ed488a7a5e02b3195 100644 (file)
@@ -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;
index 5b945355465294698c2917555d999042a78f5e32..f790a357aa3d1ec2d6da9fe1a713e1b49e482909 100644 (file)
@@ -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
index 3ec1e1bad20f638b14b6500b409b492f7251e3bb..90bf1761909193f0995509e545a0ff01abf14b2d 100644 (file)
@@ -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);
index e7d0e4cd4695e52448521d65bd04654aa30e2e79..1aaa67681d3c168bb56cc56cc5592d520f0a0e48 100644 (file)
@@ -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)
index bb6929ddb3b32a2a62d3a56a9c34a579e3af131c..dc3a25b8fc0f477e4688bbbb3b611a8144d374a8 100644 (file)
@@ -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);
 }
index 4acf146a326154b0006bdbf5213715bd3f36c3d0..bc6d8af0cbfb5fc175ca050a50f1845b08d69095 100644 (file)
@@ -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,