dovecot-1.1: dbox: Use POP3 UIDLs from metadata if they exist.

dovecot at dovecot.org dovecot at dovecot.org
Mon Jun 2 20:01:49 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/2d367594b41c
changeset: 7593:2d367594b41c
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jun 02 20:01:42 2008 +0300
description:
dbox: Use POP3 UIDLs from metadata if they exist.

diffstat:

4 files changed, 50 insertions(+), 4 deletions(-)
src/lib-storage/index/dbox/dbox-file-maildir.c |    1 
src/lib-storage/index/dbox/dbox-file.h         |    8 ++--
src/lib-storage/index/dbox/dbox-mail.c         |   44 +++++++++++++++++++++++-
src/lib-storage/index/dbox/dbox-sync-file.c    |    1 

diffs (114 lines):

diff -r c53e20911f07 -r 2d367594b41c src/lib-storage/index/dbox/dbox-file-maildir.c
--- a/src/lib-storage/index/dbox/dbox-file-maildir.c	Mon Jun 02 20:00:45 2008 +0300
+++ b/src/lib-storage/index/dbox/dbox-file-maildir.c	Mon Jun 02 20:01:42 2008 +0300
@@ -73,6 +73,7 @@ const char *dbox_file_maildir_metadata_g
 					      &size))
 			value = dec2str(size);
 		break;
+	case DBOX_METADATA_POP3_UIDL:
 	case DBOX_METADATA_EXPUNGED:
 	case DBOX_METADATA_EXT_REF:
 	case DBOX_METADATA_SPACE:
diff -r c53e20911f07 -r 2d367594b41c src/lib-storage/index/dbox/dbox-file.h
--- a/src/lib-storage/index/dbox/dbox-file.h	Mon Jun 02 20:00:45 2008 +0300
+++ b/src/lib-storage/index/dbox/dbox-file.h	Mon Jun 02 20:01:42 2008 +0300
@@ -54,15 +54,17 @@ enum dbox_metadata_key {
 	DBOX_METADATA_FLAGS		= 'F',
 	/* Space separated list of keywords */
 	DBOX_METADATA_KEYWORDS		= 'K',
-	/* Pointer to external message data. Format is:
-	   1*(<start offset> <byte count> <ref>) */
-	DBOX_METADATA_EXT_REF		= 'P',
+	/* POP3 UIDL overriding the default format */
+	DBOX_METADATA_POP3_UIDL		= 'P',
 	/* Received UNIX timestamp in hex */
 	DBOX_METADATA_RECEIVED_TIME	= 'R',
 	/* Saved UNIX timestamp in hex */
 	DBOX_METADATA_SAVE_TIME		= 'S',
 	/* Virtual message size in hex (line feeds counted as CRLF) */
 	DBOX_METADATA_VIRTUAL_SIZE	= 'V',
+	/* Pointer to external message data. Format is:
+	   1*(<start offset> <byte count> <ref>) */
+	DBOX_METADATA_EXT_REF		= 'X',
 
 	/* End of metadata block. The spaces can be used for writing more
 	   metadata. */
diff -r c53e20911f07 -r 2d367594b41c src/lib-storage/index/dbox/dbox-mail.c
--- a/src/lib-storage/index/dbox/dbox-mail.c	Mon Jun 02 20:00:45 2008 +0300
+++ b/src/lib-storage/index/dbox/dbox-mail.c	Mon Jun 02 20:01:42 2008 +0300
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "ioloop.h"
 #include "istream.h"
+#include "str.h"
 #include "index-mail.h"
 #include "dbox-storage.h"
 #include "dbox-file.h"
@@ -176,6 +177,47 @@ static int dbox_mail_get_physical_size(s
 	return 0;
 }
 
+static int
+dbox_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
+		      const char **value_r)
+{
+	struct dbox_mail *mail = (struct dbox_mail *)_mail;
+	struct index_mail *imail = &mail->imail;
+	const unsigned int pop3_uidl_cache_field =
+		imail->ibox->cache_fields[MAIL_CACHE_POP3_UIDL].idx;
+	struct dbox_file *file;
+	const char *value;
+	string_t *str;
+
+	switch (field) {
+	case MAIL_FETCH_UIDL_BACKEND:
+		/* keep the UIDL in cache file, otherwise POP3 would open all
+		   mail files and read the metadata */
+		str = str_new(imail->data_pool, 64);
+		if (mail_cache_lookup_field(imail->trans->cache_view, str,
+					    _mail->seq,
+					    pop3_uidl_cache_field) > 0) {
+			*value_r = str_c(str);
+			return 0;
+		}
+
+		if (dbox_mail_metadata_seek(mail, &file) < 0)
+			return -1;
+
+		value = dbox_file_metadata_get(file, DBOX_METADATA_POP3_UIDL);
+		if (value == NULL)
+			value = "";
+		index_mail_cache_add_idx(imail, pop3_uidl_cache_field,
+					 value, strlen(value)+1);
+		*value_r = value;
+		return 0;
+	default:
+		break;
+	}
+
+	return index_mail_get_special(_mail, field, value_r);
+}
+							
 static int
 dbox_mail_get_stream(struct mail *_mail, struct message_size *hdr_size,
 		     struct message_size *body_size, struct istream **stream_r)
@@ -236,7 +278,7 @@ struct mail_vfuncs dbox_mail_vfuncs = {
 	index_mail_get_headers,
 	index_mail_get_header_stream,
 	dbox_mail_get_stream,
-	index_mail_get_special,
+	dbox_mail_get_special,
 	index_mail_update_flags,
 	index_mail_update_keywords,
 	index_mail_expunge,
diff -r c53e20911f07 -r 2d367594b41c src/lib-storage/index/dbox/dbox-sync-file.c
--- a/src/lib-storage/index/dbox/dbox-sync-file.c	Mon Jun 02 20:00:45 2008 +0300
+++ b/src/lib-storage/index/dbox/dbox-sync-file.c	Mon Jun 02 20:01:42 2008 +0300
@@ -200,6 +200,7 @@ dbox_sync_file_split(struct dbox_sync_co
 		DBOX_METADATA_VIRTUAL_SIZE,
 		DBOX_METADATA_RECEIVED_TIME,
 		DBOX_METADATA_SAVE_TIME,
+		DBOX_METADATA_POP3_UIDL
 	};
 	struct dbox_index_append_context *append_ctx;
 	struct dbox_file *out_file;


More information about the dovecot-cvs mailing list