diff options
author | Christopher Baines <mail@cbaines.net> | 2025-03-09 13:11:02 +0000 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2025-03-10 06:30:43 +0000 |
commit | edeb89e0cfca43269c9ae7f50e097c0f58f4e42f (patch) | |
tree | ebcf495bc1c03429fe2639100a6a6676312ef740 /guix-data-service/model | |
parent | 5684add77edd120ed640368d9795fbea7ea5a9ea (diff) | |
download | data-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.scm | 92 |
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) |