11use anyhow:: { Context , anyhow} ;
2- use sqlx:: { Executor , Row } ;
2+ use sqlx:: { Executor , Row , any :: AnyRow } ;
33use std:: io:: BufReader ;
44
55/// implement to that we can explicitly state what we want
@@ -97,14 +97,16 @@ impl Scenario {
9797
9898 let loader = Loader :: new ( db) ;
9999
100- let large_sbom = Some ( loader. large_sbom ( ) . await ?) ;
100+ let large_sbom = loader. large_sbom ( ) . await ?;
101+ let large_sbom_id = Some ( large_sbom. 0 ) ;
102+ let large_sbom_digest = Some ( large_sbom. 1 ) ;
101103 let max_vuln = Some ( loader. max_vuln ( ) . await ?) ;
102104
103105 Ok ( Self {
104- get_sbom : large_sbom . clone ( ) ,
105- get_sbom_advisories : large_sbom . clone ( ) ,
106- get_sbom_related : large_sbom . clone ( ) ,
107- get_sbom_packages : large_sbom ,
106+ get_sbom : large_sbom_digest . clone ( ) ,
107+ get_sbom_advisories : large_sbom_digest . clone ( ) ,
108+ get_sbom_related : large_sbom_id . clone ( ) ,
109+ get_sbom_packages : large_sbom_id . clone ( ) ,
108110
109111 get_vulnerability : max_vuln,
110112 } )
@@ -121,42 +123,52 @@ impl Loader {
121123 }
122124
123125 async fn find ( & self , sql : & str ) -> anyhow:: Result < String > {
126+ Ok ( self . find_row ( sql) . await ?. get ( "result" ) )
127+ }
128+
129+ async fn find_row ( & self , sql : & str ) -> anyhow:: Result < AnyRow > {
124130 let mut db = crate :: db:: connect ( & self . db ) . await ?;
125131
126- // get the largest SBOM in the database
127- let row = db
128- . fetch_optional ( sql)
132+ db. fetch_optional ( sql)
129133 . await ?
130- . ok_or_else ( || anyhow ! ( "nothing found" ) ) ?;
131-
132- Ok ( row. get ( "result" ) )
134+ . ok_or_else ( || anyhow ! ( "nothing found" ) )
133135 }
134136
135137 /// get the SHA256 of the largest SBOM (by number of packages)
136- pub async fn large_sbom ( & self ) -> anyhow:: Result < String > {
138+ pub async fn large_sbom ( & self ) -> anyhow:: Result < ( String , String ) > {
137139 // get the largest SBOM in the database
138- self . find (
139- r#"
140- select concat('sha256:', c.sha256) as result,
141- count(b.node_id) as num
140+ let row = self
141+ . find_row (
142+ r#"
143+ select
144+ b.sbom_id::text as id,
145+ concat('sha256:', c.sha256) as sha,
146+ count(b.node_id) as num
142147from sbom a
143- join sbom_node b on a.sbom_id = b.sbom_id
144- join source_document c on a.source_document_id = c.id
145- group by c.sha256
146- order by num desc
148+ join sbom_node b on a.sbom_id = b.sbom_id
149+ join source_document c on a.source_document_id = c.id
150+ group by
151+ b.sbom_id,
152+ c.sha256
153+ order by
154+ num desc
147155limit 1
148156"# ,
149- )
150- . await
157+ )
158+ . await ?;
159+
160+ Ok ( ( row. get ( "id" ) , row. get ( "sha" ) ) )
151161 }
152162
153163 /// A vulnerability, referenced by a lot of advisories
154164 pub async fn max_vuln ( & self ) -> anyhow:: Result < String > {
155165 self . find (
156166 r#"
157- select a.id as result
167+ select
168+ a.id as result,
169+ count(b.vulnerability_id) as num
158170from vulnerability a
159- join advisory_vulnerability b on a.id = b.vulnerability_id
171+ join advisory_vulnerability b on a.id = b.vulnerability_id
160172group by
161173 a.id
162174order by num desc
0 commit comments