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;