emacs-diffs
[Top][All Lists]
Advanced

[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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]