Mercurial > dovecot > original-hg > dovecot-1.2
changeset 458:06377dd1e2a9 HEAD
Added cache_fields_later() to MailIndex interface. That can be used to
specify when some field is wanted to be cached, instead of doing it at every
lookup_field*() call.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 20 Oct 2002 04:12:27 +0300 |
parents | 31cc41537495 |
children | 960075bacba6 |
files | src/lib-index/mail-index-update.c src/lib-index/mail-index-util.c src/lib-index/mail-index.c src/lib-index/mail-index.h src/lib-index/maildir/maildir-index.c src/lib-index/mbox/mbox-index.c src/lib-storage/index/index-msgcache.c src/lib-storage/index/index-search.c |
diffstat | 8 files changed, 68 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-update.c Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-index/mail-index-update.c Sun Oct 20 04:12:27 2002 +0300 @@ -387,8 +387,7 @@ CPU, maybe this should be configurable (I/O vs. CPU)? */ if ((cache_fields & FIELD_TYPE_BODY) && ((update->rec->cached_fields | cache_fields) & - FIELD_TYPE_BODYSTRUCTURE) == 0) - { + FIELD_TYPE_BODYSTRUCTURE) == 0) { t_push(); i_buffer_seek(inbuf, start_offset); value = imap_part_get_bodystructure(pool, &part,
--- a/src/lib-index/mail-index-util.c Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-index/mail-index-util.c Sun Oct 20 04:12:27 2002 +0300 @@ -125,7 +125,9 @@ part_data = index->lookup_field_raw(index, rec, FIELD_TYPE_MESSAGEPART, &size); - if (part_data != NULL) { + if (part_data == NULL) + index->cache_fields_later(index, rec, FIELD_TYPE_MESSAGEPART); + else { /* get sizes from preparsed message structure */ if (!message_part_deserialize_size(part_data, size, &hdr_size, &body_size)) {
--- a/src/lib-index/mail-index.c Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-index/mail-index.c Sun Oct 20 04:12:27 2002 +0300 @@ -568,8 +568,42 @@ return rec; } -static MailIndexDataRecord * -index_lookup_data_field(MailIndex *index, MailIndexRecord *rec, MailField field) +const char *mail_index_lookup_field(MailIndex *index, MailIndexRecord *rec, + MailField field) +{ + MailIndexDataRecord *datarec; + + datarec = (rec->cached_fields & field) == 0 ? NULL : + mail_index_data_lookup(index->data, rec, field); + if (datarec == NULL) + return NULL; + + if (!mail_index_data_record_verify(index->data, datarec)) { + /* index is corrupted, it will be rebuilt */ + return NULL; + } + + return datarec->data; +} + +const void *mail_index_lookup_field_raw(MailIndex *index, MailIndexRecord *rec, + MailField field, size_t *size) +{ + MailIndexDataRecord *datarec; + + datarec = (rec->cached_fields & field) == 0 ? NULL : + mail_index_data_lookup(index->data, rec, field); + if (datarec == NULL) { + *size = 0; + return NULL; + } + + *size = datarec->full_field_size; + return datarec->data; +} + +void mail_index_cache_fields_later(MailIndex *index, MailIndexRecord *rec, + MailField field) { i_assert(index->lock_type != MAIL_LOCK_UNLOCK); @@ -586,43 +620,7 @@ make sure it'll be cached soon. */ index->set_flags |= MAIL_INDEX_FLAG_CACHE_FIELDS; } - - return NULL; } - - return mail_index_data_lookup(index->data, rec, field); -} - -const char *mail_index_lookup_field(MailIndex *index, MailIndexRecord *rec, - MailField field) -{ - MailIndexDataRecord *datarec; - - datarec = index_lookup_data_field(index, rec, field); - if (datarec == NULL) - return NULL; - - if (!mail_index_data_record_verify(index->data, datarec)) { - /* index is corrupted, it will be rebuilt */ - return NULL; - } - - return datarec->data; -} - -const void *mail_index_lookup_field_raw(MailIndex *index, MailIndexRecord *rec, - MailField field, size_t *size) -{ - MailIndexDataRecord *datarec; - - datarec = index_lookup_data_field(index, rec, field); - if (datarec == NULL) { - *size = 0; - return NULL; - } - - *size = datarec->full_field_size; - return datarec->data; } void mail_index_mark_flag_changes(MailIndex *index, MailIndexRecord *rec,
--- a/src/lib-index/mail-index.h Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-index/mail-index.h Sun Oct 20 04:12:27 2002 +0300 @@ -227,6 +227,12 @@ const void *(*lookup_field_raw)(MailIndex *index, MailIndexRecord *rec, MailField field, size_t *size); + /* Mark the fields to be cached later. If any of them is already + set in hdr->cache_fields, mark the caching to happen next time + index is opened. */ + void (*cache_fields_later)(MailIndex *index, MailIndexRecord *rec, + MailField field); + /* Open mail file and return it as mmap()ed IBuffer. If we fails, we return NULL and set deleted = TRUE if failure was because the mail was just deleted (ie. not an error). */ @@ -365,6 +371,8 @@ MailField field); const void *mail_index_lookup_field_raw(MailIndex *index, MailIndexRecord *rec, MailField field, size_t *size); +void mail_index_cache_fields_later(MailIndex *index, MailIndexRecord *rec, + MailField field); int mail_index_expunge(MailIndex *index, MailIndexRecord *rec, unsigned int seq, int external_change); int mail_index_update_flags(MailIndex *index, MailIndexRecord *rec,
--- a/src/lib-index/maildir/maildir-index.c Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-index/maildir/maildir-index.c Sun Oct 20 04:12:27 2002 +0300 @@ -215,6 +215,7 @@ mail_index_lookup_uid_range, mail_index_lookup_field, mail_index_lookup_field_raw, + mail_index_cache_fields_later, maildir_open_mail, mail_index_expunge, maildir_index_update_flags,
--- a/src/lib-index/mbox/mbox-index.c Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-index/mbox/mbox-index.c Sun Oct 20 04:12:27 2002 +0300 @@ -597,6 +597,7 @@ mail_index_lookup_uid_range, mail_index_lookup_field, mail_index_lookup_field_raw, + mail_index_cache_fields_later, mbox_open_mail, mail_index_expunge, mbox_index_update_flags,
--- a/src/lib-storage/index/index-msgcache.c Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-storage/index/index-msgcache.c Sun Oct 20 04:12:27 2002 +0300 @@ -50,6 +50,7 @@ { IndexMsgcacheContext *ctx = context; MailField index_field; + const char *ret; switch (field) { case IMAP_CACHE_BODY: @@ -62,11 +63,15 @@ index_field = FIELD_TYPE_ENVELOPE; break; default: - index_field = 0; + return NULL; } - return index_field == 0 ? NULL : - ctx->index->lookup_field(ctx->index, ctx->rec, index_field); + ret = ctx->index->lookup_field(ctx->index, ctx->rec, index_field); + if (ret == NULL) { + ctx->index->cache_fields_later(ctx->index, ctx->rec, + index_field); + } + return ret; } static MessagePart *index_msgcache_get_cached_parts(Pool pool, void *context) @@ -79,8 +84,11 @@ part_data = ctx->index->lookup_field_raw(ctx->index, ctx->rec, FIELD_TYPE_MESSAGEPART, &part_size); - if (part_data == NULL) + if (part_data == NULL) { + ctx->index->cache_fields_later(ctx->index, ctx->rec, + FIELD_TYPE_MESSAGEPART); return NULL; + } part = message_part_deserialize(pool, part_data, part_size); if (part == NULL) {
--- a/src/lib-storage/index/index-search.c Sun Oct 20 04:11:03 2002 +0300 +++ b/src/lib-storage/index/index-search.c Sun Oct 20 04:12:27 2002 +0300 @@ -288,8 +288,12 @@ /* get field from hopefully cached envelope */ envelope = index->lookup_field(index, rec, FIELD_TYPE_ENVELOPE); - field = envelope == NULL ? NULL : - imap_envelope_parse(envelope, env_field); + if (envelope != NULL) + field = imap_envelope_parse(envelope, env_field); + else { + index->cache_fields_later(index, rec, FIELD_TYPE_ENVELOPE); + field = NULL; + } if (field == NULL) ret = -1;