]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Deduplicate headers in struct mailbox_header_lookup_ctx
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 21 Jul 2016 14:32:52 +0000 (08:32 -0600)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 1 Mar 2018 16:10:24 +0000 (18:10 +0200)
This might slightly improve performance.

src/lib-storage/mailbox-header.c

index 434e4191af6dd492b8ec015bf7dc173e4f796ac3..2d6c12354459a8e9ad78a5e419bc1d512a68cc57 100644 (file)
@@ -18,7 +18,7 @@ mailbox_header_lookup_init_real(struct mailbox *box,
        const char *const *name;
        const char **sorted_headers, **dest_name;
        pool_t pool;
-       unsigned int i, count;
+       unsigned int i, j, count;
 
        i_assert(*headers != NULL);
 
@@ -33,10 +33,13 @@ mailbox_header_lookup_init_real(struct mailbox *box,
 
        /* @UNSAFE */
        fields = t_new(struct mail_cache_field, count);
-       for (i = 0; i < count; i++) {
+       for (i = j = 0; i < count; i++) {
+               if (i > 0 && strcasecmp(headers[i-1], headers[i]) == 0)
+                       continue;
                header_field.name = t_strconcat("hdr.", headers[i], NULL);
-               fields[i] = header_field;
+               fields[j++] = header_field;
        }
+       count = j;
        mail_cache_register_fields(box->cache, fields, count);
 
        pool = pool_alloconly_create("mailbox_header_lookup_ctx", 1024);
@@ -52,7 +55,7 @@ mailbox_header_lookup_init_real(struct mailbox *box,
        dest_name = p_new(pool, const char *, count + 1);
        for (i = 0; i < count; i++) {
                ctx->idx[i] = fields[i].idx;
-               dest_name[i] = p_strdup(pool, headers[i]);
+               dest_name[i] = p_strdup(pool, fields[i].name + strlen("hdr."));
        }
        ctx->name = dest_name;
        return ctx;