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);