dovecot-2.0-sslstream: lib-dict: Changed dict_iterate API.

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 03:00:52 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/7309b5c84ca9
changeset: 10660:7309b5c84ca9
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Feb 07 16:27:18 2010 +0200
description:
lib-dict: Changed dict_iterate API.

diffstat:

11 files changed, 95 insertions(+), 78 deletions(-)
src/dict/dict-commands.c          |   30 +++++++++++++++---------------
src/dict/dict-connection.c        |    2 +-
src/lib-dict/dict-client.c        |   30 ++++++++++++++++++------------
src/lib-dict/dict-db.c            |   21 ++++++++++++++-------
src/lib-dict/dict-file.c          |   18 ++++++++++--------
src/lib-dict/dict-private.h       |    6 +++---
src/lib-dict/dict-sql.c           |   26 ++++++++++++++++----------
src/lib-dict/dict.c               |    8 ++++----
src/lib-dict/dict.h               |    8 ++++----
src/plugins/acl/acl-lookup-dict.c |   18 ++++++++----------
src/plugins/expire/expire-tool.c  |    6 ++----

diffs (truncated from 460 to 300 lines):

diff -r 9780cd3cc48a -r 7309b5c84ca9 src/dict/dict-commands.c
--- a/src/dict/dict-commands.c	Sun Feb 07 16:01:51 2010 +0200
+++ b/src/dict/dict-commands.c	Sun Feb 07 16:27:18 2010 +0200
@@ -52,7 +52,7 @@ static int cmd_iterate_flush(struct dict
 
 	str = t_str_new(256);
 	o_stream_cork(conn->output);
-	while ((ret = dict_iterate(conn->iter_ctx, &key, &value)) > 0) {
+	while (dict_iterate(conn->iter_ctx, &key, &value)) {
 		str_truncate(str, 0);
 		str_printfa(str, "%c%s\t%s\n", DICT_PROTOCOL_REPLY_OK,
 			    key, value);
@@ -60,25 +60,25 @@ static int cmd_iterate_flush(struct dict
 
 		if (o_stream_get_buffer_used_size(conn->output) >
 		    DICT_OUTPUT_OPTIMAL_SIZE) {
-			if (o_stream_flush(conn->output) <= 0)
-				break;
+			if (o_stream_flush(conn->output) <= 0) {
+				/* continue later */
+				o_stream_uncork(conn->output);
+				return 0;
+			}
 			/* flushed everything, continue */
 		}
 	}
 
-	if (ret <= 0) {
-		/* finished iterating */
-		o_stream_unset_flush_callback(conn->output);
-		dict_iterate_deinit(&conn->iter_ctx);
-
-		str_truncate(str, 0);
-		if (ret < 0)
-			str_append_c(str, DICT_PROTOCOL_REPLY_FAIL);
-		str_append_c(str, '\n');
-		o_stream_send(conn->output, str_data(str), str_len(str));
-	}
+	/* finished iterating */
+	o_stream_unset_flush_callback(conn->output);
+
+	str_truncate(str, 0);
+	if ((ret = dict_iterate_deinit(&conn->iter_ctx)) < 0)
+		str_append_c(str, DICT_PROTOCOL_REPLY_FAIL);
+	str_append_c(str, '\n');
+	o_stream_send(conn->output, str_data(str), str_len(str));
 	o_stream_uncork(conn->output);
-	return ret <= 0 ? 1 : 0;
+	return 1;
 }
 
 static int cmd_iterate(struct dict_connection *conn, const char *line)
diff -r 9780cd3cc48a -r 7309b5c84ca9 src/dict/dict-connection.c
--- a/src/dict/dict-connection.c	Sun Feb 07 16:01:51 2010 +0200
+++ b/src/dict/dict-connection.c	Sun Feb 07 16:27:18 2010 +0200
@@ -166,7 +166,7 @@ void dict_connection_destroy(struct dict
 	}
 
 	if (conn->iter_ctx != NULL)
-		dict_iterate_deinit(&conn->iter_ctx);
+		(void)dict_iterate_deinit(&conn->iter_ctx);
 
 	io_remove(&conn->io);
 	i_stream_destroy(&conn->input);
diff -r 9780cd3cc48a -r 7309b5c84ca9 src/lib-dict/dict-client.c
--- a/src/lib-dict/dict-client.c	Sun Feb 07 16:01:51 2010 +0200
+++ b/src/lib-dict/dict-client.c	Sun Feb 07 16:27:18 2010 +0200
@@ -493,8 +493,8 @@ client_dict_iterate_init(struct dict *_d
 	return &ctx->ctx;
 }
 
-static int client_dict_iterate(struct dict_iterate_context *_ctx,
-			       const char **key_r, const char **value_r)
+static bool client_dict_iterate(struct dict_iterate_context *_ctx,
+				const char **key_r, const char **value_r)
 {
 	struct client_dict_iterate_context *ctx =
 		(struct client_dict_iterate_context *)_ctx;
@@ -502,16 +502,18 @@ static int client_dict_iterate(struct di
 	char *line, *value;
 
 	if (ctx->failed)
-		return -1;
+		return FALSE;
 
 	/* read next reply */
 	line = client_dict_read_line(dict);
-	if (line == NULL)
-		return -1;
+	if (line == NULL) {
+		ctx->failed = TRUE;
+		return FALSE;
+	}
 
 	if (*line == '\0') {
 		/* end of iteration */
-		return 0;
+		return FALSE;
 	}
 
 	/* line contains key \t value */
@@ -522,7 +524,8 @@ static int client_dict_iterate(struct di
 		value = strchr(++line, '\t');
 		break;
 	case DICT_PROTOCOL_REPLY_FAIL:
-		return -1;
+		ctx->failed = TRUE;
+		return FALSE;
 	default:
 		value = NULL;
 		break;
@@ -530,24 +533,27 @@ static int client_dict_iterate(struct di
 	if (value == NULL) {
 		/* broken protocol */
 		i_error("dict client (%s) sent broken reply", dict->path);
-		return -1;
+		ctx->failed = TRUE;
+		return FALSE;
 	}
 	*value++ = '\0';
 
 	*key_r = p_strdup(ctx->pool, dict_client_unescape(line));
 	*value_r = p_strdup(ctx->pool, dict_client_unescape(value));
-	return 1;
-}
-
-static void client_dict_iterate_deinit(struct dict_iterate_context *_ctx)
+	return TRUE;
+}
+
+static int client_dict_iterate_deinit(struct dict_iterate_context *_ctx)
 {
 	struct client_dict *dict = (struct client_dict *)_ctx->dict;
 	struct client_dict_iterate_context *ctx =
 		(struct client_dict_iterate_context *)_ctx;
+	int ret = ctx->failed ? -1 : 0;
 
 	pool_unref(&ctx->pool);
 	i_free(ctx);
 	dict->in_iteration = FALSE;
+	return ret;
 }
 
 static struct dict_transaction_context *
diff -r 9780cd3cc48a -r 7309b5c84ca9 src/lib-dict/dict-db.c
--- a/src/lib-dict/dict-db.c	Sun Feb 07 16:01:51 2010 +0200
+++ b/src/lib-dict/dict-db.c	Sun Feb 07 16:27:18 2010 +0200
@@ -34,6 +34,7 @@ struct db_dict_iterate_context {
 			    const char **key_r, const char **value_r);
 
 	enum dict_iterate_flags flags;
+	bool failed;
 };
 
 struct db_dict_transaction_context {
@@ -341,24 +342,30 @@ db_dict_iterate_init(struct dict *_dict,
 	return &ctx->ctx;
 }
 
-static int db_dict_iterate(struct dict_iterate_context *_ctx,
-			   const char **key_r, const char **value_r)
+static bool db_dict_iterate(struct dict_iterate_context *_ctx,
+			    const char **key_r, const char **value_r)
 {
 	struct db_dict_iterate_context *ctx =
 		(struct db_dict_iterate_context *)_ctx;
-
-	return ctx->iterate_next(ctx, key_r, value_r);
-}
-
-static void db_dict_iterate_deinit(struct dict_iterate_context *_ctx)
+	int ret;
+
+	ret = ctx->iterate_next(ctx, key_r, value_r);
+	if (ret < 0)
+		ctx->failed = TRUE;
+	return ret > 0;
+}
+
+static int db_dict_iterate_deinit(struct dict_iterate_context *_ctx)
 {
 	struct db_dict_iterate_context *ctx =
 		(struct db_dict_iterate_context *)_ctx;
+	int ret = ctx->failed ? -1 : 0;
 
 	ctx->cursor->c_close(ctx->cursor);
 	pool_unref(&ctx->pool);
 	i_free(ctx->path);
 	i_free(ctx);
+	return ret;
 }
 
 static struct dict_transaction_context *
diff -r 9780cd3cc48a -r 7309b5c84ca9 src/lib-dict/dict-file.c
--- a/src/lib-dict/dict-file.c	Sun Feb 07 16:01:51 2010 +0200
+++ b/src/lib-dict/dict-file.c	Sun Feb 07 16:27:18 2010 +0200
@@ -181,8 +181,8 @@ file_dict_iterate_init(struct dict *_dic
 	return &ctx->ctx;
 }
 
-static int file_dict_iterate(struct dict_iterate_context *_ctx,
-			     const char **key_r, const char **value_r)
+static bool file_dict_iterate(struct dict_iterate_context *_ctx,
+			      const char **key_r, const char **value_r)
 {
 	struct file_dict_iterate_context *ctx =
 		(struct file_dict_iterate_context *)_ctx;
@@ -198,19 +198,21 @@ static int file_dict_iterate(struct dict
 
 		*key_r = key;
 		*value_r = value;
-		return 1;
-	}
-	return ctx->failed ? -1 : 0;
-}
-
-static void file_dict_iterate_deinit(struct dict_iterate_context *_ctx)
+		return TRUE;
+	}
+	return FALSE;
+}
+
+static int file_dict_iterate_deinit(struct dict_iterate_context *_ctx)
 {
 	struct file_dict_iterate_context *ctx =
 		(struct file_dict_iterate_context *)_ctx;
+	int ret = ctx->failed ? -1 : 0;
 
 	hash_table_iterate_deinit(&ctx->iter);
 	i_free(ctx->path);
 	i_free(ctx);
+	return ret;
 }
 
 static struct dict_transaction_context *
diff -r 9780cd3cc48a -r 7309b5c84ca9 src/lib-dict/dict-private.h
--- a/src/lib-dict/dict-private.h	Sun Feb 07 16:01:51 2010 +0200
+++ b/src/lib-dict/dict-private.h	Sun Feb 07 16:27:18 2010 +0200
@@ -16,9 +16,9 @@ struct dict_vfuncs {
 	struct dict_iterate_context *
 		(*iterate_init)(struct dict *dict, const char *path,
 				enum dict_iterate_flags flags);
-	int (*iterate)(struct dict_iterate_context *ctx,
-		       const char **key_r, const char **value_r);
-	void (*iterate_deinit)(struct dict_iterate_context *ctx);
+	bool (*iterate)(struct dict_iterate_context *ctx,
+			const char **key_r, const char **value_r);
+	int (*iterate_deinit)(struct dict_iterate_context *ctx);
 
 	struct dict_transaction_context *(*transaction_init)(struct dict *dict);
 	int (*transaction_commit)(struct dict_transaction_context *ctx,
diff -r 9780cd3cc48a -r 7309b5c84ca9 src/lib-dict/dict-sql.c
--- a/src/lib-dict/dict-sql.c	Sun Feb 07 16:01:51 2010 +0200
+++ b/src/lib-dict/dict-sql.c	Sun Feb 07 16:27:18 2010 +0200
@@ -42,6 +42,7 @@ struct sql_dict_iterate_context {
 	string_t *key;
 	const struct dict_sql_map *map;
 	unsigned int key_prefix_len, pattern_prefix_len, next_map_idx;
+	bool failed;
 };
 
 struct sql_dict_inc_row {
@@ -397,8 +398,8 @@ sql_dict_iterate_init(struct dict *_dict
 	return &ctx->ctx;
 }
 
-static int sql_dict_iterate(struct dict_iterate_context *_ctx,
-			    const char **key_r, const char **value_r)
+static bool sql_dict_iterate(struct dict_iterate_context *_ctx,
+			     const char **key_r, const char **value_r)
 {
 	struct sql_dict_iterate_context *ctx =
 		(struct sql_dict_iterate_context *)_ctx;
@@ -406,18 +407,21 @@ static int sql_dict_iterate(struct dict_
 	unsigned int i, count;
 	int ret;
 
-	if (ctx->result == NULL)
-		return -1;
+	if (ctx->result == NULL) {
+		ctx->failed = TRUE;
+		return FALSE;
+	}
 
 	while ((ret = sql_result_next_row(ctx->result)) == 0) {
 		/* see if there are more results in the next map */
 		if (!sql_dict_iterate_next_query(ctx))
-			return 0;
+			return FALSE;
 	}
 	if (ret < 0) {
+		ctx->failed = TRUE;
 		i_error("dict sql iterate failed: %s",
 			sql_result_get_error(ctx->result));
-		return ret;
+		return FALSE;
 	}
 
 	/* convert fetched row to dict key */
@@ -442,19 +446,21 @@ static int sql_dict_iterate(struct dict_


More information about the dovecot-cvs mailing list