dovecot-2.1: lib-storage: Added mail_log_update_wanted_fields()

dovecot at dovecot.org dovecot at dovecot.org
Wed Oct 12 19:00:44 EEST 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/e77601949937
changeset: 13633:e77601949937
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Oct 12 19:08:31 2011 +0300
description:
lib-storage: Added mail_log_update_wanted_fields()

diffstat:

 src/lib-storage/index/cydir/cydir-mail.c       |    1 +
 src/lib-storage/index/dbox-multi/mdbox-mail.c  |    1 +
 src/lib-storage/index/dbox-single/sdbox-mail.c |    1 +
 src/lib-storage/index/imapc/imapc-mail-fetch.c |    2 +-
 src/lib-storage/index/imapc/imapc-mail.c       |   47 +++++--
 src/lib-storage/index/index-mail-headers.c     |   15 +-
 src/lib-storage/index/index-mail.c             |  146 ++++++++++++++++--------
 src/lib-storage/index/index-mail.h             |    8 +-
 src/lib-storage/index/maildir/maildir-mail.c   |    5 +-
 src/lib-storage/index/mbox/mbox-mail.c         |    1 +
 src/lib-storage/index/raw/raw-mail.c           |    1 +
 src/lib-storage/mail-storage-private.h         |    4 +
 src/lib-storage/mail-storage.h                 |    6 +
 src/lib-storage/mail.c                         |    9 +
 src/lib-storage/test-mail.c                    |    8 +
 src/plugins/virtual/virtual-mail.c             |   12 ++
 16 files changed, 191 insertions(+), 76 deletions(-)

diffs (truncated from 669 to 300 lines):

diff -r fad85406a088 -r e77601949937 src/lib-storage/index/cydir/cydir-mail.c
--- a/src/lib-storage/index/cydir/cydir-mail.c	Wed Oct 12 17:21:01 2011 +0300
+++ b/src/lib-storage/index/cydir/cydir-mail.c	Wed Oct 12 19:08:31 2011 +0300
@@ -133,6 +133,7 @@
 	index_mail_set_uid_cache_updates,
 	index_mail_prefetch,
 	index_mail_precache,
+	index_mail_add_temp_wanted_fields,
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
diff -r fad85406a088 -r e77601949937 src/lib-storage/index/dbox-multi/mdbox-mail.c
--- a/src/lib-storage/index/dbox-multi/mdbox-mail.c	Wed Oct 12 17:21:01 2011 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c	Wed Oct 12 19:08:31 2011 +0300
@@ -192,6 +192,7 @@
 	index_mail_set_uid_cache_updates,
 	index_mail_prefetch,
 	index_mail_precache,
+	index_mail_add_temp_wanted_fields,
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
diff -r fad85406a088 -r e77601949937 src/lib-storage/index/dbox-single/sdbox-mail.c
--- a/src/lib-storage/index/dbox-single/sdbox-mail.c	Wed Oct 12 17:21:01 2011 +0300
+++ b/src/lib-storage/index/dbox-single/sdbox-mail.c	Wed Oct 12 19:08:31 2011 +0300
@@ -100,6 +100,7 @@
 	index_mail_set_uid_cache_updates,
 	index_mail_prefetch,
 	index_mail_precache,
+	index_mail_add_temp_wanted_fields,
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
diff -r fad85406a088 -r e77601949937 src/lib-storage/index/imapc/imapc-mail-fetch.c
--- a/src/lib-storage/index/imapc/imapc-mail-fetch.c	Wed Oct 12 17:21:01 2011 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail-fetch.c	Wed Oct 12 19:08:31 2011 +0300
@@ -149,7 +149,7 @@
 	if (mbox->prev_mail_cache.uid == _mail->uid)
 		imapc_mail_cache_get(mail, &mbox->prev_mail_cache);
 
-	if ((mail->imail.wanted_fields & MAIL_FETCH_RECEIVED_DATE) != 0 &&
+	if ((data->wanted_fields & MAIL_FETCH_RECEIVED_DATE) != 0 &&
 	    data->received_date == (time_t)-1)
 		fields |= MAIL_FETCH_RECEIVED_DATE;
 
diff -r fad85406a088 -r e77601949937 src/lib-storage/index/imapc/imapc-mail.c
--- a/src/lib-storage/index/imapc/imapc-mail.c	Wed Oct 12 17:21:01 2011 +0300
+++ b/src/lib-storage/index/imapc/imapc-mail.c	Wed Oct 12 19:08:31 2011 +0300
@@ -180,44 +180,62 @@
 	return TRUE;
 }
 
-static void imapc_mail_set_seq(struct mail *_mail, uint32_t seq, bool saving)
+static void index_mail_update_access_parts(struct index_mail *mail)
 {
-	struct imapc_mail *imail = (struct imapc_mail *)_mail;
-	struct index_mail *mail = &imail->imail;
+	struct mail *_mail = &mail->mail.mail;
+	struct index_mail_data *data = &mail->data;
 	struct mailbox_header_lookup_ctx *header_ctx;
 	time_t date;
 	uoff_t size;
 
-	index_mail_set_seq(_mail, seq, saving);
-
-	if ((mail->wanted_fields & MAIL_FETCH_RECEIVED_DATE) != 0)
+	if ((data->wanted_fields & MAIL_FETCH_RECEIVED_DATE) != 0)
 		(void)index_mail_get_received_date(_mail, &date);
-	if ((mail->wanted_fields & MAIL_FETCH_PHYSICAL_SIZE) != 0) {
+	if ((data->wanted_fields & MAIL_FETCH_PHYSICAL_SIZE) != 0) {
 		if (index_mail_get_physical_size(_mail, &size) < 0)
-			mail->data.access_part |= READ_HDR | READ_BODY;
+			data->access_part |= READ_HDR | READ_BODY;
 	}
 
-	if (mail->data.access_part == 0 && mail->wanted_headers != NULL) {
+	if (data->access_part == 0 && data->wanted_headers != NULL) {
 		/* see if all wanted headers exist in cache */
-		if (!imapc_mail_has_headers_in_cache(mail, mail->wanted_headers))
-			mail->data.access_part |= PARSE_HDR;
+		if (!imapc_mail_has_headers_in_cache(mail, data->wanted_headers))
+			data->access_part |= PARSE_HDR;
 	}
-	if (mail->data.access_part == 0 &&
-	    (mail->wanted_fields & MAIL_FETCH_IMAP_ENVELOPE) != 0) {
+	if (data->access_part == 0 &&
+	    (data->wanted_fields & MAIL_FETCH_IMAP_ENVELOPE) != 0) {
 		/* the common code already checked this partially,
 		   but we need a guaranteed correct answer */
 		header_ctx = mailbox_header_lookup_init(_mail->box,
 							imap_envelope_headers);
 		if (!imapc_mail_has_headers_in_cache(mail, header_ctx))
-			mail->data.access_part |= PARSE_HDR;
+			data->access_part |= PARSE_HDR;
 		mailbox_header_lookup_unref(&header_ctx);
 	}
+}
+
+static void imapc_mail_set_seq(struct mail *_mail, uint32_t seq, bool saving)
+{
+	struct imapc_mail *imail = (struct imapc_mail *)_mail;
+	struct index_mail *mail = &imail->imail;
+
+	index_mail_set_seq(_mail, seq, saving);
+
 	/* searching code handles prefetching internally,
 	   elsewhere we want to do it immediately */
 	if (!mail->search_mail && !_mail->saving)
 		(void)imapc_mail_prefetch(_mail);
 }
 
+static void
+imapc_mail_add_temp_wanted_fields(struct mail *_mail,
+				  enum mail_fetch_field fields,
+				  struct mailbox_header_lookup_ctx *headers)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+
+	index_mail_add_temp_wanted_fields(_mail, fields, headers);
+	index_mail_update_access_parts(mail);
+}
+
 static void imapc_mail_close(struct mail *_mail)
 {
 	struct imapc_mail *mail = (struct imapc_mail *)_mail;
@@ -257,6 +275,7 @@
 	index_mail_set_uid_cache_updates,
 	imapc_mail_prefetch,
 	index_mail_precache,
+	imapc_mail_add_temp_wanted_fields,
 
 	index_mail_get_flags,
 	index_mail_get_keywords,
diff -r fad85406a088 -r e77601949937 src/lib-storage/index/index-mail-headers.c
--- a/src/lib-storage/index/index-mail-headers.c	Wed Oct 12 17:21:01 2011 +0300
+++ b/src/lib-storage/index/index-mail-headers.c	Wed Oct 12 19:08:31 2011 +0300
@@ -151,7 +151,7 @@
 
 bool index_mail_want_parse_headers(struct index_mail *mail)
 {
-	if (mail->wanted_headers != NULL ||
+	if (mail->data.wanted_headers != NULL ||
 	    mail->data.save_bodystructure_header)
 		return TRUE;
 
@@ -185,10 +185,11 @@
 void index_mail_parse_header_init(struct index_mail *mail,
 				  struct mailbox_header_lookup_ctx *headers)
 {
+	struct index_mail_data *data = &mail->data;
 	const uint8_t *match;
 	unsigned int i, field_idx, match_count;
 
-	mail->header_seq = mail->data.seq;
+	mail->header_seq = data->seq;
 	if (mail->header_data == NULL) {
 		mail->header_data = buffer_create_dynamic(default_pool, 4096);
 		i_array_init(&mail->header_lines, 32);
@@ -217,8 +218,8 @@
 		}
 	}
 
-	if (mail->wanted_headers != NULL && mail->wanted_headers != headers) {
-		headers = mail->wanted_headers;
+	if (data->wanted_headers != NULL && data->wanted_headers != headers) {
+		headers = data->wanted_headers;
 		for (i = 0; i < headers->count; i++) {
 			array_idx_set(&mail->header_match, headers->idx[i],
 				      &mail->header_match_value);
@@ -240,10 +241,10 @@
 	if (field_idx < match_count &&
 	    match[field_idx] == mail->header_match_value) {
 		/* cache Date: header */
-	} else if ((mail->data.cache_fetch_fields & MAIL_FETCH_DATE) != 0 ||
-		   mail->data.save_sent_date) {
+	} else if ((data->cache_fetch_fields & MAIL_FETCH_DATE) != 0 ||
+		   data->save_sent_date) {
 		/* parse Date: header, but don't cache it. */
-		mail->data.dont_cache_field_idx = field_idx;
+		data->dont_cache_field_idx = field_idx;
 		array_idx_set(&mail->header_match, field_idx,
 			      &mail->header_match_value);
 	}
diff -r fad85406a088 -r e77601949937 src/lib-storage/index/index-mail.c
--- a/src/lib-storage/index/index-mail.c	Wed Oct 12 17:21:01 2011 +0300
+++ b/src/lib-storage/index/index-mail.c	Wed Oct 12 19:08:31 2011 +0300
@@ -457,8 +457,8 @@
 		mail->ibox->cache_fields[MAIL_CACHE_IMAP_BODYSTRUCTURE].idx;
 	struct mail *_mail = &mail->mail.mail;
 
-	if ((mail->wanted_fields & (MAIL_FETCH_IMAP_BODY |
-				    MAIL_FETCH_IMAP_BODYSTRUCTURE)) != 0)
+	if ((mail->data.wanted_fields & (MAIL_FETCH_IMAP_BODY |
+					 MAIL_FETCH_IMAP_BODYSTRUCTURE)) != 0)
 		return TRUE;
 
 	if (mail_cache_field_want_add(_mail->transaction->cache_trans,
@@ -544,7 +544,7 @@
 	}
 	if (decision == MAIL_CACHE_DECISION_NO &&
 	    !data->save_message_parts &&
-	    (mail->wanted_fields & MAIL_FETCH_MESSAGE_PARTS) == 0) {
+	    (data->wanted_fields & MAIL_FETCH_MESSAGE_PARTS) == 0) {
 		/* we didn't really care about the message parts themselves,
 		   just wanted to use something that depended on it */
 		return;
@@ -596,7 +596,7 @@
 	if (plain_bodystructure)
 		cache_bodystructure = FALSE;
 	else if (field == MAIL_CACHE_IMAP_BODYSTRUCTURE ||
-		 (mail->wanted_fields & MAIL_FETCH_IMAP_BODYSTRUCTURE) != 0) {
+		 (data->wanted_fields & MAIL_FETCH_IMAP_BODYSTRUCTURE) != 0) {
 		cache_bodystructure =
 			mail_cache_field_can_add(_mail->transaction->cache_trans,
 				_mail->seq, cache_field_bodystructure);
@@ -1113,15 +1113,13 @@
 	mail->mail.v = *t->box->mail_vfuncs;
 	mail->mail.mail.box = t->box;
 	mail->mail.mail.transaction = t;
-	mail->mail.wanted_fields = wanted_fields;
-	mail->mail.wanted_headers = wanted_headers;
 
 	t->mail_ref_count++;
 	mail->data_pool = pool_alloconly_create("index_mail", 16384);
 	mail->ibox = INDEX_STORAGE_CONTEXT(t->box);
-	mail->wanted_fields = wanted_fields;
+	mail->mail.wanted_fields = wanted_fields;
 	if (wanted_headers != NULL) {
-		mail->wanted_headers = wanted_headers;
+		mail->mail.wanted_headers = wanted_headers;
 		mailbox_header_lookup_ref(wanted_headers);
 	}
 }
@@ -1164,6 +1162,8 @@
 	}
 
 	index_mail_close_streams(mail);
+	if (mail->data.wanted_headers != NULL)
+		mailbox_header_lookup_unref(&mail->data.wanted_headers);
 }
 
 static void index_mail_reset(struct index_mail *mail)
@@ -1182,6 +1182,12 @@
 	data->sent_date.time = (uint32_t)-1;
 	data->dont_cache_field_idx = -1U;
 
+	data->wanted_fields = mail->mail.wanted_fields;
+	if (mail->mail.wanted_headers != NULL) {
+		data->wanted_headers = mail->mail.wanted_headers;
+		mailbox_header_lookup_ref(data->wanted_headers);
+	}
+
 	mail->mail.mail.seq = 0;
 	mail->mail.mail.uid = 0;
 	mail->mail.mail.expunged = FALSE;
@@ -1219,35 +1225,19 @@
 	mail->data.save_envelope = TRUE;
 }
 
-void index_mail_set_seq(struct mail *_mail, uint32_t seq, bool saving)
+static void index_mail_update_access_parts(struct index_mail *mail)
 {
-	struct index_mail *mail = (struct index_mail *)_mail;
+	struct mail *_mail = &mail->mail.mail;
 	struct index_mail_data *data = &mail->data;
 	const struct mail_cache_field *cache_fields = mail->ibox->cache_fields;
 	struct mail_cache_view *cache_view = _mail->transaction->cache_view;
 	const struct mail_index_header *hdr;
 	struct istream *input;
 
-	if (data->seq == seq)
-		return;
-
-	index_mail_reset(mail);
-
-	data->seq = seq;
-
-	mail->mail.mail.seq = seq;
-	mail->mail.mail.saving = saving;
-	mail_index_lookup_uid(_mail->transaction->view, seq,
-			      &mail->mail.mail.uid);
-
-	if (mail_index_view_is_inconsistent(_mail->transaction->view)) {
-		mail_set_expunged(&mail->mail.mail);
-		return;
-	}
-
-	if ((mail->wanted_fields & (MAIL_FETCH_NUL_STATE |
+	if ((data->wanted_fields & (MAIL_FETCH_NUL_STATE |
 				    MAIL_FETCH_IMAP_BODY |
-				    MAIL_FETCH_IMAP_BODYSTRUCTURE)) != 0) {
+				    MAIL_FETCH_IMAP_BODYSTRUCTURE)) != 0 &&
+	    !_mail->has_nuls && !_mail->has_no_nuls) {
 		(void)index_mail_get_fixed_field(mail, MAIL_CACHE_FLAGS,
 						 &data->cache_flags,
 						 sizeof(data->cache_flags));
@@ -1262,44 +1252,48 @@
 
 	/* see if wanted_fields can tell us if we need to read/parse
 	   header/body */


More information about the dovecot-cvs mailing list