Mercurial > dovecot > core-2.2
changeset 20528:b885fee56a82
lib-sql: Added sql_transaction_commit2()
In v2.3 the sql_transaction_commit() API was just modified, but for now
we'll add this _commit2() to preserve API compatibility.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sun, 17 Jul 2016 12:33:41 -0600 |
parents | 231c1f214d40 |
children | 6450eb09e83c |
files | src/lib-sql/driver-cassandra.c src/lib-sql/driver-mysql.c src/lib-sql/driver-pgsql.c src/lib-sql/driver-sqlite.c src/lib-sql/driver-sqlpool.c src/lib-sql/sql-api-private.h src/lib-sql/sql-api.c src/lib-sql/sql-api.h |
diffstat | 8 files changed, 83 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-sql/driver-cassandra.c Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/driver-cassandra.c Sun Jul 17 12:33:41 2016 -0600 @@ -1341,7 +1341,8 @@ driver_cassandra_update, - driver_cassandra_escape_blob + driver_cassandra_escape_blob, + NULL } };
--- a/src/lib-sql/driver-mysql.c Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/driver-mysql.c Sun Jul 17 12:33:41 2016 -0600 @@ -678,7 +678,8 @@ driver_mysql_update, - driver_mysql_escape_blob + driver_mysql_escape_blob, + NULL } };
--- a/src/lib-sql/driver-pgsql.c Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/driver-pgsql.c Sun Jul 17 12:33:41 2016 -0600 @@ -1165,7 +1165,8 @@ driver_pgsql_update, - driver_pgsql_escape_blob + driver_pgsql_escape_blob, + NULL } };
--- a/src/lib-sql/driver-sqlite.c Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/driver-sqlite.c Sun Jul 17 12:33:41 2016 -0600 @@ -425,7 +425,8 @@ driver_sqlite_transaction_rollback, driver_sqlite_update, - driver_sqlite_escape_blob + driver_sqlite_escape_blob, + NULL } };
--- a/src/lib-sql/driver-sqlpool.c Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/driver-sqlpool.c Sun Jul 17 12:33:41 2016 -0600 @@ -832,6 +832,7 @@ driver_sqlpool_update, - driver_sqlpool_escape_blob + driver_sqlpool_escape_blob, + NULL } };
--- a/src/lib-sql/sql-api-private.h Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/sql-api-private.h Sun Jul 17 12:33:41 2016 -0600 @@ -78,6 +78,9 @@ unsigned int *affected_rows); const char *(*escape_blob)(struct sql_db *db, const unsigned char *data, size_t size); + void (*transaction_commit2)(struct sql_transaction_context *ctx, + sql_commit2_callback_t *callback, + void *context); }; struct sql_db {
--- a/src/lib-sql/sql-api.c Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/sql-api.c Sun Jul 17 12:33:41 2016 -0600 @@ -350,6 +350,20 @@ 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) @@ -357,7 +371,49 @@ 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,
--- a/src/lib-sql/sql-api.h Fri Jul 15 16:40:31 2016 -0500 +++ b/src/lib-sql/sql-api.h Sun Jul 17 12:33:41 2016 -0600 @@ -48,8 +48,14 @@ 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); @@ -143,6 +149,13 @@ 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);