Skip to content

Commit

Permalink
lib-dict: dict_transaction_commit*() returns now error string
Browse files Browse the repository at this point in the history
  • Loading branch information
sirainen authored and GitLab committed May 8, 2016
1 parent c2a66e7 commit 661998e
Show file tree
Hide file tree
Showing 19 changed files with 398 additions and 253 deletions.
32 changes: 21 additions & 11 deletions src/dict/dict-commands.c
Expand Up @@ -261,43 +261,53 @@ dict_connection_transaction_lookup_parse(struct dict_connection *conn,
}

static void
cmd_commit_finish(struct dict_connection_cmd *cmd, int ret, bool async)
cmd_commit_finish(struct dict_connection_cmd *cmd,
const struct dict_commit_result *result, bool async)
{
string_t *str = t_str_new(64);
char chr;

switch (ret) {
switch (result->ret) {
case 1:
chr = DICT_PROTOCOL_REPLY_OK;
break;
case 0:
chr = DICT_PROTOCOL_REPLY_NOTFOUND;
break;
default:
i_assert(result->error != NULL);
chr = DICT_PROTOCOL_REPLY_FAIL;
break;
}
if (async) {
cmd->reply = i_strdup_printf("%c%c%u\n",
DICT_PROTOCOL_REPLY_ASYNC_COMMIT, chr, cmd->trans_id);
} else {
cmd->reply = i_strdup_printf("%c%u\n", chr, cmd->trans_id);
if (async)
str_append_c(str, DICT_PROTOCOL_REPLY_ASYNC_COMMIT);
str_append_c(str, chr);
str_printfa(str, "%c%u", chr, cmd->trans_id);
if (chr == DICT_PROTOCOL_REPLY_FAIL) {
str_append_c(str, '\t');
str_append_tabescaped(str, result->error);
}
str_append_c(str, '\n');
cmd->reply = i_strdup(str_c(str));

dict_connection_transaction_array_remove(cmd->conn, cmd->trans_id);
dict_connection_cmds_flush(cmd->conn);
}

static void cmd_commit_callback(int ret, void *context)
static void cmd_commit_callback(const struct dict_commit_result *result,
void *context)
{
struct dict_connection_cmd *cmd = context;

cmd_commit_finish(cmd, ret, FALSE);
cmd_commit_finish(cmd, result, FALSE);
}

static void cmd_commit_callback_async(int ret, void *context)
static void cmd_commit_callback_async(const struct dict_commit_result *result,
void *context)
{
struct dict_connection_cmd *cmd = context;

cmd_commit_finish(cmd, ret, TRUE);
cmd_commit_finish(cmd, result, TRUE);
}

static int
Expand Down
15 changes: 9 additions & 6 deletions src/doveadm/doveadm-dict.c
Expand Up @@ -121,14 +121,15 @@ static void cmd_dict_set(int argc, char *argv[])
{
struct dict *dict;
struct dict_transaction_context *trans;
const char *error;

if (cmd_dict_init(&argc, &argv, 2, 0, cmd_dict_set, &dict) < 0)
return;

trans = dict_transaction_begin(dict);
dict_set(trans, argv[0], argv[1]);
if (dict_transaction_commit(&trans) <= 0) {
i_error("dict_transaction_commit() failed");
if (dict_transaction_commit(&trans, &error) <= 0) {
i_error("dict_transaction_commit() failed: %s", error);
doveadm_exit_code = EX_TEMPFAIL;
}
dict_deinit(&dict);
Expand All @@ -138,14 +139,15 @@ static void cmd_dict_unset(int argc, char *argv[])
{
struct dict *dict;
struct dict_transaction_context *trans;
const char *error;

if (cmd_dict_init(&argc, &argv, 1, 0, cmd_dict_unset, &dict) < 0)
return;

trans = dict_transaction_begin(dict);
dict_unset(trans, argv[0]);
if (dict_transaction_commit(&trans) <= 0) {
i_error("dict_transaction_commit() failed");
if (dict_transaction_commit(&trans, &error) <= 0) {
i_error("dict_transaction_commit() failed: %s", error);
doveadm_exit_code = EX_TEMPFAIL;
}
dict_deinit(&dict);
Expand All @@ -155,6 +157,7 @@ static void cmd_dict_inc(int argc, char *argv[])
{
struct dict *dict;
struct dict_transaction_context *trans;
const char *error;
long long diff;
int ret;

Expand All @@ -170,9 +173,9 @@ static void cmd_dict_inc(int argc, char *argv[])

trans = dict_transaction_begin(dict);
dict_atomic_inc(trans, argv[0], diff);
ret = dict_transaction_commit(&trans);
ret = dict_transaction_commit(&trans, &error);
if (ret < 0) {
i_error("dict_transaction_commit() failed");
i_error("dict_transaction_commit() failed: %s", error);
doveadm_exit_code = EX_TEMPFAIL;
} else if (ret == 0) {
i_error("%s doesn't exist", argv[0]);
Expand Down
20 changes: 11 additions & 9 deletions src/lib-dict-extra/dict-fs.c
Expand Up @@ -219,7 +219,8 @@ fs_dict_transaction_init(struct dict *_dict)
return &ctx->ctx;
}

static int fs_dict_write_changes(struct dict_transaction_memory_context *ctx)
static int fs_dict_write_changes(struct dict_transaction_memory_context *ctx,
const char **error_r)
{
struct fs_dict *dict = (struct fs_dict *)ctx->ctx.dict;
struct fs_file *file;
Expand All @@ -234,7 +235,8 @@ static int fs_dict_write_changes(struct dict_transaction_memory_context *ctx)
file = fs_file_init(dict->fs, key,
FS_OPEN_MODE_REPLACE);
if (fs_write(file, change->value.str, strlen(change->value.str)) < 0) {
i_error("fs_write(%s) failed: %s", key,
*error_r = t_strdup_printf(
"fs_write(%s) failed: %s", key,
fs_file_last_error(file));
ret = -1;
}
Expand All @@ -243,7 +245,8 @@ static int fs_dict_write_changes(struct dict_transaction_memory_context *ctx)
case DICT_CHANGE_TYPE_UNSET:
file = fs_file_init(dict->fs, key, FS_OPEN_MODE_READONLY);
if (fs_delete(file) < 0) {
i_error("fs_delete(%s) failed: %s", key,
*error_r = t_strdup_printf(
"fs_delete(%s) failed: %s", key,
fs_file_last_error(file));
ret = -1;
}
Expand All @@ -266,15 +269,14 @@ fs_dict_transaction_commit(struct dict_transaction_context *_ctx,
{
struct dict_transaction_memory_context *ctx =
(struct dict_transaction_memory_context *)_ctx;
int ret;
struct dict_commit_result result = { .ret = 1 };

if (fs_dict_write_changes(ctx) < 0)
ret = -1;
else
ret = 1;

if (fs_dict_write_changes(ctx, &result.error) < 0)
result.ret = -1;
pool_unref(&ctx->pool);

callback(ret, context);
callback(&result, context);
}

struct dict dict_driver_fs = {
Expand Down

0 comments on commit 661998e

Please sign in to comment.