@@ -577,6 +577,23 @@ impl DatabaseSubcommand {
577577 let build_queue = ctx. build_queue ( ) ?;
578578 ctx. runtime ( ) ?
579579 . 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+ }
580597 let storage = ctx. async_storage ( ) . await ?;
581598 let mut conn = pool. get_async ( ) . await ?;
582599 let mut result_stream = sqlx:: query!(
@@ -615,11 +632,18 @@ impl DatabaseSubcommand {
615632 } ;
616633
617634 let count = {
618- let connection = Connection :: open_with_flags (
635+ let connection = match Connection :: open_with_flags (
619636 & local_archive_index_filename,
620637 OpenFlags :: SQLITE_OPEN_READ_ONLY
621638 | 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+ } ;
623647 let mut stmt =
624648 connection. prepare ( "SELECT count(*) FROM files" ) ?;
625649
@@ -630,13 +654,8 @@ impl DatabaseSubcommand {
630654
631655 if count >= 65000 {
632656 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 ?;
640659 }
641660 }
642661 }
0 commit comments