]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql, cassandra: Add and implement sql_transaction_set_non_atomic()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Nov 2023 21:23:22 +0000 (23:23 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 10 Nov 2023 16:48:25 +0000 (16:48 +0000)
src/lib-sql/driver-cassandra.c
src/lib-sql/sql-api-private.h
src/lib-sql/sql-api.c
src/lib-sql/sql-api.h

index acfba9f55edbb8dc2faba696d73300a83b9018fd..b5dd3c0b15d76cfd606eb32446f8fe86068338f3 100644 (file)
@@ -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);
index d78122d794d27de969fd36bf9e9b448eb1e8f9aa..5ed570c791a1420dbac2fc8658cbc1f99175e0df 100644 (file)
@@ -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 *);
index 90542b46765d4cd294b1fa7911dfa89f16bcfd5d..1a5f499d517261a4f75b1660e6ee89539858c6cb 100644 (file)
@@ -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)
index 49f8f0a6aa5311faa3ac86df3d7891f235e95f8c..7fed8ff9fe0522f6138305fd31d5b3293e57ed7e 100644 (file)
@@ -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);