Use IncrementalProgress in whole import_export code

This commit is contained in:
RumovZ 2022-04-28 18:51:22 +02:00
parent 87fbefb85e
commit 930f4212b2
4 changed files with 36 additions and 36 deletions

View file

@ -5,6 +5,8 @@ mod gather;
mod insert; mod insert;
pub mod package; pub mod package;
use crate::prelude::*;
#[derive(Debug, Clone, Copy, PartialEq)] #[derive(Debug, Clone, Copy, PartialEq)]
pub enum ImportProgress { pub enum ImportProgress {
Collection, Collection,
@ -12,3 +14,26 @@ pub enum ImportProgress {
MediaCheck(usize), MediaCheck(usize),
Notes(usize), Notes(usize),
} }
pub(crate) struct IncrementalProgress<F: FnMut(usize) -> Result<()>> {
progress_fn: F,
counter: usize,
}
impl<F: FnMut(usize) -> Result<()>> IncrementalProgress<F> {
pub(crate) fn new(progress_fn: F) -> Self {
Self {
progress_fn,
counter: 0,
}
}
pub(crate) fn increment(&mut self) -> Result<()> {
self.counter += 1;
if self.counter % 17 == 0 {
(self.progress_fn)(self.counter)
} else {
Ok(())
}
}
}

View file

@ -12,7 +12,7 @@ use crate::{
media::{extract_media_entries, SafeMediaEntry}, media::{extract_media_entries, SafeMediaEntry},
Meta, Meta,
}, },
ImportProgress, ImportProgress, IncrementalProgress,
}, },
media::{ media::{
files::{add_hash_suffix_to_file_stem, sha1_of_reader}, files::{add_hash_suffix_to_file_stem, sha1_of_reader},
@ -32,29 +32,6 @@ pub(super) struct MediaUseMap {
unchecked: Vec<SafeMediaEntry>, unchecked: Vec<SafeMediaEntry>,
} }
struct ProgressHandler<F: FnMut(usize) -> Result<()>> {
progress_fn: F,
counter: usize,
}
impl<F: FnMut(usize) -> Result<()>> ProgressHandler<F> {
fn new(progress_fn: F) -> Self {
Self {
progress_fn,
counter: 0,
}
}
fn increment(&mut self) -> Result<()> {
self.counter += 1;
if self.counter % 17 == 0 {
(self.progress_fn)(self.counter)
} else {
Ok(())
}
}
}
impl Context<'_> { impl Context<'_> {
pub(super) fn prepare_media(&mut self) -> Result<MediaUseMap> { pub(super) fn prepare_media(&mut self) -> Result<MediaUseMap> {
let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok(); let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok();
@ -69,7 +46,7 @@ impl Context<'_> {
pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> { pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> {
let mut progress = let mut progress =
ProgressHandler::new(|u| (&mut self.progress_fn)(ImportProgress::Media(u))); IncrementalProgress::new(|u| (&mut self.progress_fn)(ImportProgress::Media(u)));
for entry in media_map.used_entries() { for entry in media_map.used_entries() {
progress.increment()?; progress.increment()?;
entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?; entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?;
@ -95,7 +72,7 @@ fn prepare_media(
progress_fn: &mut impl FnMut(ImportProgress) -> Result<()>, progress_fn: &mut impl FnMut(ImportProgress) -> Result<()>,
) -> Result<MediaUseMap> { ) -> Result<MediaUseMap> {
let mut media_map = MediaUseMap::default(); let mut media_map = MediaUseMap::default();
let mut progress = ProgressHandler::new(|u| progress_fn(ImportProgress::MediaCheck(u))); let mut progress = IncrementalProgress::new(|u| progress_fn(ImportProgress::MediaCheck(u)));
for mut entry in extract_media_entries(meta, archive)? { for mut entry in extract_media_entries(meta, archive)? {
progress.increment()?; progress.increment()?;

View file

@ -14,7 +14,7 @@ use super::{media::MediaUseMap, Context, ProgressFn};
use crate::{ use crate::{
import_export::{ import_export::{
package::{media::safe_normalized_file_name, LogNote, NoteLog}, package::{media::safe_normalized_file_name, LogNote, NoteLog},
ImportProgress, ImportProgress, IncrementalProgress,
}, },
prelude::*, prelude::*,
text::{ text::{
@ -185,11 +185,10 @@ impl<'n> NoteContext<'n> {
} }
fn import_notes(&mut self, notes: Vec<Note>, progress_fn: &mut ProgressFn) -> Result<()> { fn import_notes(&mut self, notes: Vec<Note>, progress_fn: &mut ProgressFn) -> Result<()> {
for (idx, mut note) in notes.into_iter().enumerate() { let mut progress = IncrementalProgress::new(|u| progress_fn(ImportProgress::Notes(u)));
// FIXME: use ProgressHandler.increment()?
if idx % 17 == 0 { for mut note in notes.into_iter() {
progress_fn(ImportProgress::Notes(idx))?; progress.increment()?;
}
if let Some(notetype_id) = self.remapped_notetypes.get(&note.notetype_id) { if let Some(notetype_id) = self.remapped_notetypes.get(&note.notetype_id) {
if self.target_guids.contains_key(&note.guid) { if self.target_guids.contains_key(&note.guid) {
self.imports.log_conflicting(note); self.imports.log_conflicting(note);

View file

@ -18,7 +18,7 @@ use crate::{
media::{extract_media_entries, SafeMediaEntry}, media::{extract_media_entries, SafeMediaEntry},
Meta, Meta,
}, },
ImportProgress, ImportProgress, IncrementalProgress,
}, },
io::{atomic_rename, tempfile_in_parent_of}, io::{atomic_rename, tempfile_in_parent_of},
prelude::*, prelude::*,
@ -73,11 +73,10 @@ fn restore_media(
) -> Result<()> { ) -> Result<()> {
let media_entries = extract_media_entries(meta, archive)?; let media_entries = extract_media_entries(meta, archive)?;
std::fs::create_dir_all(media_folder)?; std::fs::create_dir_all(media_folder)?;
let mut progress = IncrementalProgress::new(|u| progress_fn(ImportProgress::Media(u)));
for entry in &media_entries { for entry in &media_entries {
if entry.index % 10 == 0 { progress.increment()?;
progress_fn(ImportProgress::Media(entry.index))?;
}
maybe_restore_media_file(meta, media_folder, archive, entry)?; maybe_restore_media_file(meta, media_folder, archive, entry)?;
} }