diff options
author | Christopher Baines <mail@cbaines.net> | 2023-08-10 11:01:42 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2023-08-10 11:01:42 +0100 |
commit | f20372302f0361d64a7d44a7bf988e20d9ebf3f4 (patch) | |
tree | 2f8a7762080cfb362b0e5a99b478726e496944bf /guix-build-coordinator/datastore/sqlite.scm | |
parent | 15a5f5c39b398e6d01cc8112e2016fcf1313bc42 (diff) | |
download | build-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/sqlite.scm')
-rw-r--r-- | guix-build-coordinator/datastore/sqlite.scm | 42 |
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 |