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
1 changed files with 17 additions and 13 deletions

View File

@ -88,7 +88,7 @@ If FILE doesn't exist, create it and initialize it as a new database."
;; XXX: (sqlite3) currently lacks bindings for 'sqlite3_last_insert_rowid'. ;; XXX: (sqlite3) currently lacks bindings for 'sqlite3_last_insert_rowid'.
;; Work around that. ;; Work around that.
(let* ((stmt (sqlite-prepare db "SELECT last_insert_rowid();" (let* ((stmt (sqlite-prepare db "SELECT last_insert_rowid();"
#:cache? #t)) #:cache? #t))
(result (sqlite-fold cons '() stmt))) (result (sqlite-fold cons '() stmt)))
(sqlite-finalize stmt) (sqlite-finalize stmt)
(match result (match result
@ -157,7 +157,8 @@ ids of items referred to."
;; XXX figure out caching of statement and database objects... later ;; XXX figure out caching of statement and database objects... later
(define* (sqlite-register #:key db-file path (references '()) (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 "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 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 item PATH refers to (they need to be already registered!), DERIVER is a string
@ -167,16 +168,17 @@ base16-encoded sha256 hash of the store item denoted by PATH (prefixed with
bytes of the store item denoted by PATH after being converted to nar form. bytes of the store item denoted by PATH after being converted to nar form.
Every store item in REFERENCES must already be registered." Every store item in REFERENCES must already be registered."
(with-database db-file db (parameterize ((sql-schema schema))
(let ((id (update-or-insert db #:path path (with-database db-file db
#:deriver deriver (let ((id (update-or-insert db #:path path
#:hash hash #:deriver deriver
#:nar-size nar-size #:hash hash
#:time (time-second (current-time time-utc))))) #:nar-size nar-size
;; Call 'path-id' on each of REFERENCES. This ensures we get a #:time (time-second (current-time time-utc)))))
;; "non-NULL constraint" failure if one of REFERENCES is unregistered. ;; Call 'path-id' on each of REFERENCES. This ensures we get a
(add-references db id ;; "non-NULL constraint" failure if one of REFERENCES is unregistered.
(map (cut path-id db <>) references))))) (add-references db id
(map (cut path-id db <>) references))))))
;;; ;;;
@ -221,7 +223,8 @@ it's a directory."
(define* (register-path path (define* (register-path path
#:key (references '()) deriver prefix #: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, ;; Priority for options: first what is given, then environment variables,
;; then defaults. %state-directory, %store-directory, and ;; then defaults. %state-directory, %store-directory, and
;; %store-database-directory already handle the "environment variables / ;; %store-database-directory already handle the "environment variables /
@ -267,6 +270,7 @@ be used internally by the daemon's build hook."
(reset-timestamps real-path) (reset-timestamps real-path)
(sqlite-register (sqlite-register
#:db-file (string-append db-dir "/db.sqlite") #:db-file (string-append db-dir "/db.sqlite")
#:schema schema
#:path to-register #:path to-register
#:references references #:references references
#:deriver deriver #:deriver deriver