database: Provide a way to specify the schema location.

* guix/store/database.scm (sqlite-register): Add #:schema.  Parameterize
'sql-schema' based on this.
(register-path): Add #:schema and pass it to 'sqlite-register'.
This commit is contained in:
Ludovic Courtès 2018-06-04 22:35:48 +02:00
parent c5a2e1ffcb
commit 33fddb763a
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -88,7 +88,7 @@ (define (last-insert-row-id db)
;; XXX: (sqlite3) currently lacks bindings for 'sqlite3_last_insert_rowid'.
;; Work around that.
(let* ((stmt (sqlite-prepare db "SELECT last_insert_rowid();"
#:cache? #t))
#:cache? #t))
(result (sqlite-fold cons '() stmt)))
(sqlite-finalize stmt)
(match result
@ -157,7 +157,8 @@ (define (add-references db referrer references)
;; XXX figure out caching of statement and database objects... later
(define* (sqlite-register #:key db-file path (references '())
deriver hash nar-size)
deriver hash nar-size
(schema (sql-schema)))
"Registers this stuff in a database specified by DB-FILE. PATH is the string
path of some store item, REFERENCES is a list of string paths which the store
item PATH refers to (they need to be already registered!), DERIVER is a string
@ -167,16 +168,17 @@ (define* (sqlite-register #:key db-file path (references '())
bytes of the store item denoted by PATH after being converted to nar form.
Every store item in REFERENCES must already be registered."
(with-database db-file db
(let ((id (update-or-insert db #:path path
#:deriver deriver
#:hash hash
#:nar-size nar-size
#:time (time-second (current-time time-utc)))))
;; Call 'path-id' on each of REFERENCES. This ensures we get a
;; "non-NULL constraint" failure if one of REFERENCES is unregistered.
(add-references db id
(map (cut path-id db <>) references)))))
(parameterize ((sql-schema schema))
(with-database db-file db
(let ((id (update-or-insert db #:path path
#:deriver deriver
#:hash hash
#:nar-size nar-size
#:time (time-second (current-time time-utc)))))
;; Call 'path-id' on each of REFERENCES. This ensures we get a
;; "non-NULL constraint" failure if one of REFERENCES is unregistered.
(add-references db id
(map (cut path-id db <>) references))))))
;;;
@ -221,7 +223,8 @@ (define (reset-timestamps file)
(define* (register-path path
#:key (references '()) deriver prefix
state-directory (deduplicate? #t))
state-directory (deduplicate? #t)
(schema (sql-schema)))
;; Priority for options: first what is given, then environment variables,
;; then defaults. %state-directory, %store-directory, and
;; %store-database-directory already handle the "environment variables /
@ -267,6 +270,7 @@ (define* (register-path path
(reset-timestamps real-path)
(sqlite-register
#:db-file (string-append db-dir "/db.sqlite")
#:schema schema
#:path to-register
#:references references
#:deriver deriver