From: Timo Sirainen Date: Thu, 24 Aug 2017 08:09:05 +0000 (+0300) Subject: cassandra: sql_transaction_commit_s() - Don't allow multi-query transactions X-Git-Tag: 2.3.0.rc1~1057 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92e21c2a14182b040f891f3d18ede3e1b5f8c560;p=thirdparty%2Fdovecot%2Fcore.git 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. --- diff --git a/src/lib-sql/driver-cassandra.c b/src/lib-sql/driver-cassandra.c index d63bfdf865..d80fb2d39f 100644 --- a/src/lib-sql/driver-cassandra.c +++ b/src/lib-sql/driver-cassandra.c @@ -1491,66 +1491,20 @@ driver_cassandra_transaction_commit(struct sql_transaction_context *_ctx, } } -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) {