@@ -577,6 +577,23 @@ impl DatabaseSubcommand {
577
577
let build_queue = ctx. build_queue ( ) ?;
578
578
ctx. runtime ( ) ?
579
579
. block_on ( async {
580
+ async fn queue_rebuild (
581
+ build_queue : Arc < BuildQueue > ,
582
+ name : & str ,
583
+ version : & str ,
584
+ ) -> Result < ( ) > {
585
+ spawn_blocking ( {
586
+ let name = name. to_owned ( ) ;
587
+ let version = version. to_owned ( ) ;
588
+ move || {
589
+ if !build_queue. has_build_queued ( & name, & version) ? {
590
+ build_queue. add_crate ( & name, & version, 5 , None ) ?;
591
+ }
592
+ Ok ( ( ) )
593
+ }
594
+ } )
595
+ . await
596
+ }
580
597
let storage = ctx. async_storage ( ) . await ?;
581
598
let mut conn = pool. get_async ( ) . await ?;
582
599
let mut result_stream = sqlx:: query!(
@@ -615,11 +632,18 @@ impl DatabaseSubcommand {
615
632
} ;
616
633
617
634
let count = {
618
- let connection = Connection :: open_with_flags (
635
+ let connection = match Connection :: open_with_flags (
619
636
& local_archive_index_filename,
620
637
OpenFlags :: SQLITE_OPEN_READ_ONLY
621
638
| OpenFlags :: SQLITE_OPEN_NO_MUTEX ,
622
- ) ?;
639
+ ) {
640
+ Ok ( conn) => conn,
641
+ Err ( err) => {
642
+ println ! ( "... error opening sqlite db, queueing rebuild: {:?}" , err) ;
643
+ queue_rebuild ( build_queue. clone ( ) , & row. name , & row. version ) . await ?;
644
+ continue ;
645
+ }
646
+ } ;
623
647
let mut stmt =
624
648
connection. prepare ( "SELECT count(*) FROM files" ) ?;
625
649
@@ -630,13 +654,8 @@ impl DatabaseSubcommand {
630
654
631
655
if count >= 65000 {
632
656
println ! ( "...big index, queueing rebuild" ) ;
633
- spawn_blocking ( {
634
- let build_queue = build_queue. clone ( ) ;
635
- let name = row. name . clone ( ) ;
636
- let version = row. version . clone ( ) ;
637
- move || build_queue. add_crate ( & name, & version, 5 , None )
638
- } )
639
- . await ?;
657
+ queue_rebuild ( build_queue. clone ( ) , & row. name , & row. version )
658
+ . await ?;
640
659
}
641
660
}
642
661
}
0 commit comments