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