dovecot-2.2: fs-metawrap: Don't duplicate work if fs_get_metadat...

dovecot at dovecot.org dovecot at dovecot.org
Tue Feb 5 03:30:12 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/e7e95d2d2b37
changeset: 15739:e7e95d2d2b37
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Feb 05 03:30:01 2013 +0200
description:
fs-metawrap: Don't duplicate work if fs_get_metadata() is called multiple times.

diffstat:

 src/lib-fs/fs-metawrap.c      |  12 ++++++++++--
 src/lib-fs/istream-metawrap.c |   4 +++-
 2 files changed, 13 insertions(+), 3 deletions(-)

diffs (51 lines):

diff -r 1a6cf87eeff0 -r e7e95d2d2b37 src/lib-fs/fs-metawrap.c
--- a/src/lib-fs/fs-metawrap.c	Tue Feb 05 03:24:45 2013 +0200
+++ b/src/lib-fs/fs-metawrap.c	Tue Feb 05 03:30:01 2013 +0200
@@ -26,6 +26,7 @@
 	enum fs_open_mode open_mode;
 	struct istream *input;
 	struct ostream *super_output;
+	bool metadata_read;
 };
 
 static void fs_metawrap_copy_error(struct metawrap_fs *fs)
@@ -198,8 +199,10 @@
 		return 0;
 	}
 
-	if (fs_read(_file, &c, 1) < 0)
-		return -1;
+	if (!file->metadata_read) {
+		if (fs_read(_file, &c, 1) < 0)
+			return -1;
+	}
 	*metadata_r = &_file->metadata;
 	return 0;
 }
@@ -229,6 +232,11 @@
 {
 	struct metawrap_fs_file *file = context;
 
+	if (key == NULL) {
+		file->metadata_read = TRUE;
+		return;
+	}
+
 	T_BEGIN {
 		key = str_tabunescape(t_strdup_noconst(key));
 		value = str_tabunescape(t_strdup_noconst(value));
diff -r 1a6cf87eeff0 -r e7e95d2d2b37 src/lib-fs/istream-metawrap.c
--- a/src/lib-fs/istream-metawrap.c	Tue Feb 05 03:24:45 2013 +0200
+++ b/src/lib-fs/istream-metawrap.c	Tue Feb 05 03:30:01 2013 +0200
@@ -18,8 +18,10 @@
 	char *line, *p;
 
 	while ((line = i_stream_read_next_line(mstream->istream.parent)) != NULL) {
-		if (*line == '\0')
+		if (*line == '\0') {
+			mstream->callback(NULL, NULL, mstream->context);
 			return 1;
+		}
 		p = strchr(line, ':');
 		if (p == NULL) {
 			mstream->istream.istream.stream_errno = EINVAL;


More information about the dovecot-cvs mailing list