changeset 19615:152ed3cd2bad

pop3-migration: Added pop3_migration_skip_size_check setting If we know that we're not going to be able to match any messages by sizes, we might as well not ask for the messages' sizes. This is useful at least with Yahoo.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 24 Jan 2016 16:27:21 +0200
parents 87d9089d2c76
children af9448bcbfd9
files src/plugins/pop3-migration/pop3-migration-plugin.c
diffstat 1 files changed, 16 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/pop3-migration/pop3-migration-plugin.c	Sun Jan 24 16:25:52 2016 +0200
+++ b/src/plugins/pop3-migration/pop3-migration-plugin.c	Sun Jan 24 16:27:21 2016 +0200
@@ -49,6 +49,7 @@
 	unsigned int all_mailboxes:1;
 	unsigned int pop3_all_hdr_sha1_set:1;
 	unsigned int ignore_missing_uidls:1;
+	unsigned int skip_size_check:1;
 };
 
 struct pop3_migration_mailbox {
@@ -267,7 +268,7 @@
 	struct mail *mail;
 	struct pop3_uidl_map *map;
 	const char *uidl;
-	uoff_t size;
+	uoff_t size = (uoff_t)-1;
 	int ret = 0;
 
 	if (array_is_created(&mstorage->pop3_uidl_map)) {
@@ -288,6 +289,7 @@
 	search_args = mail_search_build_init();
 	mail_search_build_add_all(search_args);
 	ctx = mailbox_search_init(t, search_args, NULL,
+				  mstorage->skip_size_check ? 0 :
 				  MAIL_FETCH_PHYSICAL_SIZE, NULL);
 	mail_search_args_unref(&search_args);
 
@@ -295,7 +297,9 @@
 		/* get the size with LIST instead of RETR */
 		mail->lookup_abort = MAIL_LOOKUP_ABORT_READ_MAIL;
 
-		if (mail_get_physical_size(mail, &size) < 0) {
+		if (mstorage->skip_size_check)
+			;
+		else if (mail_get_physical_size(mail, &size) < 0) {
 			i_error("pop3_migration: Failed to get size for msg %u: %s",
 				mail->seq,
 				mailbox_get_last_error(pop3_box, NULL));
@@ -383,13 +387,15 @@
 static int imap_map_read(struct mailbox *box)
 {
 	struct pop3_migration_mailbox *mbox = POP3_MIGRATION_CONTEXT(box);
+	struct pop3_migration_mail_storage *mstorage =
+		POP3_MIGRATION_CONTEXT(box->storage);
 	struct mailbox_status status;
         struct mailbox_transaction_context *t;
 	struct mail_search_args *search_args;
 	struct mail_search_context *ctx;
 	struct mail *mail;
 	struct imap_msg_map *map;
-	uoff_t psize;
+	uoff_t psize = (uoff_t)-1;
 	int ret = 0;
 
 	mailbox_get_open_status(box, STATUS_MESSAGES, &status);
@@ -401,11 +407,14 @@
 	search_args = mail_search_build_init();
 	mail_search_build_add_all(search_args);
 	ctx = mailbox_search_init(t, search_args, NULL,
+				  mstorage->skip_size_check ? 0 :
 				  MAIL_FETCH_PHYSICAL_SIZE, NULL);
 	mail_search_args_unref(&search_args);
 
 	while (mailbox_search_next(ctx, &mail)) {
-		if (mail_get_physical_size(mail, &psize) < 0) {
+		if (mstorage->skip_size_check)
+			;
+		else if (mail_get_physical_size(mail, &psize) < 0) {
 			i_error("pop3_migration: Failed to get psize for imap uid %u: %s",
 				mail->uid,
 				mailbox_get_last_error(box, NULL));
@@ -742,6 +751,9 @@
 	mstorage->ignore_missing_uidls =
 		mail_user_plugin_getenv(storage->user,
 			"pop3_migration_ignore_missing_uidls") != NULL;
+	mstorage->skip_size_check =
+		mail_user_plugin_getenv(storage->user,
+			"pop3_migration_skip_size_check") != NULL;
 
 	MODULE_CONTEXT_SET(storage, pop3_migration_storage_module, mstorage);
 }