aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorF. Jason Park2024-03-10 20:13:42 -0700
committerEli Zaretskii2024-03-11 15:23:55 +0200
commitdb5915f30ba063b72b007d243fbd832e8a4e8961 (patch)
tree573d768e8ae5dc14ed813d1ee032a4d8de5e2831
parentfe491173e8f839653cb22eea63a7261f4aa1dca9 (diff)
downloademacs-db5915f30ba063b72b007d243fbd832e8a4e8961.tar.gz
emacs-db5915f30ba063b72b007d243fbd832e8a4e8961.zip
Fix 'with-sqlite-transaction'
* lisp/sqlite.el (with-sqlite-transaction): Tuck misplaced body of else form back into feature-test control structure whence it escaped. (Bug#67142) * test/lisp/sqlite-tests.el: New file to accompany test/src/sqlite-tests.el.
-rw-r--r--lisp/sqlite.el7
-rw-r--r--test/lisp/sqlite-tests.el51
2 files changed, 55 insertions, 3 deletions
diff --git a/lisp/sqlite.el b/lisp/sqlite.el
index 46e35ac18d8..efc5997fb5c 100644
--- a/lisp/sqlite.el
+++ b/lisp/sqlite.el
@@ -32,7 +32,8 @@
32If BODY completes normally, commit the changes and return 32If BODY completes normally, commit the changes and return
33the value of BODY. 33the value of BODY.
34If BODY signals an error, or transaction commit fails, roll 34If BODY signals an error, or transaction commit fails, roll
35back the transaction changes." 35back the transaction changes before allowing the signal to
36propagate."
36 (declare (indent 1) (debug (form body))) 37 (declare (indent 1) (debug (form body)))
37 (let ((db-var (gensym)) 38 (let ((db-var (gensym))
38 (func-var (gensym)) 39 (func-var (gensym))
@@ -48,8 +49,8 @@ back the transaction changes."
48 (setq ,res-var (funcall ,func-var)) 49 (setq ,res-var (funcall ,func-var))
49 (setq ,commit-var (sqlite-commit ,db-var)) 50 (setq ,commit-var (sqlite-commit ,db-var))
50 ,res-var) 51 ,res-var)
51 (or ,commit-var (sqlite-rollback ,db-var)))) 52 (or ,commit-var (sqlite-rollback ,db-var)))
52 (funcall ,func-var)))) 53 (funcall ,func-var)))))
53 54
54(provide 'sqlite) 55(provide 'sqlite)
55 56
diff --git a/test/lisp/sqlite-tests.el b/test/lisp/sqlite-tests.el
new file mode 100644
index 00000000000..d4892a27efc
--- /dev/null
+++ b/test/lisp/sqlite-tests.el
@@ -0,0 +1,51 @@
1;;; sqlite-tests.el --- Tests for sqlite.el -*- lexical-binding: t; -*-
2
3;; Copyright (C) 2024 Free Software Foundation, Inc.
4
5;; This file is part of GNU Emacs.
6
7;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version.
11
12;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details.
16
17;; You should have received a copy of the GNU General Public License
18;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19
20;;; Commentary:
21
22;;; Code:
23(require 'sqlite)
24
25(ert-deftest with-sqlite-transaction ()
26 (skip-unless (sqlite-available-p))
27 (let ((db (sqlite-open)))
28 (sqlite-execute db "create table test (a)")
29 (should
30 (eql 42 (with-sqlite-transaction db
31 (sqlite-execute db "insert into test values (1)")
32 (should (equal '((1)) (sqlite-select db "select * from test")))
33 42)))
34 ;; Body runs exactly once.
35 (should (equal '((1)) (sqlite-select db "select * from test")))))
36
37(ert-deftest with-sqlite-transaction/rollback ()
38 (skip-unless (sqlite-available-p))
39 (let ((db (sqlite-open)))
40 (sqlite-execute db "create table test (a)")
41 (should (equal '(sqlite-error
42 ("SQL logic error" "no such function: fake" 1 1))
43 (should-error
44 (with-sqlite-transaction db
45 (sqlite-execute db "insert into test values (1)")
46 (sqlite-execute db "insert into test values (fake(2))")
47 42))))
48 ;; First insertion (a=1) rolled back.
49 (should-not (sqlite-select db "select * from test"))))
50
51;;; sqlite-tests.el ends here