return db->v.transaction_begin(db);
}
+struct sql_commit1_wrap_ctx {
+ sql_commit_callback_t *callback;
+ void *context;
+};
+
+static void sql_commit1_wrap(const struct sql_commit_result *result,
+ void *context)
+{
+ struct sql_commit1_wrap_ctx *ctx = context;
+
+ ctx->callback(result->error, ctx->context);
+ i_free(ctx);
+}
+
#undef sql_transaction_commit
void sql_transaction_commit(struct sql_transaction_context **_ctx,
sql_commit_callback_t *callback, void *context)
struct sql_transaction_context *ctx = *_ctx;
*_ctx = NULL;
- ctx->db->v.transaction_commit(ctx, callback, context);
+ if (ctx->db->v.transaction_commit != NULL)
+ ctx->db->v.transaction_commit(ctx, callback, context);
+ else {
+ struct sql_commit1_wrap_ctx *wrap;
+
+ wrap = i_new(struct sql_commit1_wrap_ctx, 1);
+ wrap->callback = callback;
+ wrap->context = context;
+ ctx->db->v.transaction_commit2(ctx, sql_commit1_wrap, wrap);
+ }
+}
+
+struct sql_commit2_wrap_ctx {
+ sql_commit2_callback_t *callback;
+ void *context;
+};
+
+static void sql_commit2_wrap(const char *error, void *context)
+{
+ struct sql_commit2_wrap_ctx *ctx = context;
+ struct sql_commit_result result = { .error = error };
+
+ ctx->callback(&result, ctx->context);
+ i_free(ctx);
+}
+
+#undef sql_transaction_commit2
+void sql_transaction_commit2(struct sql_transaction_context **_ctx,
+ sql_commit2_callback_t *callback, void *context)
+{
+ struct sql_transaction_context *ctx = *_ctx;
+
+ *_ctx = NULL;
+ if (ctx->db->v.transaction_commit2 != NULL)
+ ctx->db->v.transaction_commit2(ctx, callback, context);
+ else {
+ struct sql_commit2_wrap_ctx *wrap;
+
+ wrap = i_new(struct sql_commit2_wrap_ctx, 1);
+ wrap->callback = callback;
+ wrap->context = context;
+ ctx->db->v.transaction_commit(ctx, sql_commit2_wrap, wrap);
+ }
}
int sql_transaction_commit_s(struct sql_transaction_context **_ctx,
struct sql_db;
struct sql_result;
+struct sql_commit_result {
+ const char *error;
+ enum sql_result_error_type error_type;
+};
+
typedef void sql_query_callback_t(struct sql_result *result, void *context);
typedef void sql_commit_callback_t(const char *error, void *context);
+typedef void sql_commit2_callback_t(const struct sql_commit_result *result, void *context);
void sql_drivers_init(void);
void sql_drivers_deinit(void);
CALLBACK_TYPECHECK(callback, void (*)( \
const char *, typeof(context))), \
(sql_commit_callback_t *)callback, context)
+void sql_transaction_commit2(struct sql_transaction_context **ctx,
+ sql_commit2_callback_t *callback, void *context);
+#define sql_transaction_commit2(ctx, callback, context) \
+ sql_transaction_commit2(ctx + \
+ CALLBACK_TYPECHECK(callback, void (*)( \
+ const struct sql_commit_result *, typeof(context))), \
+ (sql_commit2_callback_t *)callback, context)
/* Synchronous commit. Returns 0 if ok, -1 if error. */
int sql_transaction_commit_s(struct sql_transaction_context **ctx,
const char **error_r);