changeset 21605:bcd286fcdbad

lib-storage: Add mail.access_type
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 17 Feb 2017 19:29:03 +0200
parents fb8ef6e2c2fe
children 6f2e7eb1ee90
files src/lib-storage/index/index-search.c src/lib-storage/index/index-sort.c src/lib-storage/mail-storage.h
diffstat 3 files changed, 21 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-search.c	Fri Feb 17 19:07:53 2017 +0200
+++ b/src/lib-storage/index/index-search.c	Fri Feb 17 19:29:03 2017 +0200
@@ -1591,9 +1591,14 @@
 		mail_set_seq(mail, _ctx->seq);
 
 		ctx->cur_mail = mail;
+		/* mail's access_type is SEARCH only while using it to process
+		   the search query. afterwards the mail can still be accessed
+		   for fetching. */
+		ctx->cur_mail->access_type = MAIL_ACCESS_TYPE_SEARCH;
 		T_BEGIN {
 			match = search_match_next(ctx);
 		} T_END;
+		ctx->cur_mail->access_type = MAIL_ACCESS_TYPE_DEFAULT;
 		ctx->cur_mail = NULL;
 
 		i_assert(imail->data.search_results == NULL);
--- a/src/lib-storage/index/index-sort.c	Fri Feb 17 19:07:53 2017 +0200
+++ b/src/lib-storage/index/index-sort.c	Fri Feb 17 19:29:03 2017 +0200
@@ -170,6 +170,7 @@
 			 struct mail *mail)
 {
 	enum mail_lookup_abort orig_abort = mail->lookup_abort;
+	enum mail_access_type orig_access_type = mail->access_type;
 	bool prev_slow = mail->mail_stream_opened ||
 		mail->mail_metadata_accessed;
 
@@ -177,9 +178,13 @@
 
 	if (program->slow_mails_left == 0)
 		mail->lookup_abort = MAIL_LOOKUP_ABORT_NOT_IN_CACHE;
+
+	mail->access_type = MAIL_ACCESS_TYPE_SORT;
 	T_BEGIN {
 		program->sort_list_add(program, mail);
 	} T_END;
+	mail->access_type = orig_access_type;
+
 	if (!prev_slow && (mail->mail_stream_opened ||
 			   mail->mail_metadata_accessed)) {
 		i_assert(program->slow_mails_left > 0);
@@ -308,6 +313,7 @@
 	program = i_new(struct mail_search_sort_program, 1);
 	program->t = t;
 	program->temp_mail = mail_alloc(t, 0, NULL);
+	program->temp_mail->access_type = MAIL_ACCESS_TYPE_SORT;
 
 	program->slow_mails_left =
 		program->t->box->storage->set->mail_sort_max_read_count;
--- a/src/lib-storage/mail-storage.h	Fri Feb 17 19:07:53 2017 +0200
+++ b/src/lib-storage/mail-storage.h	Fri Feb 17 19:29:03 2017 +0200
@@ -373,6 +373,14 @@
 	MAIL_LOOKUP_ABORT_NOT_IN_CACHE
 };
 
+enum mail_access_type {
+	MAIL_ACCESS_TYPE_DEFAULT = 0,
+	/* Mail is being used for searching */
+	MAIL_ACCESS_TYPE_SEARCH,
+	/* Mail is being used for sorting results */
+	MAIL_ACCESS_TYPE_SORT,
+};
+
 struct mail {
 	/* always set */
 	struct mailbox *box;
@@ -394,6 +402,8 @@
 	   MAIL_LOOKUP_ABORT_NOT_IN_CACHE, this can't become TRUE. */
 	bool mail_metadata_accessed:1;
 
+	enum mail_access_type access_type;
+
 	/* If the lookup is aborted, error is set to MAIL_ERROR_NOTPOSSIBLE */
 	enum mail_lookup_abort lookup_abort;
 };