Optimization

pull/1072/head
Rafał Mikrut 8 months ago
parent e9765e1387
commit 700303941e

@ -228,11 +228,8 @@ impl BrokenFiles {
}
let type_of_file = check_extension_availability(&file_name_lowercase);
if type_of_file == TypeOfFile::Unknown {
return None;
}
if !check_extension_allowed(&type_of_file, &self.checked_types) {
if !check_if_file_extension_is_allowed(&type_of_file, &self.checked_types) {
return None;
}
@ -359,25 +356,15 @@ impl BrokenFiles {
let files_to_check = mem::take(&mut self.files_to_check);
if self.common_data.use_cache {
let (messages, loaded_items) = load_cache_from_file_generalized::<FileEntry>(&get_cache_file(), self.get_delete_outdated_cache());
let (messages, loaded_items) = load_cache_from_file_generalized::<FileEntry>(&get_cache_file(), self.get_delete_outdated_cache(), &files_to_check);
self.get_text_messages_mut().extend_with_another_messages(messages);
loaded_hash_map = loaded_items.unwrap_or_default();
for (name, file_entry) in files_to_check {
let checked_extension = check_extension_allowed(&file_entry.type_of_file, &self.checked_types); // Only broken
#[allow(clippy::if_same_then_else)]
if checked_extension && !loaded_hash_map.contains_key(&name) {
// If loaded data doesn't contains current info
non_cached_files_to_check.insert(name, file_entry.clone());
} else if checked_extension && file_entry.size != loaded_hash_map.get(&name).unwrap().size
|| file_entry.modified_date != loaded_hash_map.get(&name).unwrap().modified_date
{
// When size or modification date of image changed, then it is clear that is different image
non_cached_files_to_check.insert(name, file_entry);
if let Some(cached_file_entry) = loaded_hash_map.get(&name) {
records_already_cached.insert(name.clone(), cached_file_entry.clone());
} else {
// Checking may be omitted when already there is entry with same size and modification date
records_already_cached.insert(name.clone(), loaded_hash_map.get(&name).unwrap().clone());
non_cached_files_to_check.insert(name, file_entry);
}
}
} else {
@ -565,7 +552,7 @@ fn check_extension_availability(file_name_lowercase: &str) -> TypeOfFile {
}
}
fn check_extension_allowed(type_of_file: &TypeOfFile, checked_types: &CheckedTypes) -> bool {
fn check_if_file_extension_is_allowed(type_of_file: &TypeOfFile, checked_types: &CheckedTypes) -> bool {
((*type_of_file == TypeOfFile::Image) && ((*checked_types & CheckedTypes::IMAGE) == CheckedTypes::IMAGE))
|| ((*type_of_file == TypeOfFile::PDF) && ((*checked_types & CheckedTypes::PDF) == CheckedTypes::PDF))
|| ((*type_of_file == TypeOfFile::ArchiveZip) && ((*checked_types & CheckedTypes::ARCHIVE) == CheckedTypes::ARCHIVE))

@ -7,7 +7,7 @@ use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread::{sleep, JoinHandle};
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use std::time::{Duration, SystemTime};
use std::{fs, thread};
#[cfg(feature = "heif")]
@ -198,8 +198,7 @@ where
}
text_messages
}
pub fn load_cache_from_file_generalized<T>(cache_file_name: &str, delete_outdated_cache: bool) -> (Messages, Option<BTreeMap<String, T>>)
pub fn load_cache_from_file_generalized<T>(cache_file_name: &str, delete_outdated_cache: bool, used_files: &BTreeMap<String, T>) -> (Messages, Option<BTreeMap<String, T>>)
where
for<'a> T: Deserialize<'a> + ResultEntry + Sized + Send + Sync,
{
@ -242,23 +241,18 @@ where
vec_loaded_entries = vec_loaded_entries
.into_par_iter()
.filter(|file_entry| {
if !file_entry.get_path().exists() {
return false;
}
let Ok(metadata) = file_entry.get_path().metadata() else {
return false;
};
if metadata.len() != file_entry.get_size() {
if delete_outdated_cache && !file_entry.get_path().exists() {
return false;
}
let Ok(modified) = metadata.modified() else {
return false;
};
let Ok(secs) = modified.duration_since(UNIX_EPOCH) else {
return false;
};
if secs.as_secs() != file_entry.get_modified_date() {
return false;
let file_entry_path_str = file_entry.get_path().to_string_lossy().to_string();
if let Some(used_file) = used_files.get(&file_entry_path_str) {
if file_entry.get_size() != used_file.get_size() {
return false;
}
if file_entry.get_modified_date() != used_file.get_modified_date() {
return false;
}
}
true

@ -19,6 +19,7 @@ pub mod temporary;
pub mod bad_extensions;
pub mod common;
pub mod common_cache;
pub mod common_dir_traversal;
pub mod common_directory;
pub mod common_extensions;

@ -235,23 +235,15 @@ impl SameMusic {
let mut non_cached_files_to_check: BTreeMap<String, MusicEntry> = Default::default();
if self.common_data.use_cache {
let (messages, loaded_items) = load_cache_from_file_generalized::<MusicEntry>(get_cache_file(checking_tags), self.get_delete_outdated_cache());
let (messages, loaded_items) = load_cache_from_file_generalized::<MusicEntry>(get_cache_file(checking_tags), self.get_delete_outdated_cache(), &self.music_to_check);
self.get_text_messages_mut().extend_with_another_messages(messages);
loaded_hash_map = loaded_items.unwrap_or_default();
for (name, file_entry) in &self.music_to_check {
if !loaded_hash_map.contains_key(name) {
// If loaded data doesn't contains current image info
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
for (name, file_entry) in mem::take(&mut self.music_to_check) {
if let Some(cached_file_entry) = loaded_hash_map.get(&name) {
records_already_cached.insert(name.clone(), cached_file_entry.clone());
} else {
let loaded_item = loaded_hash_map.get(name).unwrap();
if file_entry.size != loaded_item.size || file_entry.modified_date != loaded_item.modified_date {
// When size or modification date of image changed, then it is clear that is different image
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
} else {
// Checking may be omitted when already there is entry with same size and modification date
records_already_cached.insert(name.clone(), loaded_item.clone());
}
non_cached_files_to_check.insert(name, file_entry);
}
}
} else {

@ -286,24 +286,19 @@ impl SimilarImages {
let mut non_cached_files_to_check: BTreeMap<String, FileEntry> = Default::default();
if self.common_data.use_cache {
let (messages, loaded_items) =
load_cache_from_file_generalized::<FileEntry>(&get_cache_file(&self.hash_size, &self.hash_alg, &self.image_filter), self.get_delete_outdated_cache());
let (messages, loaded_items) = load_cache_from_file_generalized::<FileEntry>(
&get_cache_file(&self.hash_size, &self.hash_alg, &self.image_filter),
self.get_delete_outdated_cache(),
&self.images_to_check,
);
self.get_text_messages_mut().extend_with_another_messages(messages);
loaded_hash_map = loaded_items.unwrap_or_default();
for (name, file_entry) in &self.images_to_check {
if !loaded_hash_map.contains_key(name) {
// If loaded data doesn't contains current image info
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
for (name, file_entry) in mem::take(&mut self.images_to_check) {
if let Some(cached_file_entry) = loaded_hash_map.get(&name) {
records_already_cached.insert(name.clone(), cached_file_entry.clone());
} else {
let loaded_item = loaded_hash_map.get(name).unwrap();
if file_entry.size != loaded_item.size || file_entry.modified_date != loaded_item.modified_date {
// When size or modification date of image changed, then it is clear that is different image
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
} else {
// Checking may be omitted when already there is entry with same size and modification date
records_already_cached.insert(name.clone(), loaded_item.clone());
}
non_cached_files_to_check.insert(name, file_entry);
}
}
} else {

@ -267,23 +267,15 @@ impl SimilarVideos {
let mut non_cached_files_to_check: BTreeMap<String, FileEntry> = Default::default();
if self.common_data.use_cache {
let (messages, loaded_items) = load_cache_from_file_generalized::<FileEntry>(&get_cache_file(), self.get_delete_outdated_cache());
let (messages, loaded_items) = load_cache_from_file_generalized::<FileEntry>(&get_cache_file(), self.get_delete_outdated_cache(), &self.videos_to_check);
self.get_text_messages_mut().extend_with_another_messages(messages);
loaded_hash_map = loaded_items.unwrap_or_default();
for (name, file_entry) in &self.videos_to_check {
if !loaded_hash_map.contains_key(name) {
// If loaded data doesn't contains current videos info
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
for (name, file_entry) in mem::take(&mut self.videos_to_check) {
if let Some(cached_file_entry) = loaded_hash_map.get(&name) {
records_already_cached.insert(name.clone(), cached_file_entry.clone());
} else {
let loaded_item = loaded_hash_map.get(name).unwrap();
if file_entry.size != loaded_item.size || file_entry.modified_date != loaded_item.modified_date {
// When size or modification date of video changed, then it is clear that is different video
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
} else {
// Checking may be omitted when already there is entry with same size and modification date
records_already_cached.insert(name.clone(), loaded_item.clone());
}
non_cached_files_to_check.insert(name, file_entry);
}
}
} else {

@ -173,6 +173,7 @@ pub fn connect_settings(gui_data: &GuiData) {
let (mut messages, loaded_items) = load_cache_from_file_generalized::<czkawka_core::similar_images::FileEntry>(
&czkawka_core::similar_images::get_cache_file(hash_size, hash_alg, image_filter),
true,
&Default::default(),
);
if let Some(cache_entries) = loaded_items {
@ -205,7 +206,7 @@ pub fn connect_settings(gui_data: &GuiData) {
dialog.connect_response(move |dialog, response_type| {
if response_type == ResponseType::Ok {
let (mut messages, loaded_items) =
load_cache_from_file_generalized::<czkawka_core::similar_videos::FileEntry>(&czkawka_core::similar_videos::get_cache_file(), true);
load_cache_from_file_generalized::<czkawka_core::similar_videos::FileEntry>(&czkawka_core::similar_videos::get_cache_file(), true, &Default::default());
if let Some(cache_entries) = loaded_items {
let save_messages = save_cache_to_file_generalized(&czkawka_core::similar_videos::get_cache_file(), &cache_entries, false);

Loading…
Cancel
Save