changeset 12885:2c04c3dcd544

lib-storage: Removed struct mail_private.extra_* fields. There isn't much point in keeping them separated.
author Timo Sirainen <tss@iki.fi>
date Mon, 04 Apr 2011 16:02:05 +0300
parents f051c326463e
children 1ff458ba2e4b
files src/lib-storage/index/index-mail-headers.c src/lib-storage/index/index-search.c src/lib-storage/index/index-thread.c src/lib-storage/mail-storage-private.h
diffstat 4 files changed, 37 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-mail-headers.c	Mon Apr 04 15:41:19 2011 +0300
+++ b/src/lib-storage/index/index-mail-headers.c	Mon Apr 04 16:02:05 2011 +0300
@@ -152,7 +152,6 @@
 bool index_mail_want_parse_headers(struct index_mail *mail)
 {
 	if (mail->wanted_headers != NULL ||
-	    mail->mail.extra_wanted_headers != NULL ||
 	    mail->data.save_bodystructure_header)
 		return TRUE;
 
@@ -225,13 +224,6 @@
 				      &mail->header_match_value);
 		}
 	}
-	if (mail->mail.extra_wanted_headers != NULL) {
-		headers = mail->mail.extra_wanted_headers;
-		for (i = 0; i < headers->count; i++) {
-			array_idx_set(&mail->header_match, headers->idx[i],
-				      &mail->header_match_value);
-		}
-	}
 
 	/* register also all the other headers that exist in cache file */
 	T_BEGIN {
--- a/src/lib-storage/index/index-search.c	Mon Apr 04 15:41:19 2011 +0300
+++ b/src/lib-storage/index/index-search.c	Mon Apr 04 16:02:05 2011 +0300
@@ -1036,41 +1036,55 @@
 static void
 wanted_sort_fields_get(struct mailbox *box,
 		       const enum mail_sort_type *sort_program,
+		       struct mailbox_header_lookup_ctx *wanted_headers,
 		       enum mail_fetch_field *wanted_fields_r,
 		       struct mailbox_header_lookup_ctx **headers_ctx_r)
 {
-	const char *headers[2];
+	ARRAY_TYPE(const_string) headers;
+	const char *header;
+	unsigned int i;
 
 	*wanted_fields_r = 0;
 	*headers_ctx_r = NULL;
 
-	headers[0] = headers[1] = NULL;
+	t_array_init(&headers, 8);
+	header = NULL;
 	switch (sort_program[0] & MAIL_SORT_MASK) {
 	case MAIL_SORT_ARRIVAL:
-		*wanted_fields_r = MAIL_FETCH_RECEIVED_DATE;
+		*wanted_fields_r |= MAIL_FETCH_RECEIVED_DATE;
 		break;
 	case MAIL_SORT_CC:
-		headers[0] = "Cc";
+		header = "Cc";
 		break;
 	case MAIL_SORT_DATE:
-		*wanted_fields_r = MAIL_FETCH_DATE;
+		*wanted_fields_r |= MAIL_FETCH_DATE;
 		break;
 	case MAIL_SORT_FROM:
-		headers[0] = "From";
+		header = "From";
 		break;
 	case MAIL_SORT_SIZE:
-		*wanted_fields_r = MAIL_FETCH_VIRTUAL_SIZE;
+		*wanted_fields_r |= MAIL_FETCH_VIRTUAL_SIZE;
 		break;
 	case MAIL_SORT_SUBJECT:
-		headers[0] = "Subject";
+		header = "Subject";
 		break;
 	case MAIL_SORT_TO:
-		headers[0] = "To";
+		header = "To";
 		break;
 	}
+	if (header != NULL)
+		array_append(&headers, &header, 1);
 
-	if (headers[0] != NULL)
-		*headers_ctx_r = mailbox_header_lookup_init(box, headers);
+	if (wanted_headers != NULL) {
+		for (i = 0; wanted_headers->name[i] != NULL; i++)
+			array_append(&headers, &wanted_headers->name[i], 1);
+	}
+
+	if (array_count(&headers) > 0) {
+		(void)array_append_space(&headers);
+		*headers_ctx_r = mailbox_header_lookup_init(box,
+							array_idx(&headers, 0));
+	}
 }
 
 struct mail_search_context *
@@ -1089,11 +1103,6 @@
 	ctx->view = t->view;
 	ctx->mail_ctx.args = args;
 	ctx->mail_ctx.sort_program = index_sort_program_init(t, sort_program);
-	ctx->mail_ctx.wanted_fields = wanted_fields;
-	if (wanted_headers != NULL) {
-		ctx->mail_ctx.wanted_headers = wanted_headers;
-		mailbox_header_lookup_ref(wanted_headers);
-	}
 
 	ctx->max_mails = t->box->storage->set->mail_prefetch_count + 1;
 	if (ctx->max_mails == 0)
@@ -1119,10 +1128,14 @@
 	}
 
 	if (sort_program != NULL) {
-		wanted_sort_fields_get(ctx->box, sort_program,
-				       &ctx->extra_wanted_fields,
-				       &ctx->extra_wanted_headers);
+		wanted_sort_fields_get(ctx->box, sort_program, wanted_headers,
+				       &ctx->mail_ctx.wanted_fields,
+				       &ctx->mail_ctx.wanted_headers);
+	} else if (wanted_headers != NULL) {
+		ctx->mail_ctx.wanted_headers = wanted_headers;
+		mailbox_header_lookup_ref(wanted_headers);
 	}
+	ctx->mail_ctx.wanted_fields |= wanted_fields;
 
 	search_get_seqset(ctx, status.messages, args->args);
 	(void)mail_search_args_foreach(args->args, search_init_arg, ctx);
@@ -1157,8 +1170,6 @@
 
 	if (ctx->mail_ctx.wanted_headers != NULL)
 		mailbox_header_lookup_unref(&ctx->mail_ctx.wanted_headers);
-	if (ctx->extra_wanted_headers != NULL)
-		mailbox_header_lookup_unref(&ctx->extra_wanted_headers);
 	if (ctx->mail_ctx.sort_program != NULL)
 		index_sort_program_deinit(&ctx->mail_ctx.sort_program);
 	if (ctx->thread_ctx != NULL)
@@ -1456,8 +1467,6 @@
 	imail = (struct index_mail *)mail;
 	imail->search_mail = TRUE;
 	imail->mail.stats_track = TRUE;
-	imail->mail.extra_wanted_fields = ctx->extra_wanted_fields;
-	imail->mail.extra_wanted_headers = ctx->extra_wanted_headers;
 
 	array_append(&ctx->mails, &mail, 1);
 	return mail;
--- a/src/lib-storage/index/index-thread.c	Mon Apr 04 15:41:19 2011 +0300
+++ b/src/lib-storage/index/index-thread.c	Mon Apr 04 16:02:05 2011 +0300
@@ -7,13 +7,10 @@
 #include "bsearch-insert-pos.h"
 #include "hash2.h"
 #include "message-id.h"
-#include "mail-index-private.h"
-#include "mail-index-sync-private.h"
 #include "mail-search.h"
 #include "mail-search-build.h"
 #include "mailbox-search-result-private.h"
 #include "index-storage.h"
-#include "index-search-private.h"
 #include "index-thread-private.h"
 
 #include <stdlib.h>
@@ -298,11 +295,10 @@
 		NULL
 	};
 	struct mail_thread_mailbox *tbox = MAIL_THREAD_CONTEXT(ctx->box);
+	struct mailbox_header_lookup_ctx *headers_ctx;
 	struct mail_search_args *search_args;
 	struct mail_search_context *search_ctx;
-	struct index_search_context *search_ctx_i;
 	struct mail *mail;
-	struct mail_private *pmail;
 	uint32_t last_uid, seq1, seq2;
 	int ret = 0;
 
@@ -318,10 +314,8 @@
 						    &tbox->msgid_hash);
 	}
 
-	ctx->tmp_mail = mail_alloc(ctx->t, 0, NULL);
-	pmail = (struct mail_private *)ctx->tmp_mail;
-	pmail->extra_wanted_headers =
-		mailbox_header_lookup_init(ctx->box, wanted_headers);
+	headers_ctx = mailbox_header_lookup_init(ctx->box, wanted_headers);
+	ctx->tmp_mail = mail_alloc(ctx->t, 0, headers_ctx);
 
 	/* add all missing UIDs */
 	ctx->strmap_sync = mail_index_strmap_view_sync_init(tbox->strmap_view,
@@ -336,11 +330,8 @@
 
 	search_args = mail_search_build_init();
 	mail_search_build_add_seqset(search_args, seq1, seq2);
-	search_ctx = mailbox_search_init(ctx->t, search_args, NULL, 0, NULL);
-
-	search_ctx_i = (struct index_search_context *)search_ctx;
-	search_ctx_i->extra_wanted_headers =
-		mailbox_header_lookup_init(ctx->box, wanted_headers);
+	search_ctx = mailbox_search_init(ctx->t, search_args, NULL,
+					 0, headers_ctx);
 
 	while (mailbox_search_next(search_ctx, &mail)) {
 		if (mail_thread_map_add_mail(ctx, mail) < 0) {
@@ -586,9 +577,6 @@
 
 static void mail_thread_clear(struct mail_thread_context *ctx)
 {
-	struct mail_private *pmail = (struct mail_private *)ctx->tmp_mail;
-
-	mailbox_header_lookup_unref(&pmail->extra_wanted_headers);
 	mail_free(&ctx->tmp_mail);
 	(void)mailbox_transaction_commit(&ctx->t);
 }
--- a/src/lib-storage/mail-storage-private.h	Mon Apr 04 15:41:19 2011 +0300
+++ b/src/lib-storage/mail-storage-private.h	Mon Apr 04 16:02:05 2011 +0300
@@ -336,12 +336,6 @@
 	pool_t pool;
 	ARRAY_DEFINE(module_contexts, union mail_module_context *);
 
-	/* temporary extra wanted fields/headers that should be looked up
-	   automatically if possible. for example sort_program fields during
-	   search. */
-	enum mail_fetch_field extra_wanted_fields;
-	struct mailbox_header_lookup_ctx *extra_wanted_headers;
-
 	/* these statistics are never reset by mail-storage API: */
 
 	unsigned long stats_open_lookup_count;