Mercurial > dovecot > core-2.2
changeset 22526:33f66557b72e
cassandra: sql_transaction_commit_s() - Don't allow multi-query transactions
They were already denied for asynchronous commits. Also the synchronous
commits aren't actually used anywhere, so this shouldn't break anything.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 24 Aug 2017 11:09:05 +0300 |
parents | 7c8bf126fd39 |
children | db43860e2b12 |
files | src/lib-sql/driver-cassandra.c |
diffstat | 1 files changed, 2 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-sql/driver-cassandra.c Thu Sep 07 15:40:16 2017 +0300 +++ b/src/lib-sql/driver-cassandra.c Thu Aug 24 11:09:05 2017 +0300 @@ -1487,65 +1487,19 @@ } static void -commit_multi_fail(struct cassandra_transaction_context *ctx, - struct sql_result *result, const char *query) -{ - transaction_set_failed(ctx, t_strdup_printf( - "%s (query: %s)", sql_result_get_error(result), query)); - sql_result_unref(result); -} - -static int -driver_cassandra_transaction_commit_multi(struct cassandra_transaction_context *ctx, - struct sql_result **result_r) -{ - struct cassandra_db *db = (struct cassandra_db *)ctx->ctx.db; - struct sql_result *result; - struct sql_transaction_query *query; - int ret = 0; - - result = driver_cassandra_sync_query(db, "BEGIN"); - if (sql_result_next_row(result) < 0) { - commit_multi_fail(ctx, result, "BEGIN"); - return -1; - } - sql_result_unref(result); - - /* send queries */ - for (query = ctx->ctx.head; query != NULL; query = query->next) { - result = driver_cassandra_sync_query(db, query->query); - if (sql_result_next_row(result) < 0) { - commit_multi_fail(ctx, result, query->query); - ret = -1; - break; - } - sql_result_unref(result); - } - - *result_r = driver_cassandra_sync_query(db, ctx->failed ? - "ROLLBACK" : "COMMIT"); - return ret; -} - -static void driver_cassandra_try_commit_s(struct cassandra_transaction_context *ctx) { struct sql_transaction_context *_ctx = &ctx->ctx; - struct cassandra_db *db = (struct cassandra_db *)_ctx->db; struct sql_transaction_query *single_query = NULL; struct sql_result *result = NULL; - int ret = 0; if (_ctx->head->next == NULL) { /* just a single query, send it */ single_query = _ctx->head; result = sql_query_s(_ctx->db, single_query->query); } else { - /* multiple queries, use a transaction */ - driver_cassandra_sync_init(db); - ret = driver_cassandra_transaction_commit_multi(ctx, &result); - i_assert(ret == 0 || ctx->failed); - driver_cassandra_sync_deinit(db); + /* multiple queries - we don't actually have a transaction though */ + transaction_set_failed(ctx, "Multiple changes in transaction not supported"); } if (!ctx->failed) {