From a7de0b4db19b13bb4b75c0bcce9af0a28d05ff25 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 9 Nov 2023 23:23:22 +0200 Subject: [PATCH] lib-sql, cassandra: Add and implement sql_transaction_set_non_atomic() --- src/lib-sql/driver-cassandra.c | 4 +++- src/lib-sql/sql-api-private.h | 2 ++ src/lib-sql/sql-api.c | 5 +++++ src/lib-sql/sql-api.h | 3 +++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib-sql/driver-cassandra.c b/src/lib-sql/driver-cassandra.c index acfba9f55e..b5dd3c0b15 100644 --- a/src/lib-sql/driver-cassandra.c +++ b/src/lib-sql/driver-cassandra.c @@ -2198,7 +2198,9 @@ static void cassandra_transaction_finish(struct cassandra_transaction_context *c switch (result_type) { case CASSANDRA_RESULT_TYPE_BATCH: { struct cassandra_sql_statement *stmt; - cass_result->batch = cass_batch_new(CASS_BATCH_TYPE_LOGGED); + cass_result->batch = cass_batch_new(ctx->ctx.non_atomic ? + CASS_BATCH_TYPE_UNLOGGED : + CASS_BATCH_TYPE_LOGGED); array_foreach_elem(&ctx->statements, stmt) { cass_batch_add_statement(cass_result->batch, stmt->cass_stmt); diff --git a/src/lib-sql/sql-api-private.h b/src/lib-sql/sql-api-private.h index d78122d794..5ed570c791 100644 --- a/src/lib-sql/sql-api-private.h +++ b/src/lib-sql/sql-api-private.h @@ -239,6 +239,8 @@ struct sql_transaction_context { /* commit() must use this query list if head is non-NULL. */ struct sql_transaction_query *head, *tail; + + bool non_atomic; }; ARRAY_DEFINE_TYPE(sql_drivers, const struct sql_db *); diff --git a/src/lib-sql/sql-api.c b/src/lib-sql/sql-api.c index 90542b4676..1a5f499d51 100644 --- a/src/lib-sql/sql-api.c +++ b/src/lib-sql/sql-api.c @@ -718,6 +718,11 @@ struct sql_transaction_context *sql_transaction_begin(struct sql_db *db) return db->v.transaction_begin(db); } +void sql_transaction_set_non_atomic(struct sql_transaction_context *ctx) +{ + ctx->non_atomic = TRUE; +} + #undef sql_transaction_commit void sql_transaction_commit(struct sql_transaction_context **_ctx, sql_commit_callback_t *callback, void *context) diff --git a/src/lib-sql/sql-api.h b/src/lib-sql/sql-api.h index 49f8f0a6aa..7fed8ff9fe 100644 --- a/src/lib-sql/sql-api.h +++ b/src/lib-sql/sql-api.h @@ -227,6 +227,9 @@ enum sql_result_error_type sql_result_get_error_type(struct sql_result *result); /* Begin a new transaction. Currently you're limited to only one open transaction at a time. */ struct sql_transaction_context *sql_transaction_begin(struct sql_db *db); +/* Don't require transaction to be atomic. Currently this is implemented only + with Cassandra to use UNLOGGED BATCH operations. */ +void sql_transaction_set_non_atomic(struct sql_transaction_context *ctx); /* Commit transaction. */ void sql_transaction_commit(struct sql_transaction_context **ctx, sql_commit_callback_t *callback, void *context); -- 2.47.3