Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6705:68bb5bec043e HEAD
When reading the latest fields, begin finding the fields from the last known
header instead of from the beginning.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 06 Nov 2007 20:55:36 +0200 |
parents | b0e8403b4bb1 |
children | 4f999ac56a53 |
files | src/lib-index/mail-cache-fields.c src/lib-index/mail-cache-private.h src/lib-index/mail-cache.c |
diffstat | 3 files changed, 11 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-fields.c Tue Nov 06 20:49:45 2007 +0200 +++ b/src/lib-index/mail-cache-fields.c Tue Nov 06 20:55:36 2007 +0200 @@ -169,7 +169,7 @@ { const struct mail_cache_header_fields *field_hdr; struct mail_cache_header_fields tmp_field_hdr; - uint32_t offset, next_offset; + uint32_t offset = 0, next_offset; unsigned int next_count = 0; int ret; @@ -180,7 +180,8 @@ /* find the latest header */ offset = 0; - next_offset = + next_offset = cache->last_field_header_offset != 0 ? + cache->last_field_header_offset : mail_index_offset_to_uint32(cache->hdr->field_header_offset); while (next_offset != 0) { if (next_offset == offset) { @@ -219,6 +220,12 @@ next_count++; } + if (offset == 0) { + mail_cache_set_corrupted(cache, "missing header fields"); + return -1; + } + cache->last_field_header_offset = offset; + if (next_count > MAIL_CACHE_HEADER_FIELD_CONTINUE_COUNT) cache->need_compress_file_seq = cache->hdr->file_seq;
--- a/src/lib-index/mail-cache-private.h Tue Nov 06 20:49:45 2007 +0200 +++ b/src/lib-index/mail-cache-private.h Tue Nov 06 20:55:36 2007 +0200 @@ -156,6 +156,7 @@ uint32_t *field_file_map; unsigned int fields_count; struct hash_table *field_name_hash; /* name -> idx */ + uint32_t last_field_header_offset; /* 0 is no need for compression, otherwise the file sequence number which we want compressed. */
--- a/src/lib-index/mail-cache.c Tue Nov 06 20:49:45 2007 +0200 +++ b/src/lib-index/mail-cache.c Tue Nov 06 20:55:36 2007 +0200 @@ -58,6 +58,7 @@ cache->data = NULL; cache->hdr = NULL; cache->mmap_length = 0; + cache->last_field_header_offset = 0; if (cache->file_lock != NULL) file_lock_free(&cache->file_lock);