summaryrefslogtreecommitdiffstats
path: root/dbutil.scm
diff options
context:
space:
mode:
Diffstat (limited to 'dbutil.scm')
-rw-r--r--dbutil.scm26
1 files changed, 16 insertions, 10 deletions
diff --git a/dbutil.scm b/dbutil.scm
index 5e5c86d..5df7b49 100644
--- a/dbutil.scm
+++ b/dbutil.scm
@@ -113,11 +113,13 @@
(if (null? *base-table-implementations*) (require 'alist-table))
(cond ((and (not (and mutable? (not certificate)))
(loop *base-table-implementations*)))
- ((memq 'alist-table *base-table-implementations*) #f)
- ((let ()
- (require 'alist-table)
- (loop (list (car *base-table-implementations*)))))
- (else #f)))
+ ((and (not (memq 'alist-table *base-table-implementations*))
+ (let ()
+ (require 'alist-table)
+ (loop (list (car *base-table-implementations*))))))
+ (else
+ (and certificate (file-unlock! filename certificate))
+ #f)))
(define (mdbm:open-type filename type mutable?)
(require type)
@@ -126,7 +128,9 @@
(let* ((sys (cadr (assq type *base-table-implementations*)))
(open (and sys (sys 'open-database)))
(ndb (and open (open filename mutable?))))
- (and ndb (list ndb 1 type certificate))))))
+ (cond (ndb (list ndb 1 type certificate))
+ (else (and certificate (file-unlock! filename certificate))
+ #f))))))
;;@args filename base-table-type
;;@1 should be a string naming a file; or @code{#f}. @2 must be a
@@ -302,14 +306,16 @@
(define certificate #f)
(and entry (set! rdb (car entry)))
(and (procedure? rdb)
- (set! certificate (or (and entry (cadddr entry))
- (and (rdb 'filename)
- (file-lock! (rdb 'filename))))))
+ (set! certificate (and entry (cadddr entry))))
(cond ((and entry (not (eqv? 1 (cadr entry))))
(set-car! (cdr entry) (+ -1 (cadr entry)))
#f)
- ((or (not certificate) (not (procedure? rdb)))
+ ((not (procedure? rdb))
+ (slib:warn 'close-database 'not 'procedure? rdb)
#f)
+ ((not certificate)
+ (and dbs (set! dbs (mdbm:remove-entry dbs entry)))
+ #t)
(else
(let* ((filename (rdb 'filename))
(dbclose (rdb 'close-database))