array_pop_front(&dict->input_states);
}
-static void redis_callback(struct redis_dict *dict,
- const struct redis_dict_reply *reply,
- const struct dict_commit_result *result)
-{
- if (reply->callback != NULL) {
- dict_pre_api_callback(&dict->dict);
- reply->callback(result, reply->context);
- dict_post_api_callback(&dict->dict);
- }
-}
-
static void
redis_disconnected(struct redis_connection *conn, const char *reason)
{
connection_disconnect(&conn->conn);
array_foreach(&conn->dict->replies, reply)
- redis_callback(conn->dict, reply, &result);
+ reply->callback(&result, reply->context);
array_clear(&conn->dict->replies);
array_clear(&conn->dict->input_states);
const struct dict_commit_result result = {
DICT_COMMIT_RET_OK, NULL
};
- redis_callback(dict, reply, &result);
+ reply->callback(&result, reply->context);
array_pop_front(&dict->replies);
/* if we're running in a dict-ioloop, we're handling a
synchronous commit and need to stop now */
#include "llist.h"
#include "ioloop.h"
#include "str.h"
+#include "ioloop.h"
#include "dict-private.h"
+struct dict_commit_callback_ctx {
+ struct dict *dict;
+ dict_transaction_commit_callback_t *callback;
+ void *context;
+};
+
+struct dict_lookup_callback_ctx {
+ struct dict *dict;
+ dict_lookup_callback_t *callback;
+ void *context;
+};
+
static ARRAY(struct dict *) dict_drivers;
static struct dict *dict_driver_lookup(const char *name)
}
}
+static void
+dict_lookup_callback(const struct dict_lookup_result *result,
+ void *context)
+{
+ struct dict_lookup_callback_ctx *ctx = context;
+
+ dict_pre_api_callback(ctx->dict);
+ ctx->callback(result, ctx->context);
+ dict_post_api_callback(ctx->dict);
+
+ i_free(ctx);
+}
+
+static void dict_commit_callback(const struct dict_commit_result *result,
+ void *context)
+{
+ struct dict_commit_callback_ctx *ctx = context;
+
+ i_assert(result->ret >= 0 || result->error != NULL);
+ dict_pre_api_callback(ctx->dict);
+ if (ctx->callback != NULL)
+ ctx->callback(result, ctx->context);
+ else if (result->ret < 0)
+ i_error("dict(%s): Commit failed: %s",
+ ctx->dict->name, result->error);
+ dict_post_api_callback(ctx->dict);
+ i_free(ctx);
+}
int dict_lookup(struct dict *dict, pool_t pool, const char *key,
const char **value_r, const char **error_r)
callback(&result, context);
return;
}
- dict->v.lookup_async(dict, key, callback, context);
+ struct dict_lookup_callback_ctx *lctx =
+ i_new(struct dict_lookup_callback_ctx, 1);
+ lctx->dict = dict;
+ lctx->callback = callback;
+ lctx->context = context;
+ dict->v.lookup_async(dict, key, dict_lookup_callback, lctx);
}
struct dict_iterate_context *
int dict_transaction_commit(struct dict_transaction_context **_ctx,
const char **error_r)
{
+ struct dict_commit_callback_ctx *cctx =
+ i_new(struct dict_commit_callback_ctx, 1);
struct dict_transaction_context *ctx = *_ctx;
struct dict_commit_sync_result result;
i_assert(ctx->dict->transaction_count > 0);
ctx->dict->transaction_count--;
DLLIST_REMOVE(&ctx->dict->transactions, ctx);
- ctx->dict->v.transaction_commit(ctx, FALSE,
- dict_transaction_commit_sync_callback, &result);
+ cctx->dict = ctx->dict;
+ cctx->callback = dict_transaction_commit_sync_callback;
+ cctx->context = &result;
+
+ ctx->dict->v.transaction_commit(ctx, FALSE, dict_commit_callback, cctx);
*error_r = t_strdup(result.error);
i_free(result.error);
return result.ret;
dict_transaction_commit_callback_t *callback,
void *context)
{
+ struct dict_commit_callback_ctx *cctx =
+ i_new(struct dict_commit_callback_ctx, 1);
struct dict_transaction_context *ctx = *_ctx;
*_ctx = NULL;
DLLIST_REMOVE(&ctx->dict->transactions, ctx);
if (callback == NULL)
callback = dict_transaction_commit_async_noop_callback;
- ctx->dict->v.transaction_commit(ctx, TRUE, callback, context);
+ cctx->dict = ctx->dict;
+ cctx->callback = callback;
+ cctx->context = context;
+ ctx->dict->v.transaction_commit(ctx, TRUE, dict_commit_callback, cctx);
}
void dict_transaction_rollback(struct dict_transaction_context **_ctx)