@@ -24,6 +24,7 @@ struct CrateDetails {
24
24
version : String ,
25
25
description : Option < String > ,
26
26
authors : Vec < ( String , String ) > ,
27
+ owners : Vec < ( String , String ) > ,
27
28
authors_json : Option < Json > ,
28
29
dependencies : Option < Json > ,
29
30
readme : Option < String > ,
@@ -53,6 +54,7 @@ impl ToJson for CrateDetails {
53
54
m. insert ( "version" . to_string ( ) , self . version . to_json ( ) ) ;
54
55
m. insert ( "description" . to_string ( ) , self . description . to_json ( ) ) ;
55
56
m. insert ( "authors" . to_string ( ) , self . authors . to_json ( ) ) ;
57
+ m. insert ( "owners" . to_string ( ) , self . owners . to_json ( ) ) ;
56
58
m. insert ( "authors_json" . to_string ( ) , self . authors_json . to_json ( ) ) ;
57
59
m. insert ( "dependencies" . to_string ( ) , self . dependencies . to_json ( ) ) ;
58
60
if let Some ( ref readme) = self . readme {
@@ -86,7 +88,9 @@ impl CrateDetails {
86
88
fn new ( conn : & Connection , name : & str , version : & str ) -> Option < CrateDetails > {
87
89
88
90
// get all stuff, I love you rustfmt
89
- let query = "SELECT crates.name, \
91
+ let query = "SELECT crates.id, \
92
+ releases.id, \
93
+ crates.name, \
90
94
releases.version, \
91
95
releases.description, \
92
96
releases.authors, \
@@ -102,16 +106,12 @@ impl CrateDetails {
102
106
releases.have_examples, \
103
107
releases.target_name, \
104
108
crates.versions, \
105
- authors.name, \
106
- authors.slug, \
107
109
crates.github_stars, \
108
110
crates.github_forks, \
109
111
crates.github_issues, \
110
112
releases.is_library \
111
- FROM author_rels \
112
- LEFT OUTER JOIN authors ON authors.id = author_rels.aid \
113
- LEFT OUTER JOIN releases ON releases.id = author_rels.rid \
114
- LEFT OUTER JOIN crates ON crates.id = releases.crate_id \
113
+ FROM releases \
114
+ INNER JOIN crates ON releases.crate_id = crates.id \
115
115
WHERE crates.name = $1 AND releases.version = $2;";
116
116
117
117
let rows = conn. query ( query, & [ & name, & version] ) . unwrap ( ) ;
@@ -120,10 +120,13 @@ impl CrateDetails {
120
120
return None ;
121
121
}
122
122
123
+ let crate_id: i32 = rows. get ( 0 ) . get ( 0 ) ;
124
+ let release_id: i32 = rows. get ( 0 ) . get ( 1 ) ;
125
+
123
126
// sort versions with semver
124
127
let versions = {
125
128
let mut versions: Vec < semver:: Version > = Vec :: new ( ) ;
126
- let versions_from_db: Json = rows. get ( 0 ) . get ( 15 ) ;
129
+ let versions_from_db: Json = rows. get ( 0 ) . get ( 17 ) ;
127
130
128
131
versions_from_db. as_array ( ) . map ( |vers| {
129
132
for version in vers {
@@ -141,30 +144,31 @@ impl CrateDetails {
141
144
} ;
142
145
143
146
let metadata = MetaData {
144
- name : rows. get ( 0 ) . get ( 0 ) ,
145
- version : rows. get ( 0 ) . get ( 1 ) ,
146
- description : rows. get ( 0 ) . get ( 2 ) ,
147
- rustdoc_status : rows. get ( 0 ) . get ( 9 ) ,
148
- target_name : rows. get ( 0 ) . get ( 14 ) ,
147
+ name : rows. get ( 0 ) . get ( 2 ) ,
148
+ version : rows. get ( 0 ) . get ( 3 ) ,
149
+ description : rows. get ( 0 ) . get ( 4 ) ,
150
+ rustdoc_status : rows. get ( 0 ) . get ( 11 ) ,
151
+ target_name : rows. get ( 0 ) . get ( 16 ) ,
149
152
} ;
150
153
151
154
let mut crate_details = CrateDetails {
152
- name : rows. get ( 0 ) . get ( 0 ) ,
153
- version : rows. get ( 0 ) . get ( 1 ) ,
154
- description : rows. get ( 0 ) . get ( 2 ) ,
155
+ name : rows. get ( 0 ) . get ( 2 ) ,
156
+ version : rows. get ( 0 ) . get ( 3 ) ,
157
+ description : rows. get ( 0 ) . get ( 4 ) ,
155
158
authors : Vec :: new ( ) ,
156
- authors_json : rows. get ( 0 ) . get ( 3 ) ,
157
- dependencies : rows. get ( 0 ) . get ( 4 ) ,
158
- readme : rows. get ( 0 ) . get ( 5 ) ,
159
- rustdoc : rows. get ( 0 ) . get ( 6 ) ,
160
- release_time : rows. get ( 0 ) . get ( 7 ) ,
161
- build_status : rows. get ( 0 ) . get ( 8 ) ,
162
- rustdoc_status : rows. get ( 0 ) . get ( 9 ) ,
163
- repository_url : rows. get ( 0 ) . get ( 10 ) ,
164
- homepage_url : rows. get ( 0 ) . get ( 11 ) ,
165
- keywords : rows. get ( 0 ) . get ( 12 ) ,
166
- have_examples : rows. get ( 0 ) . get ( 13 ) ,
167
- target_name : rows. get ( 0 ) . get ( 14 ) ,
159
+ owners : Vec :: new ( ) ,
160
+ authors_json : rows. get ( 0 ) . get ( 5 ) ,
161
+ dependencies : rows. get ( 0 ) . get ( 6 ) ,
162
+ readme : rows. get ( 0 ) . get ( 7 ) ,
163
+ rustdoc : rows. get ( 0 ) . get ( 8 ) ,
164
+ release_time : rows. get ( 0 ) . get ( 9 ) ,
165
+ build_status : rows. get ( 0 ) . get ( 10 ) ,
166
+ rustdoc_status : rows. get ( 0 ) . get ( 11 ) ,
167
+ repository_url : rows. get ( 0 ) . get ( 12 ) ,
168
+ homepage_url : rows. get ( 0 ) . get ( 13 ) ,
169
+ keywords : rows. get ( 0 ) . get ( 14 ) ,
170
+ have_examples : rows. get ( 0 ) . get ( 15 ) ,
171
+ target_name : rows. get ( 0 ) . get ( 16 ) ,
168
172
versions : versions,
169
173
github : false ,
170
174
github_stars : rows. get ( 0 ) . get ( 18 ) ,
@@ -179,9 +183,20 @@ impl CrateDetails {
179
183
repository_url. starts_with ( "https://github.com" ) ;
180
184
}
181
185
182
- // Insert authors with name and slug
183
- for row in & rows {
184
- crate_details. authors . push ( ( row. get ( 16 ) , row. get ( 17 ) ) ) ;
186
+ // get authors
187
+ for row in & conn. query ( "SELECT name, slug
188
+ FROM authors
189
+ INNER JOIN author_rels ON author_rels.aid = authors.id
190
+ WHERE rid = $1" , & [ & release_id] ) . unwrap ( ) {
191
+ crate_details. authors . push ( ( row. get ( 0 ) , row. get ( 1 ) ) ) ;
192
+ }
193
+
194
+ // get owners
195
+ for row in & conn. query ( "SELECT login, avatar
196
+ FROM owners
197
+ INNER JOIN owner_rels ON owner_rels.oid = owners.id
198
+ WHERE cid = $1" , & [ & crate_id] ) . unwrap ( ) {
199
+ crate_details. owners . push ( ( row. get ( 0 ) , row. get ( 1 ) ) ) ;
185
200
}
186
201
187
202
Some ( crate_details)
0 commit comments