aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/datastore/sqlite.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix-build-coordinator/datastore/sqlite.scm')
-rw-r--r--guix-build-coordinator/datastore/sqlite.scm139
1 files changed, 92 insertions, 47 deletions
diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm
index 0bcde1e..7e70718 100644
--- a/guix-build-coordinator/datastore/sqlite.scm
+++ b/guix-build-coordinator/datastore/sqlite.scm
@@ -752,7 +752,8 @@ WHERE related_derivations.id != :derivation_id
ON other_derivation_derivation_outputs.derivation_id =
other_derivations.id
INNER JOIN derivation_outputs
- ON derivation_outputs.output = other_derivation_derivation_outputs.output
+ ON derivation_outputs.output_id =
+ other_derivation_derivation_outputs.output_id
WHERE derivation_outputs.derivation_id = related_derivations.id
AND other_derivations.system = derivations.system
AND builds.canceled = 0
@@ -836,7 +837,7 @@ FROM (
SELECT 1
FROM derivation_outputs
INNER JOIN derivation_outputs AS other_build_derivation_outputs
- ON derivation_outputs.output = other_build_derivation_outputs.output
+ ON derivation_outputs.output_id = other_build_derivation_outputs.output_id
INNER JOIN builds AS other_builds
ON other_build_derivation_outputs.derivation_id = other_builds.derivation_id
INNER JOIN build_results AS other_build_results
@@ -1105,8 +1106,8 @@ WHERE id = " (number->string (db-find-build-id db build-uuid))))))
db
"
DELETE FROM unbuilt_outputs
-WHERE output IN (
- SELECT derivation_outputs.output
+WHERE output_id IN (
+ SELECT derivation_outputs.output_id
FROM derivation_outputs
INNER JOIN builds
ON builds.derivation_id = derivation_outputs.derivation_id
@@ -1796,12 +1797,12 @@ INNER JOIN derivation_outputs
ON builds.derivation_id = derivation_outputs.derivation_id
LEFT JOIN build_results
ON builds.id = build_results.build_id
-WHERE derivation_outputs.output = :output"
+WHERE derivation_outputs.output_id = :output_id"
#:cache? #t)))
(sqlite-bind-arguments
statement
- #:output output)
+ #:output_id (db-output->output-id db output))
(let ((result
(sqlite-map
@@ -1844,7 +1845,7 @@ INNER JOIN derivation_outputs
ON builds.derivation_id = derivation_outputs.derivation_id
INNER JOIN derivations
ON builds.derivation_id = derivations.id
-WHERE derivation_outputs.output = :output
+WHERE derivation_outputs.output_id = :output_id
AND derivations.system = :system"
(if include-canceled?
""
@@ -1854,7 +1855,7 @@ WHERE derivation_outputs.output = :output
(sqlite-bind-arguments
statement
- #:output output
+ #:output_id (db-output->output-id db output)
#:system system)
(let ((result
@@ -2149,7 +2150,7 @@ AND NOT EXISTS (
INNER JOIN derivation_outputs
ON derivation_inputs.derivation_output_id = derivation_outputs.id
INNER JOIN unbuilt_outputs
- ON unbuilt_outputs.output = derivation_outputs.output
+ ON unbuilt_outputs.output_id = derivation_outputs.output_id
WHERE builds.derivation_id = derivation_inputs.derivation_id
)
EXCEPT
@@ -2199,7 +2200,7 @@ UNION
ON builds_with_derived_priority.derivation_id =
derivation_outputs.derivation_id
INNER JOIN derivation_outputs AS all_derivation_outputs
- ON all_derivation_outputs.output = derivation_outputs.output
+ ON all_derivation_outputs.output_id = derivation_outputs.output_id
INNER JOIN derivation_inputs
ON derivation_inputs.derivation_output_id = all_derivation_outputs.id
INNER JOIN builds
@@ -2568,8 +2569,8 @@ INNER JOIN derivation_outputs AS allocated_builds_derivation_outputs
ON allocated_build_details.derivation_id =
allocated_builds_derivation_outputs.derivation_id
WHERE build_derivation_outputs.derivation_id = :derivation_id
- AND build_derivation_outputs.output =
- allocated_builds_derivation_outputs.output"
+ AND build_derivation_outputs.output_id =
+ allocated_builds_derivation_outputs.output_id"
#:cache? #t)))
(sqlite-bind-arguments
@@ -2955,8 +2956,9 @@ WHERE name = :name"
(sqlite-prepare
db
"
-SELECT name, output
+SELECT name, outputs.output
FROM derivation_outputs
+INNER JOIN outputs ON derivation_outputs.output_id = outputs.id
WHERE derivation_id = :derivation_id"
#:cache? #t)))
@@ -2985,10 +2987,10 @@ WHERE derivation_id = :derivation_id"
(sqlite-prepare
db
"
-SELECT derivation_outputs.name, derivation_outputs.output
+SELECT derivation_outputs.name, derivation_outputs.output_id
FROM derivation_outputs
INNER JOIN unbuilt_outputs
- ON derivation_outputs.output = unbuilt_outputs.output
+ ON derivation_outputs.output_id = unbuilt_outputs.output_id
WHERE derivation_id = :derivation_id"
#:cache? #t)))
@@ -3085,7 +3087,8 @@ WHERE name = :name"
db
"
SELECT output_derivations.name,
- derivation_outputs.name, derivation_outputs.output
+ derivation_outputs.name,
+ outputs.output
FROM derivations
INNER JOIN derivation_inputs
ON derivation_inputs.derivation_id = derivations.id
@@ -3093,6 +3096,8 @@ INNER JOIN derivation_outputs
ON derivation_inputs.derivation_output_id = derivation_outputs.id
INNER JOIN derivations AS output_derivations
ON output_derivations.id = derivation_outputs.derivation_id
+INNER JOIN outputs
+ ON derivation_outputs.output_id = outputs.id
WHERE derivations.id = :derivation_id"
#:cache? #t)))
@@ -3238,6 +3243,39 @@ INSERT INTO derivation_inputs (derivation_id, derivation_output_id) VALUES "
", ")
";")))))
+(define (db-insert-output db output)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+INSERT INTO outputs (output) VALUES (:output)"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments statement #:output output)
+
+ (sqlite-step statement)
+ (let ((id (last-insert-rowid db)))
+ (sqlite-reset statement)
+
+ id)))
+
+(define (db-output->output-id db output)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+SELECT id FROM outputs WHERE output = :output"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments statement #:output output)
+
+ (match (sqlite-step statement)
+ (#f #f)
+ (#(id)
+ (sqlite-reset statement)
+
+ id)))
+
(define (insert-derivation-outputs db derivation-name derivation-outputs)
(define output-has-successful-build?
(let ((statement
@@ -3250,12 +3288,12 @@ INNER JOIN builds
ON builds.derivation_id = derivation_outputs.derivation_id
INNER JOIN build_results
ON builds.id = build_results.build_id
-WHERE derivation_outputs.output = :output"
+WHERE derivation_outputs.output_id = :output_id"
#:cache? #t)))
- (lambda (output)
+ (lambda (output-id)
(sqlite-bind-arguments statement
- #:output output)
+ #:output_id output-id)
(let* ((build-results
(sqlite-map (match-lambda
@@ -3273,41 +3311,48 @@ WHERE derivation_outputs.output = :output"
(sqlite-prepare
db
"
-INSERT OR IGNORE INTO unbuilt_outputs (output) VALUES (:output)"
+INSERT OR IGNORE INTO unbuilt_outputs (output_id) VALUES (:output_id)"
#:cache? #t)))
- (lambda (output)
+ (lambda (output-id)
(sqlite-bind-arguments statement
- #:output output)
+ #:output_id output-id)
(sqlite-step statement)
(sqlite-reset statement)
#t)))
- (sqlite-exec
- db
- (string-append
- "
-INSERT INTO derivation_outputs (derivation_id, name, output) VALUES "
- (string-join
- (map (match-lambda
- ((name . derivation-output)
- (simple-format
- #f
- "('~A', '~A', '~A')"
- (db-find-derivation-id db derivation-name)
- name
- (derivation-output-path derivation-output))))
- derivation-outputs)
- ", ")
- ";"))
-
- (for-each (lambda (output)
- (unless (output-has-successful-build? output)
- (insert-into-unbuilt-outputs output)))
- (map (match-lambda
- ((_ . derivation-output)
- (derivation-output-path derivation-output)))
- derivation-outputs))
+ (let ((derivation-outputs-with-ids
+ (map (match-lambda
+ ((name . derivation-output)
+ (let ((output
+ (derivation-output-path derivation-output)))
+ (cons name
+ (or
+ (db-output->output-id db output)
+ (db-insert-output db output))))))
+ derivation-outputs)))
+ (sqlite-exec
+ db
+ (string-append
+ "
+INSERT INTO derivation_outputs (derivation_id, name, output_id) VALUES "
+ (string-join
+ (map (match-lambda
+ ((name . output-id)
+ (simple-format
+ #f
+ "('~A', '~A', ~A)"
+ (db-find-derivation-id db derivation-name)
+ name
+ output-id)))
+ derivation-outputs-with-ids)
+ ", ")
+ ";"))
+
+ (for-each (lambda (output-id)
+ (unless (output-has-successful-build? output-id)
+ (insert-into-unbuilt-outputs output-id)))
+ (map cdr derivation-outputs-with-ids)))
#t)
(define-method (datastore-insert-build