aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service/model
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2025-03-09 13:11:02 +0000
committerChristopher Baines <mail@cbaines.net>2025-03-10 06:30:43 +0000
commitedeb89e0cfca43269c9ae7f50e097c0f58f4e42f (patch)
treeebcf495bc1c03429fe2639100a6a6676312ef740 /guix-data-service/model
parent5684add77edd120ed640368d9795fbea7ea5a9ea (diff)
downloaddata-service-edeb89e0cfca43269c9ae7f50e097c0f58f4e42f.tar
data-service-edeb89e0cfca43269c9ae7f50e097c0f58f4e42f.tar.gz
Revert "Optimise inserting derivation inputs"
I'm concerned that this approach is more error prone and won't error if there are issues with the data in the database. This reverts commit 3081887b90d09a6d5cf82e7292087362f30fc311.
Diffstat (limited to 'guix-data-service/model')
-rw-r--r--guix-data-service/model/derivation.scm92
1 files changed, 52 insertions, 40 deletions
diff --git a/guix-data-service/model/derivation.scm b/guix-data-service/model/derivation.scm
index 37e0622..4660a4c 100644
--- a/guix-data-service/model/derivation.scm
+++ b/guix-data-service/model/derivation.scm
@@ -1105,6 +1105,25 @@ ON CONFLICT DO NOTHING"
(vector->list (json-string->scm env_vars)))
system))))
+(define select-derivation-output-id
+ (mlambda (conn name path)
+ (match (exec-query
+ conn
+ "
+SELECT derivation_outputs.id FROM derivation_outputs
+INNER JOIN derivations
+ ON derivation_outputs.derivation_id = derivations.id
+WHERE derivations.file_name = $1
+ AND derivation_outputs.name = $2"
+ (list path
+ name))
+ (((id))
+ id)
+ (()
+ (error (simple-format
+ #f "cannot find derivation-output with name ~A and path ~A"
+ name path))))))
+
(define (select-derivation-outputs-by-derivation-id conn id)
(define query
(string-append
@@ -1377,49 +1396,42 @@ WHERE derivation_source_files.store_path = $1"
#f)))
(define (insert-derivation-inputs conn derivation-ids derivations)
- (let ((query-parts
- (append-map!
- (lambda (derivation-id derivation)
- (append-map!
- (match-lambda
- (($ <derivation-input> derivation-or-path sub-derivations)
- (let ((path
- (match derivation-or-path
- ((? derivation? d)
- ;; The first field changed to a derivation (from the file
- ;; name) in 5cf4b26d52bcea382d98fb4becce89be9ee37b55
- (derivation-file-name d))
- ((? string? s)
- s))))
- (map (lambda (sub-derivation)
- (string-append "("
- (number->string derivation-id)
- ", '" path
- "', '" sub-derivation "')"))
- sub-derivations))))
- (derivation-inputs derivation)))
- (vector->list derivation-ids)
- (vector->list derivations))))
-
- (chunk-for-each!
- (lambda (query-parts-chunk)
+ (define (insert-into-derivation-inputs derivation-id output-ids)
+ (for-each
+ (lambda (output-id)
(exec-query
conn
- (string-append
- "
+ "
INSERT INTO derivation_inputs (derivation_id, derivation_output_id)
-SELECT vals.derivation_id, derivation_outputs.id
-FROM (VALUES "
- (string-join query-parts-chunk ", ")
- ") AS vals (derivation_id, file_name, output_name)
-INNER JOIN derivations
- ON derivations.file_name = vals.file_name
-INNER JOIN derivation_outputs
- ON derivation_outputs.derivation_id = derivations.id
- AND vals.output_name = derivation_outputs.name
-ON CONFLICT DO NOTHING")))
- 1000
- query-parts)))
+VALUES ($1, $2);"
+ (list (number->string derivation-id) output-id)))
+ output-ids))
+
+ (vector-for-each
+ (lambda (i derivation-id derivation)
+ (let ((inputs (derivation-inputs derivation)))
+ (unless (null? inputs)
+ (insert-into-derivation-inputs
+ derivation-id
+ (append-map!
+ (match-lambda
+ (($ <derivation-input> derivation-or-path sub-derivations)
+ (let ((path
+ (match derivation-or-path
+ ((? derivation? d)
+ ;; The first field changed to a derivation (from the file
+ ;; name) in 5cf4b26d52bcea382d98fb4becce89be9ee37b55
+ (derivation-file-name d))
+ ((? string? s)
+ s))))
+ (map (lambda (sub-derivation)
+ (select-derivation-output-id conn
+ sub-derivation
+ path))
+ sub-derivations))))
+ inputs)))))
+ derivation-ids
+ derivations))
(define (insert-derivation-sources conn derivation-id sources)
(define (insert-into-derivation-sources derivation-source-file-ids)