[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/emacsql d8d4bf4b98 202/427: Add emacsql-with-transaction m
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/emacsql d8d4bf4b98 202/427: Add emacsql-with-transaction macro. |
Date: |
Tue, 13 Dec 2022 02:59:42 -0500 (EST) |
branch: elpa/emacsql
commit d8d4bf4b98c36b50ab9c57e1b6892328ae1084c4
Author: Christopher Wellons <wellons@nullprogram.com>
Commit: Christopher Wellons <wellons@nullprogram.com>
Add emacsql-with-transaction macro.
---
emacsql.el | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/emacsql.el b/emacsql.el
index 5e8562be48..37ac8cc966 100644
--- a/emacsql.el
+++ b/emacsql.el
@@ -228,6 +228,30 @@ A statement can be a list, containing a statement with its
arguments."
else
collect (append (list 'emacsql 'emacsql--conn) statement))))
+(defvar emacsql--transaction-level 0
+ "Keeps track of nested transactions in `emacsql-with-transaction'.")
+
+(defmacro emacsql-with-transaction (connection &rest body)
+ "Evaluate BODY inside a single transaction, issuing a rollback on error.
+This macro can be nested indefinitely, wrapping everything in a
+single transaction at the lowest level."
+ (declare (indent 1))
+ `(let ((emacsql--connection ,connection)
+ (emacsql--completed nil)
+ (emacsql--transaction-level (1+ emacsql--transaction-level)))
+ (unwind-protect
+ (progn
+ (when (= 1 emacsql--transaction-level)
+ (emacsql emacsql--connection [:begin :transaction]))
+ (let ((result (progn ,@body)))
+ (prog1 result
+ (when (= 1 emacsql--transaction-level)
+ (emacsql emacsql--connection [:commit]))
+ (setf emacsql--completed t))))
+ (when (and (= 1 emacsql--transaction-level)
+ (not emacsql--completed))
+ (emacsql emacsql--connection [:rollback])))))
+
;; User interaction functions:
(defvar emacsql-show-buffer-name "*emacsql-show*"
- [nongnu] elpa/emacsql 672963ae53 191/427: Add DISTINCT option to :select., (continued)
- [nongnu] elpa/emacsql 672963ae53 191/427: Add DISTINCT option to :select., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql b1da2ba9d2 297/427: Change compiler flag order (work around old gcc bug)., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql d21cc86540 188/427: Add lexical binding to tests., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 3d556608ef 394/427: emacsql-mysql: Abort if mysql cannot be found, ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 568e663032 193/427: Fold dashes into underscores in identifiers., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql c85ab1f7b4 194/427: Enable foreign keys in SQLite by default., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql f51bb4bfaf 195/427: Allow foreign key specifications within columns., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql c4abd187a3 196/427: Remove junk file., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 3dfd0d4b8c 199/427: Fix missing argument typo., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 7341144e49 201/427: Fix ordering bug in emacsql--var-vars., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql d8d4bf4b98 202/427: Add emacsql-with-transaction macro.,
ELPA Syncer <=
- [nongnu] elpa/emacsql dc178532e5 203/427: Add emacsql-with-bind., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql cc92c154ee 205/427: Disallow nil as an identifier., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 75c0c4aeb7 204/427: Tweak emacsql-with-bind macro., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 3f38b357c3 206/427: Detect empty SQL vectors (better error messages)., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql ad24b1c508 208/427: Add JOIN syntax., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql fe2eef212c 210/427: Fix header typo., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 89654ad76b 211/427: Add identifier note., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 543189295d 215/427: Drop the pointless autoloads., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql 3127283cd1 218/427: Clean up middleware a bit., ELPA Syncer, 2022/12/13
- [nongnu] elpa/emacsql cf16cdb2f8 217/427: Add a special characters test., ELPA Syncer, 2022/12/13