@@ -115,8 +115,10 @@ pub struct Release {
115115impl CrateDetails {
116116 pub fn new ( conn : & Connection , name : & str , version : & str ) -> Option < CrateDetails > {
117117 // get all stuff, I love you rustfmt
118- let query = "SELECT crates.id,
119- releases.id,
118+ let query = "
119+ SELECT
120+ crates.id AS crate_id,
121+ releases.id AS release_id,
120122 crates.name,
121123 releases.version,
122124 releases.description,
@@ -132,7 +134,7 @@ impl CrateDetails {
132134 releases.keywords,
133135 releases.have_examples,
134136 releases.target_name,
135- crates.versions,
137+ ARRAY(SELECT releases.version FROM releases WHERE releases.crate_id = crates.id) AS versions,
136138 crates.github_stars,
137139 crates.github_forks,
138140 crates.github_issues,
@@ -142,59 +144,48 @@ impl CrateDetails {
142144 releases.license,
143145 releases.documentation_url,
144146 releases.default_target
145- FROM releases
146- INNER JOIN crates ON releases.crate_id = crates.id
147- WHERE crates.name = $1 AND releases.version = $2;" ;
147+ FROM releases
148+ INNER JOIN crates ON releases.crate_id = crates.id
149+ WHERE crates.name = $1 AND releases.version = $2;" ;
148150
149151 let rows = conn. query ( query, & [ & name, & version] ) . unwrap ( ) ;
150152
151- if rows. is_empty ( ) {
153+ let krate = if rows. is_empty ( ) {
152154 return None ;
153- }
155+ } else {
156+ rows. get ( 0 )
157+ } ;
154158
155- let crate_id: i32 = rows . get ( 0 ) . get ( 0 ) ;
156- let release_id: i32 = rows . get ( 0 ) . get ( 1 ) ;
159+ let crate_id: i32 = krate . get ( "crate_id" ) ;
160+ let release_id: i32 = krate . get ( "release_id" ) ;
157161
158162 // sort versions with semver
159163 let releases = {
160- let versions_from_db: Value = rows. get ( 0 ) . get ( 17 ) ;
161-
162- if let Some ( versions_from_db) = versions_from_db. as_array ( ) {
163- let mut versions: Vec < semver:: Version > = versions_from_db
164- . iter ( )
165- . filter_map ( |version| {
166- if let Some ( version) = version. as_str ( ) {
167- if let Ok ( sem_ver) = semver:: Version :: parse ( & version) {
168- return Some ( sem_ver) ;
169- }
170- }
171-
172- None
173- } )
174- . collect ( ) ;
175-
176- versions. sort ( ) ;
177- versions. reverse ( ) ;
178- versions
179- . iter ( )
180- . map ( |version| map_to_release ( & conn, crate_id, version. to_string ( ) ) )
181- . collect ( )
182- } else {
183- Vec :: new ( )
184- }
164+ let versions: Vec < String > = krate. get ( "versions" ) ;
165+ let mut versions: Vec < semver:: Version > = versions
166+ . iter ( )
167+ . filter_map ( |version| semver:: Version :: parse ( & version) . ok ( ) )
168+ . collect ( ) ;
169+
170+ versions. sort ( ) ;
171+ versions. reverse ( ) ;
172+ versions
173+ . iter ( )
174+ . map ( |version| map_to_release ( & conn, crate_id, version. to_string ( ) ) )
175+ . collect ( )
185176 } ;
186177
187178 let metadata = MetaData {
188- name : rows . get ( 0 ) . get ( 2 ) ,
189- version : rows . get ( 0 ) . get ( 3 ) ,
190- description : rows . get ( 0 ) . get ( 4 ) ,
191- rustdoc_status : rows . get ( 0 ) . get ( 11 ) ,
192- target_name : rows . get ( 0 ) . get ( 16 ) ,
193- default_target : rows . get ( 0 ) . get ( 26 ) ,
179+ name : krate . get ( "name" ) ,
180+ version : krate . get ( "version" ) ,
181+ description : krate . get ( "description" ) ,
182+ rustdoc_status : krate . get ( "rustdoc_status" ) ,
183+ target_name : krate . get ( "target_name" ) ,
184+ default_target : krate . get ( "default_target" ) ,
194185 } ;
195186
196187 let doc_targets = {
197- let data: Value = rows . get ( 0 ) . get ( 23 ) ;
188+ let data: Value = krate . get ( "doc_targets" ) ;
198189 data. as_array ( )
199190 . map ( |array| {
200191 array
@@ -206,35 +197,35 @@ impl CrateDetails {
206197 } ;
207198
208199 let mut crate_details = CrateDetails {
209- name : rows . get ( 0 ) . get ( 2 ) ,
210- version : rows . get ( 0 ) . get ( 3 ) ,
211- description : rows . get ( 0 ) . get ( 4 ) ,
200+ name : krate . get ( "name" ) ,
201+ version : krate . get ( "version" ) ,
202+ description : krate . get ( "description" ) ,
212203 authors : Vec :: new ( ) ,
213204 owners : Vec :: new ( ) ,
214- authors_json : rows . get ( 0 ) . get ( 5 ) ,
215- dependencies : rows . get ( 0 ) . get ( 6 ) ,
216- readme : rows . get ( 0 ) . get ( 7 ) ,
217- rustdoc : rows . get ( 0 ) . get ( 8 ) ,
218- release_time : rows . get ( 0 ) . get ( 9 ) ,
219- build_status : rows . get ( 0 ) . get ( 10 ) ,
205+ authors_json : krate . get ( "authors" ) ,
206+ dependencies : krate . get ( "dependencies" ) ,
207+ readme : krate . get ( "readme" ) ,
208+ rustdoc : krate . get ( "description_long" ) ,
209+ release_time : krate . get ( "release_time" ) ,
210+ build_status : krate . get ( "build_status" ) ,
220211 last_successful_build : None ,
221- rustdoc_status : rows . get ( 0 ) . get ( 11 ) ,
222- repository_url : rows . get ( 0 ) . get ( 12 ) ,
223- homepage_url : rows . get ( 0 ) . get ( 13 ) ,
224- keywords : rows . get ( 0 ) . get ( 14 ) ,
225- have_examples : rows . get ( 0 ) . get ( 15 ) ,
226- target_name : rows . get ( 0 ) . get ( 16 ) ,
212+ rustdoc_status : krate . get ( "rustdoc_status" ) ,
213+ repository_url : krate . get ( "repository_url" ) ,
214+ homepage_url : krate . get ( "homepage_url" ) ,
215+ keywords : krate . get ( "keywords" ) ,
216+ have_examples : krate . get ( "have_examples" ) ,
217+ target_name : krate . get ( "target_name" ) ,
227218 releases,
228219 github : false ,
229- github_stars : rows . get ( 0 ) . get ( 18 ) ,
230- github_forks : rows . get ( 0 ) . get ( 19 ) ,
231- github_issues : rows . get ( 0 ) . get ( 20 ) ,
220+ github_stars : krate . get ( "github_stars" ) ,
221+ github_forks : krate . get ( "github_forks" ) ,
222+ github_issues : krate . get ( "github_issues" ) ,
232223 metadata,
233- is_library : rows . get ( 0 ) . get ( 21 ) ,
234- yanked : rows . get ( 0 ) . get ( 22 ) ,
224+ is_library : krate . get ( "is_library" ) ,
225+ yanked : krate . get ( "yanked" ) ,
235226 doc_targets,
236- license : rows . get ( 0 ) . get ( 24 ) ,
237- documentation_url : rows . get ( 0 ) . get ( 25 ) ,
227+ license : krate . get ( "license" ) ,
228+ documentation_url : krate . get ( "documentation_url" ) ,
238229 } ;
239230
240231 if let Some ( repository_url) = crate_details. repository_url . clone ( ) {
@@ -255,7 +246,7 @@ impl CrateDetails {
255246
256247 crate_details. authors = authors
257248 . into_iter ( )
258- . map ( |row| ( row. get ( 0 ) , row. get ( 1 ) ) )
249+ . map ( |row| ( row. get ( "name" ) , row. get ( "slug" ) ) )
259250 . collect ( ) ;
260251
261252 // get owners
@@ -271,7 +262,7 @@ impl CrateDetails {
271262
272263 crate_details. owners = owners
273264 . into_iter ( )
274- . map ( |row| ( row. get ( 0 ) , row. get ( 1 ) ) )
265+ . map ( |row| ( row. get ( "login" ) , row. get ( "avatar" ) ) )
275266 . collect ( ) ;
276267
277268 if !crate_details. build_status {
0 commit comments