Index: dbfile.scm ================================================================== --- dbfile.scm +++ dbfile.scm @@ -474,10 +474,11 @@ (define (dbfile:cautious-open-database fname init-proc #!optional (tries-left 50)) (let* ((busy-file (conc fname"-journal")) (delay-time (* (- 51 tries-left) 1.1)) (write-access (file-write-access? fname)) + (dir-access (file-write-access? (pathname-directory fname))) (retry (lambda () (thread-sleep! delay-time) (if (> tries-left 0) (dbfile:cautious-open-database fname init-proc (- tries-left 1)))))) (assert (>= tries-left 0) (conc "FATAL: too many attempts in dbfile:cautious-open-database of "fname", giving up.")) @@ -492,22 +493,27 @@ (dbfile:print-err "INFO: forcing journal rollup "busy-file) (dbfile:brute-force-salvage-db fname))) (dbfile:cautious-open-database fname init-proc (- tries-left 1))) (let* ((result (condition-case - (if write-access + (if dir-access (dbfile:with-simple-file-lock (conc fname ".lock") (lambda () (let* ((db-exists (file-exists? fname)) - (db (sqlite3:open-database fname))) + (db (sqlite3:open-database fname))) ;; creates an empty db if it did not already exist. (if (and init-proc (not db-exists)) (init-proc db)) db))) - (if (file-exists? fname ) - (sqlite3:open-database fname) - ) + (begin + (if (file-exists? fname ) + (begin + (sqlite3:open-database fname) + ) + (print "file doesn't exist: " fname) + ) + ) ) (exn (io-error) (dbfile:print-err exn "ERROR: i/o error with " fname ". Check permissions, disk space etc. and try again.") (retry)) (exn (corrupt)