summaryrefslogtreecommitdiff
path: root/guix/scripts/locate.scm
diff options
context:
space:
mode:
authorMaciej Kalandyk <m.kalandyk@outlook.com>2023-11-18 01:30:39 +0100
committerLudovic Courtès <ludo@gnu.org>2023-11-26 23:34:48 +0100
commitce74e02078b4d2753bf0205fae205a1b704b15d4 (patch)
treee6c47a760e13d4abbd0401e20857219ecb040413 /guix/scripts/locate.scm
parentda2dc98185526796fbfb4bc63caf9d70aead9037 (diff)
locate: Gracefully handle busy-database error conditions.
* guix/scripts/locate.scm (SQLITE_BUSY): New variable. (call-with-database): Catch 'sqlite-error and call ‘leave’ upon SQLITE_BUSY. Change-Id: Iebe76c75d45e70317bd18d2c176dcdeaf9d6964c Co-authored-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'guix/scripts/locate.scm')
-rw-r--r--guix/scripts/locate.scm24
1 files changed, 17 insertions, 7 deletions
diff --git a/guix/scripts/locate.scm b/guix/scripts/locate.scm
index 92af3509bf..963ff2bf57 100644
--- a/guix/scripts/locate.scm
+++ b/guix/scripts/locate.scm
@@ -114,14 +114,24 @@ alter table Packages
add column output text;
")))
+;; XXX: missing in guile-sqlite3@0.1.3
+(define SQLITE_BUSY 5)
+
(define (call-with-database file proc)
- (let ((db (sqlite-open file)))
- (dynamic-wind
- (lambda () #t)
- (lambda ()
- (ensure-latest-database-schema db)
- (proc db))
- (lambda () (sqlite-close db)))))
+ (catch 'sqlite-error
+ (lambda ()
+ (let ((db (sqlite-open file)))
+ (dynamic-wind
+ (lambda () #t)
+ (lambda ()
+ (ensure-latest-database-schema db)
+ (proc db))
+ (lambda () (sqlite-close db)))))
+ (lambda (key who code errmsg)
+ (if (= code SQLITE_BUSY)
+ (leave (G_ "~a: database is locked by another process~%")
+ file)
+ (throw key who code errmsg)))))
(define (ensure-latest-database-schema db)
"Ensure DB follows the latest known version of the schema."