return 0;
}
-static int
+static void
fs_dict_transaction_commit(struct dict_transaction_context *_ctx,
bool async ATTR_UNUSED,
dict_transaction_commit_callback_t *callback,
ret = 1;
pool_unref(&ctx->pool);
- if (callback != NULL)
- callback(ret, context);
- return ret;
+ callback(ret, context);
}
struct dict dict_driver_fs = {
}
}
-static int
+static void
client_dict_transaction_commit(struct dict_transaction_context *_ctx,
bool async,
dict_transaction_commit_callback_t *callback,
dict->io = io_add(dict->fd, IO_READ,
dict_async_input, dict);
}
+ return;
} else {
/* sync commit, read reply */
if (client_dict_read_line(dict, &line, &error) < 0) {
}
}
}
+ DLLIST_REMOVE(&dict->transactions, ctx);
- if (ret < 0 || !async) {
- DLLIST_REMOVE(&dict->transactions, ctx);
- i_free(ctx);
+ callback(ret, context);
+ i_free(ctx);
- client_dict_add_timeout(dict);
- }
- return ret;
+ client_dict_add_timeout(dict);
}
static void
return 0;
}
-static int
+static void
file_dict_transaction_commit(struct dict_transaction_context *_ctx,
bool async ATTR_UNUSED,
dict_transaction_commit_callback_t *callback,
ret = 1;
pool_unref(&ctx->pool);
- if (callback != NULL)
- callback(ret, context);
- return ret;
+ callback(ret, context);
}
struct dict dict_driver_file = {
return 0;
}
-static int
+static void
memcached_ascii_transaction_commit(struct dict_transaction_context *_ctx,
bool async,
dict_transaction_commit_callback_t *callback,
if (async && ret == 0) {
pool_unref(&ctx->pool);
- return 1;
+ return;
}
if (ret == 0) {
}
}
}
- if (callback != NULL)
- callback(ret, context);
+ callback(ret, context);
pool_unref(&ctx->pool);
- return ret;
}
struct dict dict_driver_memcached_ascii = {
const char **error_r);
struct dict_transaction_context *(*transaction_init)(struct dict *dict);
- int (*transaction_commit)(struct dict_transaction_context *ctx,
- bool async,
- dict_transaction_commit_callback_t *callback,
- void *context);
+ /* call the callback before returning if non-async commits */
+ void (*transaction_commit)(struct dict_transaction_context *ctx,
+ bool async,
+ dict_transaction_commit_callback_t *callback,
+ void *context);
void (*transaction_rollback)(struct dict_transaction_context *ctx);
void (*set)(struct dict_transaction_context *ctx,
return &ctx->ctx;
}
-static int
+static void
redis_transaction_commit(struct dict_transaction_context *_ctx, bool async,
dict_transaction_commit_callback_t *callback,
void *context)
redis_input_state_add(dict, REDIS_INPUT_STATE_EXEC_REPLY);
if (async) {
i_free(ctx);
- return 1;
+ return;
}
redis_wait(dict);
}
- if (callback != NULL)
- callback(ret, context);
+ callback(ret, context);
i_free(ctx);
- return ret;
}
static void redis_transaction_rollback(struct dict_transaction_context *_ctx)
sql_dict_transaction_free(ctx);
}
-static int
+static void
sql_dict_transaction_commit(struct dict_transaction_context *_ctx, bool async,
dict_transaction_commit_callback_t *callback,
void *context)
ctx->async_context = context;
sql_transaction_commit(&ctx->sql_ctx,
sql_dict_transaction_commit_callback, ctx);
- return 1;
+ return;
} else {
if (sql_transaction_commit_s(&ctx->sql_ctx, &error) < 0) {
i_error("sql dict: commit failed: %s", error);
}
sql_dict_transaction_free(ctx);
- if (callback != NULL)
- callback(ret, context);
- return ret;
+ callback(ret, context);
}
static void sql_dict_transaction_rollback(struct dict_transaction_context *_ctx)
return dict->v.transaction_init(dict);
}
+static void dict_transaction_commit_sync_callback(int ret, void *context)
+{
+ int *ret_p = context;
+ *ret_p = ret;
+}
+
int dict_transaction_commit(struct dict_transaction_context **_ctx)
{
struct dict_transaction_context *ctx = *_ctx;
+ int ret;
*_ctx = NULL;
- return ctx->dict->v.transaction_commit(ctx, FALSE, NULL, NULL);
+ ctx->dict->v.transaction_commit(ctx, FALSE,
+ dict_transaction_commit_sync_callback, &ret);
+ return ret;
}
void dict_transaction_commit_async(struct dict_transaction_context **_ctx,