dovecot-1.2: imap-quota: Iterate quota roots only once when repl...

dovecot at dovecot.org dovecot at dovecot.org
Tue Apr 20 13:02:44 EEST 2010


details:   http://hg.dovecot.org/dovecot-1.2/rev/efe0efc22d22
changeset: 9564:efe0efc22d22
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Apr 20 13:02:29 2010 +0300
description:
imap-quota: Iterate quota roots only once when replying to GETQUOTAROOT.
This halves the required dict lookup count.

diffstat:

 src/plugins/imap-quota/imap-quota-plugin.c |  57 +++++++++++++++-------------
 1 files changed, 31 insertions(+), 26 deletions(-)

diffs (131 lines):

diff -r 002b58bab1f5 -r efe0efc22d22 src/plugins/imap-quota/imap-quota-plugin.c
--- a/src/plugins/imap-quota/imap-quota-plugin.c	Fri Apr 16 16:44:15 2010 +0300
+++ b/src/plugins/imap-quota/imap-quota-plugin.c	Tue Apr 20 13:02:29 2010 +0300
@@ -2,6 +2,7 @@
 
 #include "common.h"
 #include "str.h"
+#include "ostream.h"
 #include "imap-quote.h"
 #include "mail-namespace.h"
 #include "commands.h"
@@ -29,24 +30,24 @@
 }
 
 static void
-quota_send(struct client_command_context *cmd, struct mail_user *owner,
-	   struct quota_root *root)
+quota_reply_write(string_t *str, struct mail_user *user,
+		  struct mail_user *owner, struct quota_root *root)
 {
         const char *name, *const *list;
-	string_t *str;
 	unsigned int i;
 	uint64_t value, limit;
-	int ret;
+	int ret = 0;
 
-	str = t_str_new(128);
 	str_append(str, "* QUOTA ");
-	name = imap_quota_root_get_name(cmd->client->user, owner, root);
+	name = imap_quota_root_get_name(user, owner, root);
 	imap_quote_append_string(str, name, FALSE);
 
 	str_append(str, " (");
 	list = quota_root_get_resources(root);
 	for (i = 0; *list != NULL; list++) {
 		ret = quota_get_resource(root, "", *list, &value, &limit);
+		if (ret < 0)
+			break;
 		if (ret > 0) {
 			if (i > 0)
 				str_append_c(str, ' ');
@@ -54,13 +55,12 @@
 				    (unsigned long long)value,
 				    (unsigned long long)limit);
 			i++;
-		} else if (ret < 0) {
-			client_send_line(cmd->client, 
-				"* BAD Internal quota calculation error");
 		}
 	}
-	str_append_c(str, ')');
-	client_send_line(cmd->client, str_c(str));
+	str_append(str, ")\r\n");
+
+	if (ret < 0)
+		str_append(str, "* BAD Internal quota calculation error\r\n");
 }
 
 static bool cmd_getquotaroot(struct client_command_context *cmd)
@@ -72,7 +72,7 @@
 	struct quota_root_iter *iter;
         struct quota_root *root;
 	const char *orig_mailbox, *mailbox, *name;
-	string_t *str;
+	string_t *quotaroot_reply, *quota_reply;
 
 	/* <mailbox> */
 	if (!client_read_string_args(cmd, 1, &mailbox))
@@ -104,27 +104,27 @@
 		return TRUE;
 	}
 
-	/* send QUOTAROOT reply */
-	str = t_str_new(128);
-	str_append(str, "* QUOTAROOT ");
-	imap_quote_append_string(str, orig_mailbox, FALSE);
+	/* build QUOTAROOT reply and QUOTA reply for all quota roots */
+	quotaroot_reply = t_str_new(128);
+	quota_reply = t_str_new(256);
+	str_append(quotaroot_reply, "* QUOTAROOT ");
+	imap_quote_append_string(quotaroot_reply, mailbox, FALSE);
 
 	iter = quota_root_iter_init(box);
 	while ((root = quota_root_iter_next(iter)) != NULL) {
-		str_append_c(str, ' ');
+		str_append_c(quotaroot_reply, ' ');
 		name = imap_quota_root_get_name(client->user, ns->owner, root);
-		imap_quote_append_string(str, name, FALSE);
+		imap_quote_append_string(quotaroot_reply, name, FALSE);
+
+		quota_reply_write(quota_reply, client->user, ns->owner, root);
 	}
 	quota_root_iter_deinit(&iter);
-	client_send_line(client, str_c(str));
-
-	/* send QUOTA reply for each quotaroot */
-	iter = quota_root_iter_init(box);
-	while ((root = quota_root_iter_next(iter)) != NULL)
-		quota_send(cmd, ns->owner, root);
-	quota_root_iter_deinit(&iter);
 	mailbox_close(&box);
 
+	/* send replies */
+	client_send_line(client, str_c(quotaroot_reply));
+	o_stream_send(client->output, str_data(quota_reply),
+		      str_len(quota_reply));
 	client_send_tagline(cmd, "OK Getquotaroot completed.");
 	return TRUE;
 }
@@ -134,6 +134,7 @@
 	struct mail_user *owner = cmd->client->user;
         struct quota_root *root;
 	const char *root_name, *p;
+	string_t *quota_reply;
 
 	/* <quota root> */
 	if (!client_read_string_args(cmd, 1, &root_name))
@@ -161,7 +162,11 @@
 		return TRUE;
 	}
 
-	quota_send(cmd, owner, root);
+	quota_reply = t_str_new(128);
+	quota_reply_write(quota_reply, cmd->client->user, owner, root);
+	o_stream_send(cmd->client->output, str_data(quota_reply),
+		      str_len(quota_reply));
+
 	client_send_tagline(cmd, "OK Getquota completed.");
 	return TRUE;
 }


More information about the dovecot-cvs mailing list