[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
scratch/sqlite a7de036 1/2: Default to using a write-ahead log
From: |
Lars Ingebrigtsen |
Subject: |
scratch/sqlite a7de036 1/2: Default to using a write-ahead log |
Date: |
Mon, 13 Dec 2021 19:26:28 -0500 (EST) |
branch: scratch/sqlite
commit a7de0369fc4dc12d905d49fa65c94da52d8417e3
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Default to using a write-ahead log
---
lisp/emacs-lisp/multisession.el | 7 ++++++-
src/sqlite.c | 12 ++++++++++++
test/lisp/emacs-lisp/multisession-tests.el | 3 +--
3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/lisp/emacs-lisp/multisession.el b/lisp/emacs-lisp/multisession.el
index 1425bf2..52a38d6 100644
--- a/lisp/emacs-lisp/multisession.el
+++ b/lisp/emacs-lisp/multisession.el
@@ -82,8 +82,13 @@ DOC should be a doc string, and ARGS are keywords as
applicable to
(unless (sqlite-select
multisession--db
"select name from sqlite_master where type = 'table' and name =
'multisession'")
+ ;; Use a write-ahead-log (available since 2010), which makes
+ ;; writes a lot faster.
+ (sqlite-pragma multisession--db "journal_mode = WAL")
+ (sqlite-pragma multisession--db "bsynchronous = NORMAL")
+ ;; Tidy up the database automatically.
+ (sqlite-pragma multisession--db "auto_vacuum = FULL")
;; Create the table.
- (sqlite-execute multisession--db "PRAGMA auto_vacuum = FULL")
(sqlite-execute
multisession--db
"create table multisession (package text not null, key text not null,
sequence number not null default 1, value text not null)")
diff --git a/src/sqlite.c b/src/sqlite.c
index 42e4abd..e332f72 100644
--- a/src/sqlite.c
+++ b/src/sqlite.c
@@ -578,6 +578,17 @@ DEFUN ("sqlite-rollback", Fsqlite_rollback,
Ssqlite_rollback, 1, 1, 0,
return sqlite_exec (XSQLITE (db)->db, "rollback");
}
+DEFUN ("sqlite-pragma", Fsqlite_pragma, Ssqlite_pragma, 2, 2, 0,
+ doc: /* Execute PRAGMA in DB. */)
+ (Lisp_Object db, Lisp_Object pragma)
+{
+ check_sqlite (db, false);
+ CHECK_STRING (pragma);
+
+ return sqlite_exec (XSQLITE (db)->db,
+ SSDATA (concat2 (build_string ("PRAGMA "), pragma)));
+}
+
DEFUN ("sqlite-load-extension", Fsqlite_load_extension,
Ssqlite_load_extension, 2, 2, 0,
doc: /* Load a an SQlite module into DB.
@@ -693,6 +704,7 @@ syms_of_sqlite (void)
defsubr (&Ssqlite_transaction);
defsubr (&Ssqlite_commit);
defsubr (&Ssqlite_rollback);
+ defsubr (&Ssqlite_pragma);
defsubr (&Ssqlite_load_extension);
defsubr (&Ssqlite_next);
defsubr (&Ssqlite_columns);
diff --git a/test/lisp/emacs-lisp/multisession-tests.el
b/test/lisp/emacs-lisp/multisession-tests.el
index 91037d5..b26a8e0 100644
--- a/test/lisp/emacs-lisp/multisession-tests.el
+++ b/test/lisp/emacs-lisp/multisession-tests.el
@@ -90,10 +90,9 @@
(while (process-live-p proc)
(ignore-error 'sqlite-locked-error
(cl-incf (multisession-value bar)))
- (message "bar is %s" (multisession-value bar))
(sleep-for 0.1))
(message "bar ends up as %s" (multisession-value bar))
- (should (< (multisession-value bar) 1002)))
+ (should (< (multisession-value bar) 1003)))
(when (file-exists-p multisession-database-file)
(delete-file multisession-database-file)
(sqlite-close multisession--db)