@@ -6,7 +6,9 @@ use std::fs::{create_dir_all, File};
66use std:: io:: copy;
77use std:: path:: Path ;
88use std:: sync:: mpsc:: channel;
9+ use std:: sync:: { Arc , Mutex } ;
910use threadpool:: ThreadPool ;
11+ use tqdm:: { pbar, Pbar } ;
1012
1113/// Function to retrieve the value of a key from a plist file
1214///
@@ -53,6 +55,14 @@ pub fn parse_manifest_db(
5355 arguments : & parser:: ArgConfig ,
5456) -> Result < ( ) , Box < dyn std:: error:: Error > > {
5557 let conn = Connection :: open ( manifest_db_path) ?;
58+
59+ // Get count to update progress bar
60+ let mut count_stmt = conn. prepare (
61+ "SELECT COUNT(*) FROM Files WHERE relativePath LIKE '%DCIM/%' OR relativePath LIKE '%PhotoData/%'"
62+ ) ?;
63+ let count: usize = count_stmt. query_row ( [ ] , |row| row. get ( 0 ) ) ?;
64+ let progress_bar_base: Arc < Mutex < Pbar > > = Arc :: new ( Mutex :: new ( pbar ( Some ( count) ) ) ) ;
65+
5666 let mut stmt = conn. prepare ( "SELECT fileID, relativePath FROM Files WHERE relativePath LIKE '%DCIM/%' OR relativePath LIKE '%PhotoData/%'" ) ?;
5767 let rows = stmt. query_map ( [ ] , |row| {
5868 let file_id: String = row. get ( 0 ) ?;
@@ -70,10 +80,14 @@ pub fn parse_manifest_db(
7080 let backup_cloned = backup. path . clone ( ) ;
7181 let output_dir_cloned = arguments. output_dir . clone ( ) ;
7282 let sender_cloned = sender. clone ( ) ;
83+ let progress_bar = Arc :: clone ( & progress_bar_base) ;
7384 pool. execute ( move || {
7485 let result =
7586 extract_files ( & backup_cloned, & output_dir_cloned, file_id, relative_path) ;
7687 sender_cloned. send ( result) . expect ( "Failed to send result" ) ;
88+ // Safely update progress bar
89+ let mut progress = progress_bar. lock ( ) . unwrap ( ) ;
90+ progress. update ( 1 ) . unwrap ( ) ;
7791 } ) ;
7892 }
7993 Err ( err) => {
@@ -83,6 +97,7 @@ pub fn parse_manifest_db(
8397 }
8498 // Wait for all tasks to complete
8599 drop ( sender) ; // Close the sending side of the channel
100+ pool. join ( ) ;
86101 for result in receiver {
87102 if let Err ( err) = result {
88103 log:: error!( "Error processing files: {:?}" , err) ;
0 commit comments