@@ -115,8 +115,10 @@ pub struct Release {
115
115
impl CrateDetails {
116
116
pub fn new ( conn : & Connection , name : & str , version : & str ) -> Option < CrateDetails > {
117
117
// 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,
120
122
crates.name,
121
123
releases.version,
122
124
releases.description,
@@ -132,7 +134,7 @@ impl CrateDetails {
132
134
releases.keywords,
133
135
releases.have_examples,
134
136
releases.target_name,
135
- crates.versions,
137
+ ARRAY(SELECT releases.version FROM releases WHERE releases.crate_id = crates.id) AS versions,
136
138
crates.github_stars,
137
139
crates.github_forks,
138
140
crates.github_issues,
@@ -142,59 +144,48 @@ impl CrateDetails {
142
144
releases.license,
143
145
releases.documentation_url,
144
146
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;" ;
148
150
149
151
let rows = conn. query ( query, & [ & name, & version] ) . unwrap ( ) ;
150
152
151
- if rows. is_empty ( ) {
153
+ let krate = if rows. is_empty ( ) {
152
154
return None ;
153
- }
155
+ } else {
156
+ rows. get ( 0 )
157
+ } ;
154
158
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" ) ;
157
161
158
162
// sort versions with semver
159
163
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 ( )
185
176
} ;
186
177
187
178
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" ) ,
194
185
} ;
195
186
196
187
let doc_targets = {
197
- let data: Value = rows . get ( 0 ) . get ( 23 ) ;
188
+ let data: Value = krate . get ( "doc_targets" ) ;
198
189
data. as_array ( )
199
190
. map ( |array| {
200
191
array
@@ -206,35 +197,35 @@ impl CrateDetails {
206
197
} ;
207
198
208
199
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" ) ,
212
203
authors : Vec :: new ( ) ,
213
204
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" ) ,
220
211
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" ) ,
227
218
releases,
228
219
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" ) ,
232
223
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" ) ,
235
226
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" ) ,
238
229
} ;
239
230
240
231
if let Some ( repository_url) = crate_details. repository_url . clone ( ) {
@@ -255,7 +246,7 @@ impl CrateDetails {
255
246
256
247
crate_details. authors = authors
257
248
. into_iter ( )
258
- . map ( |row| ( row. get ( 0 ) , row. get ( 1 ) ) )
249
+ . map ( |row| ( row. get ( "name" ) , row. get ( "slug" ) ) )
259
250
. collect ( ) ;
260
251
261
252
// get owners
@@ -271,7 +262,7 @@ impl CrateDetails {
271
262
272
263
crate_details. owners = owners
273
264
. into_iter ( )
274
- . map ( |row| ( row. get ( 0 ) , row. get ( 1 ) ) )
265
+ . map ( |row| ( row. get ( "login" ) , row. get ( "avatar" ) ) )
275
266
. collect ( ) ;
276
267
277
268
if !crate_details. build_status {
0 commit comments