aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/datastore
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2023-08-10 11:01:42 +0100
committerChristopher Baines <mail@cbaines.net>2023-08-10 11:01:42 +0100
commitf20372302f0361d64a7d44a7bf988e20d9ebf3f4 (patch)
tree2f8a7762080cfb362b0e5a99b478726e496944bf /guix-build-coordinator/datastore
parent15a5f5c39b398e6d01cc8112e2016fcf1313bc42 (diff)
downloadbuild-coordinator-f20372302f0361d64a7d44a7bf988e20d9ebf3f4.tar
build-coordinator-f20372302f0361d64a7d44a7bf988e20d9ebf3f4.tar.gz
Switch to a more rigorous method for finding potential source refs
Diffstat (limited to 'guix-build-coordinator/datastore')
-rw-r--r--guix-build-coordinator/datastore/sqlite.scm42
1 files changed, 42 insertions, 0 deletions
diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm
index bc086fb..054ad96 100644
--- a/guix-build-coordinator/datastore/sqlite.scm
+++ b/guix-build-coordinator/datastore/sqlite.scm
@@ -74,6 +74,7 @@
datastore-find-derivation
datastore-find-derivation-system
datastore-find-derivation-inputs
+ datastore-find-recursive-derivation-input-outputs
datastore-find-derivation-for-output
datastore-find-derivation-outputs
datastore-find-derivation-output-details
@@ -3972,6 +3973,47 @@ WHERE derivations.id = :derivation_id"
result)))))
+(define-method (datastore-find-recursive-derivation-input-outputs
+ (datastore <sqlite-datastore>)
+ derivation-name)
+ (call-with-worker-thread
+ (slot-ref datastore 'worker-reader-thread-channel)
+ (lambda (db)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+WITH RECURSIVE related_derivations(id) AS (
+ VALUES(:derivation_id)
+UNION
+ SELECT derivation_outputs.derivation_id
+ FROM related_derivations
+ INNER JOIN derivation_inputs
+ ON related_derivations.id = derivation_inputs.derivation_id
+ INNER JOIN derivation_outputs
+ ON derivation_inputs.derivation_output_id = derivation_outputs.id
+)
+SELECT outputs.output
+FROM related_derivations
+INNER JOIN derivation_outputs
+ ON related_derivations.id = derivation_outputs.derivation_id
+INNER JOIN outputs
+ ON derivation_outputs.output_id = outputs.id"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments
+ statement
+ #:derivation_id (db-find-derivation-id db derivation-name))
+
+ (let ((result
+ (sqlite-map
+ (match-lambda
+ (#(output) output))
+ statement)))
+ (sqlite-reset statement)
+
+ result)))))
+
(define-method (datastore-find-derivation-for-output
(datastore <sqlite-datastore>)
start-derivation-name