Mercurial > dovecot > core-2.2
changeset 21402:16768c5df6e9
doveadm dict get: Support printing multiple values.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 14 Jan 2017 16:10:15 +0200 |
parents | c22acf3af571 |
children | 1baae1dc44a4 |
files | src/doveadm/doveadm-dict.c |
diffstat | 1 files changed, 35 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/doveadm-dict.c Mon Jan 09 20:32:12 2017 +0200 +++ b/src/doveadm/doveadm-dict.c Sat Jan 14 16:10:15 2017 +0200 @@ -89,11 +89,28 @@ key_arg_idx, cmd, NULL, dict_r); } +struct doveadm_dict_ctx { + pool_t pool; + int ret; + const char *const *values; + const char *error; +}; + +static void dict_lookup_callback(const struct dict_lookup_result *result, + void *context) +{ + struct doveadm_dict_ctx *ctx = context; + + ctx->ret = result->ret; + ctx->values = result->values == NULL ? NULL : + p_strarray_dup(ctx->pool, result->values); + ctx->error = p_strdup(ctx->pool, result->error); +} + static void cmd_dict_get(int argc, char *argv[]) { + struct doveadm_dict_ctx ctx; struct dict *dict; - const char *value; - int ret; if (cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_get, &dict) < 0) return; @@ -101,16 +118,27 @@ doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); doveadm_print_header("value", "", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE); - ret = dict_lookup(dict, pool_datastack_create(), argv[0], &value); - if (ret < 0) { - i_error("dict_lookup(%s) failed", argv[0]); + i_zero(&ctx); + ctx.pool = pool_alloconly_create("doveadm dict lookup", 512); + ctx.ret = -2; + dict_lookup_async(dict, argv[0], dict_lookup_callback, &ctx); + while (ctx.ret == -2) + dict_wait(dict); + if (ctx.ret < 0) { + i_error("dict_lookup(%s) failed: %s", argv[0], ctx.error); doveadm_exit_code = EX_TEMPFAIL; - } else if (ret == 0) { + } else if (ctx.ret == 0) { i_error("%s doesn't exist", argv[0]); doveadm_exit_code = DOVEADM_EX_NOTFOUND; } else { - doveadm_print(value); + unsigned int i, values_count = str_array_length(ctx.values); + + for (i = 1; i < values_count; i++) + doveadm_print_header("value", "", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE); + for (i = 0; i < values_count; i++) + doveadm_print(ctx.values[i]); } + pool_unref(&ctx.pool); dict_deinit(&dict); }