]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: driver-sqlite - Handle rollback errors correctly
authorAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 20 Oct 2025 09:19:24 +0000 (12:19 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 20 Oct 2025 17:05:03 +0000 (20:05 +0300)
Can't really claim we rolled back anything if rollback fails.

src/lib-sql/driver-sqlite.c

index 36fe3ef1b4c654a6f815c87b2ab4947f4db11cc0..73fdcf51ae9a639033597545629b043f9182e4d6 100644 (file)
@@ -694,15 +694,20 @@ driver_sqlite_transaction_rollback(struct sql_transaction_context *_ctx)
 {
        struct sqlite_transaction_context *ctx =
                container_of(_ctx, struct sqlite_transaction_context, ctx);
+       struct sqlite_db *db = container_of(_ctx->db, struct sqlite_db, api);
 
-       if (SQLITE_IS_OK(ctx->rc)) {
+       const char *error;
+       int rc = driver_sqlite_exec_query(db, "ROLLBACK", &error);
+       if (SQLITE_IS_OK(rc)) {
                e_debug(sql_transaction_finished_event(_ctx)->
                        add_str("error", "Rolled back")->event(),
                        "Transaction rolled back");
+       } else {
+               e_debug(sql_transaction_finished_event(_ctx)->
+                       add_str("error", error)->
+                       add_int("error_code", rc)->event(),
+                       "Transaction rollback failed");
        }
-       ctx->rc = SQLITE_OK;
-       i_free(ctx->error);
-       driver_sqlite_transaction_exec(ctx, "ROLLBACK");
        event_unref(&_ctx->event);
        i_free(ctx->error);
        i_free(ctx);