diff --git a/src/database.rs b/src/database.rs index b993e6e..ce2a70b 100644 --- a/src/database.rs +++ b/src/database.rs @@ -302,7 +302,7 @@ pub fn open_upend>(dirpath: P, reinitialize: bool) -> Result>( Ok(result) } pub async fn reimport_directory(pool: DbPool, directory: PathBuf) { - let result = actix_web::web::block(move || _reimport_directory(&pool, directory)).await; + let result = actix_web::web::block(move || _reimport_directory(pool, directory)).await; if result.is_err() { let err = result.err().unwrap(); error!("Update did not succeed! {}", err); } } -fn _reimport_directory>(pool: &DbPool, directory: T) -> Result<()> { +fn _reimport_directory>(pool: DbPool, directory: T) -> Result<()> { let path_entries: Vec = WalkDir::new(&directory) .into_iter() .filter_map(|e| e.ok()) @@ -301,29 +302,26 @@ fn _reimport_directory>(pool: &DbPool, directory: T) -> Result<() .map(|e| fs::canonicalize(e.into_path()).unwrap()) .collect(); + let mutex_pool = Arc::new(RwLock::new(pool)); let absolute_path = fs::canonicalize(&directory)?; path_entries .into_par_iter() - .map(|path| { - Ok(_process_directory_entry( - &pool.get()?, - path, - &absolute_path, - )?) - }) + .map(|path| Ok(_process_directory_entry(&mutex_pool, path, &absolute_path)?)) .collect::>()?; info!("Finished updating {}.", directory.as_ref().display()); Ok(()) } -fn _process_directory_entry, P: AsRef>( - connection: &C, +fn _process_directory_entry>( + pool: &Arc>, path: PathBuf, directory_path: &P, ) -> Result<()> { info!("Processing: {:?}", path); + let pool = Arc::clone(&pool); + let metadata = fs::metadata(&path)?; let size = metadata.len() as i64; if size < 0 { @@ -349,7 +347,7 @@ fn _process_directory_entry, P: AsRef>( size, }; - let _ = insert_file(connection, new_file)?; + let _ = insert_file(&pool.write().unwrap().get()?, new_file)?; let components = path .strip_prefix(&directory_path)? @@ -366,9 +364,11 @@ fn _process_directory_entry, P: AsRef>( })) .collect(), ); - let resolved_path = resolve_path(connection, &upath, true)?; + let resolved_path = resolve_path(&pool.write().unwrap().get()?, &upath, true)?; let parent_dir = resolved_path.last().unwrap(); + let _pool = &pool.write().unwrap(); + let connection = _pool.get()?; connection.transaction::<_, Error, _>(|| { let file_address = Address::UUID(Uuid::new_v4()); @@ -379,7 +379,7 @@ fn _process_directory_entry, P: AsRef>( filename.as_os_str().to_string_lossy().to_string(), )), }; - let _ = insert_entry(connection, name_entry)?; + let _ = insert_entry(&connection, name_entry)?; let identity_entry = InnerEntry { target: file_address.clone(), @@ -387,14 +387,14 @@ fn _process_directory_entry, P: AsRef>( value: EntryValue::Address(Address::Hash(digest.clone())), }; - let _ = insert_entry(connection, identity_entry)?; + let _ = insert_entry(&connection, identity_entry)?; let dir_has_entry = InnerEntry { target: parent_dir.clone(), key: DIR_HAS_KEY.to_string(), value: EntryValue::Address(file_address), }; - let _ = insert_entry(connection, dir_has_entry)?; + let _ = insert_entry(&connection, dir_has_entry)?; Ok(()) })