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