@@ -42,7 +42,7 @@ pub(crate) async fn add_package_into_database(
42
42
archive_storage : bool ,
43
43
) -> Result < i32 > {
44
44
debug ! ( "Adding package into database" ) ;
45
- let crate_id = initialize_package_in_database ( conn, metadata_pkg) . await ?;
45
+ let crate_id = initialize_crate ( conn, & metadata_pkg. name ) . await ?;
46
46
let dependencies = convert_dependencies ( metadata_pkg) ;
47
47
let rustdoc = get_rustdoc ( metadata_pkg, source_dir) . unwrap_or ( None ) ;
48
48
let readme = get_readme ( metadata_pkg, source_dir) . unwrap_or ( None ) ;
@@ -261,24 +261,19 @@ pub(crate) async fn add_build_into_database(
261
261
Ok ( build_id)
262
262
}
263
263
264
- async fn initialize_package_in_database (
265
- conn : & mut sqlx:: PgConnection ,
266
- pkg : & MetadataPackage ,
267
- ) -> Result < i32 > {
268
- if let Some ( id) = sqlx:: query_scalar!( "SELECT id FROM crates WHERE name = $1" , pkg. name)
269
- . fetch_optional ( & mut * conn)
270
- . await ?
271
- {
272
- Ok ( id)
273
- } else {
274
- // insert crate into database if it is not exists
275
- Ok ( sqlx:: query_scalar!(
276
- "INSERT INTO crates (name) VALUES ($1) RETURNING id" ,
277
- pkg. name,
278
- )
279
- . fetch_one ( & mut * conn)
280
- . await ?)
281
- }
264
+ pub ( crate ) async fn initialize_crate ( conn : & mut sqlx:: PgConnection , name : & str ) -> Result < i32 > {
265
+ sqlx:: query_scalar!(
266
+ "INSERT INTO crates (name)
267
+ VALUES ($1)
268
+ ON CONFLICT (name) DO UPDATE
269
+ SET -- this `SET` is needed so the id is always returned.
270
+ name = EXCLUDED.name
271
+ RETURNING id" ,
272
+ name
273
+ )
274
+ . fetch_one ( & mut * conn)
275
+ . await
276
+ . map_err ( Into :: into)
282
277
}
283
278
284
279
/// Convert dependencies into Vec<(String, String, String, bool)>
@@ -526,7 +521,7 @@ where
526
521
mod test {
527
522
use super :: * ;
528
523
use crate :: test:: * ;
529
- use crate :: utils:: { CargoMetadata , MetadataPackage } ;
524
+ use crate :: utils:: CargoMetadata ;
530
525
use test_case:: test_case;
531
526
532
527
#[ test]
@@ -647,13 +642,7 @@ mod test {
647
642
async_wrapper ( |env| async move {
648
643
let mut conn = env. async_db ( ) . await . async_conn ( ) . await ;
649
644
650
- let crate_id = initialize_package_in_database (
651
- & mut conn,
652
- & MetadataPackage {
653
- ..Default :: default ( )
654
- } ,
655
- )
656
- . await ?;
645
+ let crate_id = initialize_crate ( & mut conn, "" ) . await ?;
657
646
658
647
let owner1 = CrateOwner {
659
648
avatar : "avatar" . into ( ) ,
@@ -691,8 +680,7 @@ mod test {
691
680
fn update_owner_detais ( ) {
692
681
async_wrapper ( |env| async move {
693
682
let mut conn = env. async_db ( ) . await . async_conn ( ) . await ;
694
- let crate_id =
695
- initialize_package_in_database ( & mut conn, & MetadataPackage :: default ( ) ) . await ?;
683
+ let crate_id = initialize_crate ( & mut conn, "" ) . await ?;
696
684
697
685
// set initial owner details
698
686
update_owners_in_database (
@@ -737,13 +725,7 @@ mod test {
737
725
fn add_new_owners_and_delete_old ( ) {
738
726
async_wrapper ( |env| async move {
739
727
let mut conn = env. async_db ( ) . await . async_conn ( ) . await ;
740
- let crate_id = initialize_package_in_database (
741
- & mut conn,
742
- & MetadataPackage {
743
- ..Default :: default ( )
744
- } ,
745
- )
746
- . await ?;
728
+ let crate_id = initialize_crate ( & mut conn, "" ) . await ?;
747
729
748
730
// set initial owner details
749
731
update_owners_in_database (
0 commit comments