Skip to content

Commit e388909

Browse files
committed
Implement a retry loop when SQLite database is "BUSY".
It turns our that you can't do some operations on SQLite from several concurrent connections, such as a "pgrama encoding" query. Fixes dimitri#1193.
1 parent 49e5877 commit e388909

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

src/sources/sqlite/sqlite-schema.lisp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,21 @@
1010
;;;
1111
;;; SQLite schema introspection facilities
1212
;;;
13+
(defun sqlite-pragma-encoding (db)
14+
(handler-case
15+
(sqlite:execute-single db "pragma encoding;")
16+
(sqlite:sqlite-error (e)
17+
(if (eq :busy (sqlite:sqlite-error-code e))
18+
;; retry when "database is locked" for being BUSY
19+
(progn
20+
(sleep 0.1)
21+
(sqlite-pragma-encoding db))
22+
;; fail by re-signaling the error
23+
(error e)))))
24+
1325
(defun sqlite-encoding (db)
1426
"Return a BABEL suitable encoding for the SQLite db handle."
15-
(let ((encoding-string (sqlite:execute-single db "pragma encoding;")))
27+
(let ((encoding-string (sqlite-pragma-encoding db)))
1628
(cond ((string-equal encoding-string "UTF-8") :utf-8)
1729
((string-equal encoding-string "UTF-16") :utf-16)
1830
((string-equal encoding-string "UTF-16le") :utf-16le)

0 commit comments

Comments
 (0)