11
2- use Metadata ;
32use utils:: MetadataPackage ;
43use docbuilder:: BuildResult ;
54use regex:: Regex ;
@@ -9,6 +8,7 @@ use std::io::BufReader;
98use std:: path:: Path ;
109use std:: fs;
1110
11+ use time:: Timespec ;
1212use rustc_serialize:: json:: { Json , ToJson } ;
1313use slug:: slugify;
1414use reqwest:: Client ;
@@ -28,6 +28,8 @@ pub(crate) fn add_package_into_database(conn: &Connection,
2828 res : & BuildResult ,
2929 files : Option < Json > ,
3030 doc_targets : Vec < String > ,
31+ default_target : & Option < String > ,
32+ cratesio_data : & CratesIoData ,
3133 has_docs : bool ,
3234 has_examples : bool )
3335 -> Result < i32 > {
@@ -36,9 +38,7 @@ pub(crate) fn add_package_into_database(conn: &Connection,
3638 let dependencies = convert_dependencies ( metadata_pkg) ;
3739 let rustdoc = get_rustdoc ( metadata_pkg, source_dir) . unwrap_or ( None ) ;
3840 let readme = get_readme ( metadata_pkg, source_dir) . unwrap_or ( None ) ;
39- let ( release_time, yanked, downloads) = get_release_time_yanked_downloads ( metadata_pkg) ?;
4041 let is_library = metadata_pkg. is_library ( ) ;
41- let metadata = Metadata :: from_source_dir ( source_dir) ?;
4242
4343 let release_id: i32 = {
4444 let rows = conn. query ( "SELECT id FROM releases WHERE crate_id = $1 AND version = $2" ,
@@ -61,10 +61,10 @@ pub(crate) fn add_package_into_database(conn: &Connection,
6161 RETURNING id" ,
6262 & [ & crate_id,
6363 & metadata_pkg. version ,
64- & release_time,
64+ & cratesio_data . release_time ,
6565 & dependencies. to_json ( ) ,
6666 & metadata_pkg. package_name ( ) ,
67- & yanked,
67+ & cratesio_data . yanked ,
6868 & res. successful ,
6969 & has_docs,
7070 & false , // TODO: Add test status somehow
@@ -77,13 +77,13 @@ pub(crate) fn add_package_into_database(conn: &Connection,
7777 & metadata_pkg. authors . to_json ( ) ,
7878 & metadata_pkg. keywords . to_json ( ) ,
7979 & has_examples,
80- & downloads,
80+ & cratesio_data . downloads ,
8181 & files,
8282 & doc_targets. to_json ( ) ,
8383 & is_library,
8484 & res. rustc_version ,
8585 & metadata_pkg. documentation ,
86- & metadata . default_target ] ) ?;
86+ & default_target] ) ?;
8787 // return id
8888 rows. get ( 0 ) . get ( 0 )
8989
@@ -115,10 +115,10 @@ pub(crate) fn add_package_into_database(conn: &Connection,
115115 WHERE crate_id = $1 AND version = $2" ,
116116 & [ & crate_id,
117117 & format ! ( "{}" , metadata_pkg. version) ,
118- & release_time,
118+ & cratesio_data . release_time ,
119119 & dependencies. to_json ( ) ,
120120 & metadata_pkg. package_name ( ) ,
121- & yanked,
121+ & cratesio_data . yanked ,
122122 & res. successful ,
123123 & has_docs,
124124 & false , // TODO: Add test status somehow
@@ -131,21 +131,21 @@ pub(crate) fn add_package_into_database(conn: &Connection,
131131 & metadata_pkg. authors . to_json ( ) ,
132132 & metadata_pkg. keywords . to_json ( ) ,
133133 & has_examples,
134- & downloads,
134+ & cratesio_data . downloads ,
135135 & files,
136136 & doc_targets. to_json ( ) ,
137137 & is_library,
138138 & res. rustc_version ,
139139 & metadata_pkg. documentation ,
140- & metadata . default_target ] ) ?;
140+ & default_target] ) ?;
141141 rows. get ( 0 ) . get ( 0 )
142142 }
143143 } ;
144144
145145
146146 add_keywords_into_database ( & conn, & metadata_pkg, & release_id) ?;
147147 add_authors_into_database ( & conn, & metadata_pkg, & release_id) ?;
148- add_owners_into_database ( & conn, & metadata_pkg , & crate_id) ?;
148+ add_owners_into_database ( & conn, & cratesio_data . owners , & crate_id) ?;
149149
150150
151151 // Update versions
@@ -284,6 +284,27 @@ fn read_rust_doc(file_path: &Path) -> Result<Option<String>> {
284284}
285285
286286
287+ pub ( crate ) struct CratesIoData {
288+ pub ( crate ) release_time : Timespec ,
289+ pub ( crate ) yanked : bool ,
290+ pub ( crate ) downloads : i32 ,
291+ pub ( crate ) owners : Vec < CrateOwner > ,
292+ }
293+
294+ impl CratesIoData {
295+ pub ( crate ) fn get_from_network ( pkg : & MetadataPackage ) -> Result < Self > {
296+ let ( release_time, yanked, downloads) = get_release_time_yanked_downloads ( pkg) ?;
297+ let owners = get_owners ( pkg) ?;
298+
299+ Ok ( Self {
300+ release_time,
301+ yanked,
302+ downloads,
303+ owners,
304+ } )
305+ }
306+ }
307+
287308
288309/// Get release_time, yanked and downloads from crates.io
289310fn get_release_time_yanked_downloads (
@@ -394,9 +415,15 @@ fn add_authors_into_database(conn: &Connection, pkg: &MetadataPackage, release_i
394415}
395416
396417
418+ pub ( crate ) struct CrateOwner {
419+ pub ( crate ) avatar : String ,
420+ pub ( crate ) email : String ,
421+ pub ( crate ) login : String ,
422+ pub ( crate ) name : String ,
423+ }
397424
398- /// Adds owners into database
399- fn add_owners_into_database ( conn : & Connection , pkg : & MetadataPackage , crate_id : & i32 ) -> Result < ( ) > {
425+ /// Fetch owners from crates.io
426+ fn get_owners ( pkg : & MetadataPackage ) -> Result < Vec < CrateOwner > > {
400427 // owners available in: https://crates.io/api/v1/crates/rand/owners
401428 let owners_url = format ! ( "https://crates.io/api/v1/crates/{}/owners" , pkg. name) ;
402429 let client = Client :: new ( ) ;
@@ -409,6 +436,7 @@ fn add_owners_into_database(conn: &Connection, pkg: &MetadataPackage, crate_id:
409436 res. read_to_string ( & mut body) . unwrap ( ) ;
410437 let json = Json :: from_str ( & body[ ..] ) ?;
411438
439+ let mut result = Vec :: new ( ) ;
412440 if let Some ( owners) = json. as_object ( )
413441 . and_then ( |j| j. get ( "users" ) )
414442 . and_then ( |j| j. as_array ( ) ) {
@@ -435,25 +463,38 @@ fn add_owners_into_database(conn: &Connection, pkg: &MetadataPackage, crate_id:
435463 continue ;
436464 }
437465
438- let owner_id: i32 = {
439- let rows = conn. query ( "SELECT id FROM owners WHERE login = $1" , & [ & login] ) ?;
440- if rows. len ( ) > 0 {
441- rows. get ( 0 ) . get ( 0 )
442- } else {
443- conn. query ( "INSERT INTO owners (login, avatar, name, email)
444- VALUES ($1, $2, $3, $4)
445- RETURNING id" ,
446- & [ & login, & avatar, & name, & email] ) ?
447- . get ( 0 )
448- . get ( 0 )
449- }
450- } ;
451-
452- // add relationship
453- let _ = conn. query ( "INSERT INTO owner_rels (cid, oid) VALUES ($1, $2)" ,
454- & [ crate_id, & owner_id] ) ;
466+ result. push ( CrateOwner {
467+ avatar : avatar. to_string ( ) ,
468+ email : email. to_string ( ) ,
469+ login : login. to_string ( ) ,
470+ name : name. to_string ( ) ,
471+ } ) ;
455472 }
473+ }
474+
475+ Ok ( result)
476+ }
477+
478+ /// Adds owners into database
479+ fn add_owners_into_database ( conn : & Connection , owners : & [ CrateOwner ] , crate_id : & i32 ) -> Result < ( ) > {
480+ for owner in owners {
481+ let owner_id: i32 = {
482+ let rows = conn. query ( "SELECT id FROM owners WHERE login = $1" , & [ & owner. login ] ) ?;
483+ if rows. len ( ) > 0 {
484+ rows. get ( 0 ) . get ( 0 )
485+ } else {
486+ conn. query ( "INSERT INTO owners (login, avatar, name, email)
487+ VALUES ($1, $2, $3, $4)
488+ RETURNING id" ,
489+ & [ & owner. login , & owner. avatar , & owner. name , & owner. email ] ) ?
490+ . get ( 0 )
491+ . get ( 0 )
492+ }
493+ } ;
456494
495+ // add relationship
496+ let _ = conn. query ( "INSERT INTO owner_rels (cid, oid) VALUES ($1, $2)" ,
497+ & [ crate_id, & owner_id] ) ;
457498 }
458499 Ok ( ( ) )
459500}
0 commit comments