[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-mail.c, 1.6, 1.7

cras at dovecot.org cras at dovecot.org
Sat Aug 28 13:32:19 EEST 2004


Update of /home/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv21625/lib-storage/index/maildir

Modified Files:
	maildir-mail.c 
Log Message:
Added mail.get_physical_size().



Index: maildir-mail.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-mail.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- maildir-mail.c	11 Jul 2004 21:04:46 -0000	1.6
+++ maildir-mail.c	28 Aug 2004 10:32:17 -0000	1.7
@@ -102,21 +102,21 @@
 	return data->received_date;
 }
 
-static uoff_t maildir_mail_get_size(struct mail *_mail)
+static uoff_t maildir_mail_get_virtual_size(struct mail *_mail)
 {
-	struct index_mail *mail = (struct index_mail *) _mail;
+	struct index_mail *mail = (struct index_mail *)_mail;
 	struct index_mail_data *data = &mail->data;
 	const char *fname, *p;
 	uoff_t virtual_size;
         enum maildir_uidlist_rec_flag flags;
 
-	if (data->size != (uoff_t)-1)
-		return data->size;
+	if (data->virtual_size != (uoff_t)-1)
+		return data->virtual_size;
 
-	if ((mail->wanted_fields & MAIL_FETCH_SIZE) == 0) {
-		data->size = index_mail_get_cached_virtual_size(mail);
-		if (data->size != (uoff_t)-1)
-			return data->size;
+	if ((mail->wanted_fields & MAIL_FETCH_VIRTUAL_SIZE) == 0) {
+		data->virtual_size = index_mail_get_cached_virtual_size(mail);
+		if (data->virtual_size != (uoff_t)-1)
+			return data->virtual_size;
 	}
 
 	fname = maildir_uidlist_lookup(mail->ibox->uidlist,
@@ -142,7 +142,53 @@
 		}
 	}
 
-	return index_mail_get_size(_mail);
+	return index_mail_get_virtual_size(_mail);
+}
+
+static uoff_t maildir_mail_get_physical_size(struct mail *_mail)
+{
+	struct index_mail *mail = (struct index_mail *)_mail;
+	struct index_mail_data *data = &mail->data;
+	struct stat st;
+	const char *fname, *p;
+	uoff_t size;
+	enum maildir_uidlist_rec_flag flags;
+
+	size = index_mail_get_physical_size(_mail);
+	if (size != (uoff_t)-1)
+		return size;
+
+	fname = maildir_uidlist_lookup(mail->ibox->uidlist,
+				       mail->mail.uid, &flags);
+	if (fname == NULL)
+		return (uoff_t)-1;
+
+	/* size can be included in filename */
+	p = strstr(fname, ",S=");
+	if (p != NULL) {
+		p += 3;
+		size = 0;
+		while (*p >= '0' && *p <= '9') {
+			size = size * 10 + (*p - '0');
+			p++;
+		}
+
+		if (*p != ':' && *p != ',' && *p != '\0')
+			size = (uoff_t)-1;
+	}
+
+	if (size == (uoff_t)-1) {
+		if (maildir_file_do(mail->ibox, mail->mail.uid,
+				    do_stat, &st) <= 0)
+			return (uoff_t)-1;
+		size = st.st_size;
+	}
+
+	mail_cache_add(mail->trans->cache_trans, mail->data.seq,
+		       MAIL_CACHE_PHYSICAL_FULL_SIZE, &size, sizeof(size));
+	data->physical_size = size;
+	return size;
+
 }
 
 static struct istream *maildir_mail_get_stream(struct mail *_mail,
@@ -172,7 +218,8 @@
 	index_mail_get_parts,
 	maildir_mail_get_received_date,
 	index_mail_get_date,
-	maildir_mail_get_size,
+	maildir_mail_get_virtual_size,
+	maildir_mail_get_physical_size,
 	index_mail_get_header,
 	index_mail_get_headers,
 	maildir_mail_get_stream,



More information about the dovecot-cvs mailing list