doveadm-dict.c (dovecot-2.3.16) | : | doveadm-dict.c (dovecot-2.3.17) | ||
---|---|---|---|---|
skipping to change at line 14 | skipping to change at line 14 | |||
#include "dict.h" | #include "dict.h" | |||
#include "doveadm.h" | #include "doveadm.h" | |||
#include "doveadm-print.h" | #include "doveadm-print.h" | |||
#include <stdio.h> | #include <stdio.h> | |||
#include <unistd.h> | #include <unistd.h> | |||
static int | static int | |||
cmd_dict_init_full(struct doveadm_cmd_context *cctx, | cmd_dict_init_full(struct doveadm_cmd_context *cctx, | |||
doveadm_command_ver2_t *cmd ATTR_UNUSED, enum dict_iterate_fla gs *iter_flags, | doveadm_command_ver2_t *cmd ATTR_UNUSED, enum dict_iterate_fla gs *iter_flags, | |||
struct dict **dict_r) | struct dict **dict_r, struct dict_op_settings *dopset_r) | |||
{ | { | |||
struct dict_settings dict_set; | struct dict_settings dict_set; | |||
struct dict *dict; | struct dict *dict; | |||
bool set = FALSE; | bool set = FALSE; | |||
const char *dict_uri, *error, *key, *username = ""; | const char *dict_uri, *error, *key, *username = ""; | |||
i_zero(dopset_r); | ||||
if (doveadm_cmd_param_bool(cctx, "exact", &set) && set) | if (doveadm_cmd_param_bool(cctx, "exact", &set) && set) | |||
*iter_flags |= DICT_ITERATE_FLAG_EXACT_KEY; | *iter_flags |= DICT_ITERATE_FLAG_EXACT_KEY; | |||
if (doveadm_cmd_param_bool(cctx, "recurse", &set) && set) | if (doveadm_cmd_param_bool(cctx, "recurse", &set) && set) | |||
*iter_flags |= DICT_ITERATE_FLAG_RECURSE; | *iter_flags |= DICT_ITERATE_FLAG_RECURSE; | |||
if (doveadm_cmd_param_bool(cctx, "no-value", &set) && set) | if (doveadm_cmd_param_bool(cctx, "no-value", &set) && set) | |||
*iter_flags |= DICT_ITERATE_FLAG_NO_VALUE; | *iter_flags |= DICT_ITERATE_FLAG_NO_VALUE; | |||
(void)doveadm_cmd_param_str(cctx, "user", &username); | (void)doveadm_cmd_param_str(cctx, "user", &username); | |||
dopset_r->username = username; | ||||
if (!doveadm_cmd_param_str(cctx, "dict-uri", &dict_uri)) { | if (!doveadm_cmd_param_str(cctx, "dict-uri", &dict_uri)) { | |||
i_error("dictionary URI must be specified"); | i_error("dictionary URI must be specified"); | |||
doveadm_exit_code = EX_USAGE; | doveadm_exit_code = EX_USAGE; | |||
return -1; | return -1; | |||
} | } | |||
if (!doveadm_cmd_param_str(cctx, "prefix", &key) && | if (!doveadm_cmd_param_str(cctx, "prefix", &key) && | |||
!doveadm_cmd_param_str(cctx, "key", &key)) | !doveadm_cmd_param_str(cctx, "key", &key)) | |||
key = ""; | key = ""; | |||
skipping to change at line 55 | skipping to change at line 57 | |||
} | } | |||
if (username[0] == '\0' && | if (username[0] == '\0' && | |||
str_begins(key, DICT_PATH_PRIVATE)) { | str_begins(key, DICT_PATH_PRIVATE)) { | |||
i_error("-u must be specified for "DICT_PATH_PRIVATE" keys"); | i_error("-u must be specified for "DICT_PATH_PRIVATE" keys"); | |||
doveadm_exit_code = EX_USAGE; | doveadm_exit_code = EX_USAGE; | |||
return -1; | return -1; | |||
} | } | |||
dict_drivers_register_builtin(); | dict_drivers_register_builtin(); | |||
i_zero(&dict_set); | i_zero(&dict_set); | |||
dict_set.username = username; | ||||
dict_set.base_dir = doveadm_settings->base_dir; | dict_set.base_dir = doveadm_settings->base_dir; | |||
if (dict_init(dict_uri, &dict_set, &dict, &error) < 0) { | if (dict_init(dict_uri, &dict_set, &dict, &error) < 0) { | |||
i_error("dict_init(%s) failed: %s", dict_uri, error); | i_error("dict_init(%s) failed: %s", dict_uri, error); | |||
doveadm_exit_code = EX_TEMPFAIL; | doveadm_exit_code = EX_TEMPFAIL; | |||
return -1; | return -1; | |||
} | } | |||
*dict_r = dict; | *dict_r = dict; | |||
return 0; | return 0; | |||
} | } | |||
static int | static int | |||
cmd_dict_init(struct doveadm_cmd_context *cctx, | cmd_dict_init(struct doveadm_cmd_context *cctx, | |||
doveadm_command_ver2_t *cmd, struct dict **dict_r) | doveadm_command_ver2_t *cmd, struct dict **dict_r, | |||
struct dict_op_settings *set_r) | ||||
{ | { | |||
enum dict_iterate_flags iter_flags = 0; | enum dict_iterate_flags iter_flags = 0; | |||
return cmd_dict_init_full(cctx, cmd, &iter_flags, dict_r); | return cmd_dict_init_full(cctx, cmd, &iter_flags, dict_r, set_r); | |||
} | } | |||
struct doveadm_dict_ctx { | struct doveadm_dict_ctx { | |||
pool_t pool; | pool_t pool; | |||
int ret; | int ret; | |||
const char *const *values; | const char *const *values; | |||
const char *error; | const char *error; | |||
}; | }; | |||
static void dict_lookup_callback(const struct dict_lookup_result *result, | static void dict_lookup_callback(const struct dict_lookup_result *result, | |||
skipping to change at line 95 | skipping to change at line 97 | |||
ctx->values = result->values == NULL ? NULL : | ctx->values = result->values == NULL ? NULL : | |||
p_strarray_dup(ctx->pool, result->values); | p_strarray_dup(ctx->pool, result->values); | |||
ctx->error = p_strdup(ctx->pool, result->error); | ctx->error = p_strdup(ctx->pool, result->error); | |||
} | } | |||
static void cmd_dict_get(struct doveadm_cmd_context *cctx) | static void cmd_dict_get(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
struct doveadm_dict_ctx ctx; | struct doveadm_dict_ctx ctx; | |||
struct dict *dict; | struct dict *dict; | |||
const char *key; | const char *key; | |||
struct dict_op_settings set; | ||||
if (!doveadm_cmd_param_str(cctx, "key", &key)) { | if (!doveadm_cmd_param_str(cctx, "key", &key)) { | |||
i_error("dict-get: Missing key"); | i_error("dict-get: Missing key"); | |||
doveadm_exit_code = EX_USAGE; | doveadm_exit_code = EX_USAGE; | |||
return; | return; | |||
} | } | |||
if (cmd_dict_init(cctx, cmd_dict_get, &dict) < 0) | if (cmd_dict_init(cctx, cmd_dict_get, &dict, &set) < 0) | |||
return; | return; | |||
doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); | doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); | |||
doveadm_print_header("value", "", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE); | doveadm_print_header("value", "", DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE); | |||
i_zero(&ctx); | i_zero(&ctx); | |||
ctx.pool = pool_alloconly_create("doveadm dict lookup", 512); | ctx.pool = pool_alloconly_create("doveadm dict lookup", 512); | |||
ctx.ret = -2; | ctx.ret = -2; | |||
dict_lookup_async(dict, key, dict_lookup_callback, &ctx); | dict_lookup_async(dict, &set, key, dict_lookup_callback, &ctx); | |||
while (ctx.ret == -2) | while (ctx.ret == -2) | |||
dict_wait(dict); | dict_wait(dict); | |||
if (ctx.ret < 0) { | if (ctx.ret < 0) { | |||
i_error("dict_lookup(%s) failed: %s", key, ctx.error); | i_error("dict_lookup(%s) failed: %s", key, ctx.error); | |||
doveadm_exit_code = EX_TEMPFAIL; | doveadm_exit_code = EX_TEMPFAIL; | |||
} else if (ctx.ret == 0) { | } else if (ctx.ret == 0) { | |||
i_error("%s doesn't exist", key); | i_error("%s doesn't exist", key); | |||
doveadm_exit_code = DOVEADM_EX_NOTFOUND; | doveadm_exit_code = DOVEADM_EX_NOTFOUND; | |||
} else { | } else { | |||
unsigned int i, values_count = str_array_length(ctx.values); | unsigned int i, values_count = str_array_length(ctx.values); | |||
skipping to change at line 138 | skipping to change at line 141 | |||
pool_unref(&ctx.pool); | pool_unref(&ctx.pool); | |||
dict_deinit(&dict); | dict_deinit(&dict); | |||
} | } | |||
static void cmd_dict_set(struct doveadm_cmd_context *cctx) | static void cmd_dict_set(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
struct dict *dict; | struct dict *dict; | |||
struct dict_transaction_context *trans; | struct dict_transaction_context *trans; | |||
const char *error; | const char *error; | |||
const char *key, *value = ""; | const char *key, *value = ""; | |||
struct dict_op_settings set; | ||||
if (!doveadm_cmd_param_str(cctx, "key", &key) || | if (!doveadm_cmd_param_str(cctx, "key", &key) || | |||
!doveadm_cmd_param_str(cctx, "value", &value)) { | !doveadm_cmd_param_str(cctx, "value", &value)) { | |||
i_error("dict set: Missing parameters"); | i_error("dict set: Missing parameters"); | |||
doveadm_exit_code = EX_USAGE; | doveadm_exit_code = EX_USAGE; | |||
return; | return; | |||
} | } | |||
if (cmd_dict_init(cctx, cmd_dict_set, &dict) < 0) | if (cmd_dict_init(cctx, cmd_dict_set, &dict, &set) < 0) | |||
return; | return; | |||
trans = dict_transaction_begin(dict); | trans = dict_transaction_begin(dict, &set); | |||
dict_set(trans, key, value); | dict_set(trans, key, value); | |||
if (dict_transaction_commit(&trans, &error) <= 0) { | if (dict_transaction_commit(&trans, &error) <= 0) { | |||
i_error("dict_transaction_commit() failed: %s", error); | i_error("dict_transaction_commit() failed: %s", error); | |||
doveadm_exit_code = EX_TEMPFAIL; | doveadm_exit_code = EX_TEMPFAIL; | |||
} | } | |||
dict_deinit(&dict); | dict_deinit(&dict); | |||
} | } | |||
static void cmd_dict_unset(struct doveadm_cmd_context *cctx) | static void cmd_dict_unset(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
struct dict *dict; | struct dict *dict; | |||
struct dict_transaction_context *trans; | struct dict_transaction_context *trans; | |||
const char *error; | const char *error; | |||
const char *key; | const char *key; | |||
struct dict_op_settings set; | ||||
if (!doveadm_cmd_param_str(cctx, "key", &key)) { | if (!doveadm_cmd_param_str(cctx, "key", &key)) { | |||
i_error("dict unset: Missing key"); | i_error("dict unset: Missing key"); | |||
doveadm_exit_code = EX_USAGE; | doveadm_exit_code = EX_USAGE; | |||
return; | return; | |||
} | } | |||
if (cmd_dict_init(cctx, cmd_dict_unset, &dict) < 0) | if (cmd_dict_init(cctx, cmd_dict_unset, &dict, &set) < 0) | |||
return; | return; | |||
trans = dict_transaction_begin(dict); | trans = dict_transaction_begin(dict, &set); | |||
dict_unset(trans, key); | dict_unset(trans, key); | |||
if (dict_transaction_commit(&trans, &error) <= 0) { | if (dict_transaction_commit(&trans, &error) <= 0) { | |||
i_error("dict_transaction_commit() failed: %s", error); | i_error("dict_transaction_commit() failed: %s", error); | |||
doveadm_exit_code = EX_TEMPFAIL; | doveadm_exit_code = EX_TEMPFAIL; | |||
} | } | |||
dict_deinit(&dict); | dict_deinit(&dict); | |||
} | } | |||
static void cmd_dict_inc(struct doveadm_cmd_context *cctx) | static void cmd_dict_inc(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
struct dict *dict; | struct dict *dict; | |||
struct dict_transaction_context *trans; | struct dict_transaction_context *trans; | |||
const char *error; | const char *error; | |||
const char *key; | const char *key; | |||
int64_t diff; | int64_t diff; | |||
int ret; | int ret; | |||
struct dict_op_settings set; | ||||
if (!doveadm_cmd_param_str(cctx, "key", &key) || | if (!doveadm_cmd_param_str(cctx, "key", &key) || | |||
!doveadm_cmd_param_int64(cctx, "difference", &diff)) { | !doveadm_cmd_param_int64(cctx, "difference", &diff)) { | |||
i_error("dict-inc: Missing parameters"); | i_error("dict-inc: Missing parameters"); | |||
doveadm_exit_code = EX_USAGE; | doveadm_exit_code = EX_USAGE; | |||
return; | return; | |||
} | } | |||
if (cmd_dict_init(cctx, cmd_dict_inc, &dict) < 0) | if (cmd_dict_init(cctx, cmd_dict_inc, &dict, &set) < 0) | |||
return; | return; | |||
trans = dict_transaction_begin(dict); | trans = dict_transaction_begin(dict, &set); | |||
dict_atomic_inc(trans, key, diff); | dict_atomic_inc(trans, key, diff); | |||
ret = dict_transaction_commit(&trans, &error); | ret = dict_transaction_commit(&trans, &error); | |||
if (ret < 0) { | if (ret < 0) { | |||
i_error("dict_transaction_commit() failed: %s", error); | i_error("dict_transaction_commit() failed: %s", error); | |||
doveadm_exit_code = EX_TEMPFAIL; | doveadm_exit_code = EX_TEMPFAIL; | |||
} else if (ret == 0) { | } else if (ret == 0) { | |||
i_error("%s doesn't exist", key); | i_error("%s doesn't exist", key); | |||
doveadm_exit_code = DOVEADM_EX_NOTFOUND; | doveadm_exit_code = DOVEADM_EX_NOTFOUND; | |||
} | } | |||
dict_deinit(&dict); | dict_deinit(&dict); | |||
} | } | |||
static void cmd_dict_iter(struct doveadm_cmd_context *cctx) | static void cmd_dict_iter(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
struct dict *dict; | struct dict *dict; | |||
struct dict_iterate_context *iter; | struct dict_iterate_context *iter; | |||
enum dict_iterate_flags iter_flags = 0; | enum dict_iterate_flags iter_flags = 0; | |||
const char *prefix, *key, *const *values, *error; | const char *prefix, *key, *const *values, *error; | |||
bool header_printed = FALSE; | bool header_printed = FALSE; | |||
struct dict_op_settings set; | ||||
if (!doveadm_cmd_param_str(cctx, "prefix", &prefix)) { | if (!doveadm_cmd_param_str(cctx, "prefix", &prefix)) { | |||
i_error("dict-iter: Missing prefix"); | i_error("dict-iter: Missing prefix"); | |||
doveadm_exit_code = EX_USAGE; | doveadm_exit_code = EX_USAGE; | |||
return; | return; | |||
} | } | |||
if (cmd_dict_init_full(cctx, cmd_dict_iter, &iter_flags, &dict) < 0) | if (cmd_dict_init_full(cctx, cmd_dict_iter, &iter_flags, &dict, &set) < 0 ) | |||
return; | return; | |||
doveadm_print_init(DOVEADM_PRINT_TYPE_TAB); | doveadm_print_init(DOVEADM_PRINT_TYPE_TAB); | |||
doveadm_print_header_simple("key"); | doveadm_print_header_simple("key"); | |||
if ((iter_flags & DICT_ITERATE_FLAG_NO_VALUE) == 0) | if ((iter_flags & DICT_ITERATE_FLAG_NO_VALUE) == 0) | |||
doveadm_print_header_simple("value"); | doveadm_print_header_simple("value"); | |||
iter = dict_iterate_init(dict, prefix, iter_flags); | iter = dict_iterate_init(dict, &set, prefix, iter_flags); | |||
while (dict_iterate_values(iter, &key, &values)) { | while (dict_iterate_values(iter, &key, &values)) { | |||
unsigned int values_count = str_array_length(values); | unsigned int values_count = str_array_length(values); | |||
if (!header_printed) { | if (!header_printed) { | |||
for (unsigned int i = 1; i < values_count; i++) | for (unsigned int i = 1; i < values_count; i++) | |||
doveadm_print_header_simple("value"); | doveadm_print_header_simple("value"); | |||
header_printed = TRUE; | header_printed = TRUE; | |||
} | } | |||
doveadm_print(key); | doveadm_print(key); | |||
if ((iter_flags & DICT_ITERATE_FLAG_NO_VALUE) == 0) { | if ((iter_flags & DICT_ITERATE_FLAG_NO_VALUE) == 0) { | |||
for (unsigned int i = 0; i < values_count; i++) | for (unsigned int i = 0; i < values_count; i++) | |||
End of changes. 21 change blocks. | ||||
14 lines changed or deleted | 21 lines changed or added |