dovecot: When reading the latest fields, begin finding the field...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Nov 6 20:55:40 EET 2007
details: http://hg.dovecot.org/dovecot/rev/68bb5bec043e
changeset: 6705:68bb5bec043e
user: Timo Sirainen <tss at iki.fi>
date: Tue Nov 06 20:55:36 2007 +0200
description:
When reading the latest fields, begin finding the fields from the last known
header instead of from the beginning.
diffstat:
3 files changed, 11 insertions(+), 2 deletions(-)
src/lib-index/mail-cache-fields.c | 11 +++++++++--
src/lib-index/mail-cache-private.h | 1 +
src/lib-index/mail-cache.c | 1 +
diffs (57 lines):
diff -r b0e8403b4bb1 -r 68bb5bec043e src/lib-index/mail-cache-fields.c
--- 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 @@ static int mail_cache_header_fields_get_
{
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 @@ static int mail_cache_header_fields_get_
/* 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 @@ static int mail_cache_header_fields_get_
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;
diff -r b0e8403b4bb1 -r 68bb5bec043e src/lib-index/mail-cache-private.h
--- 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 @@ struct mail_cache {
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. */
diff -r b0e8403b4bb1 -r 68bb5bec043e src/lib-index/mail-cache.c
--- 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 @@ void mail_cache_file_close(struct mail_c
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);
More information about the dovecot-cvs
mailing list