diff --git a/data/users/warren.sqlite b/data/users/warren.sqlite index 05b8333..a865684 100644 Binary files a/data/users/warren.sqlite and b/data/users/warren.sqlite differ diff --git a/src/scan.rs b/src/scan.rs index 83d5706..32fbd18 100644 --- a/src/scan.rs +++ b/src/scan.rs @@ -56,7 +56,7 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan folders.len(), files.len(), scan_duration.as_secs_f64()); println!(); - println!("[2/4] Generating node IDs..."); + println!("[2/5] Generating node IDs..."); let id_start = Instant::now(); let mac = get_mac_address()?; @@ -184,7 +184,7 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan folder_nodes.len(), file_nodes.len(), id_duration.as_secs_f64()); println!(); - println!("[3/4] Opening database..."); + println!("[3/5] Opening database..."); let db_start = Instant::now(); let db_path = FileTree::user_db_path(user_id); @@ -199,7 +199,7 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan println!(" Database opened in {:.2}s", db_duration.as_secs_f64()); println!(); - println!("[4/4] Inserting nodes (batch size: {})...", batch_size); + println!("[4/5] Inserting nodes (batch size: {})...", batch_size); let insert_start = Instant::now(); let tx = conn.unchecked_transaction()?; @@ -239,6 +239,26 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan insert_duration.as_secs_f64(), total_nodes as f64 / insert_duration.as_secs_f64()); + println!(); + println!("[5/5] Updating folder children_json..."); + let children_start = Instant::now(); + + conn.execute( + "UPDATE file_nodes + SET children_json = ( + SELECT json_group_array(node_id) + FROM file_nodes AS child + WHERE child.parent_id = file_nodes.node_id + ) + WHERE node_type = 'folder'", + [], + )?; + + let children_duration = children_start.elapsed(); + println!(" Updated children_json for {} folders in {:.2}s", + folder_count, + children_duration.as_secs_f64()); + let total_duration = start.elapsed(); println!(); println!("=== Summary ==="); @@ -249,18 +269,21 @@ pub fn scan_directory(user_id: &str, dir: &str, batch_size: usize, options: Scan println!("Database: {}", FileTree::user_db_path(user_id)); println!(); println!("Performance breakdown:"); - println!(" - Scanning: {:.2}s ({:.0}%)", + println!(" - Scanning: {:.2}s ({:.0}%)", scan_duration.as_secs_f64(), scan_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0); - println!(" - ID gen: {:.2}s ({:.0}%)", + println!(" - ID gen: {:.2}s ({:.0}%)", id_duration.as_secs_f64(), id_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0); - println!(" - DB open: {:.2}s ({:.0}%)", + println!(" - DB open: {:.2}s ({:.0}%)", db_duration.as_secs_f64(), db_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0); - println!(" - Insertion: {:.2}s ({:.0}%)", + println!(" - Insertion: {:.2}s ({:.0}%)", insert_duration.as_secs_f64(), insert_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0); + println!(" - Children JSON: {:.2}s ({:.0}%)", + children_duration.as_secs_f64(), + children_duration.as_secs_f64() / total_duration.as_secs_f64() * 100.0); if !options.skip_hash { println!();