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;
pub mod package;
use crate::prelude::*;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ImportProgress {
Collection,
@ -12,3 +14,26 @@ pub enum ImportProgress {
MediaCheck(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},
Meta,
},
ImportProgress,
ImportProgress, IncrementalProgress,
},
media::{
files::{add_hash_suffix_to_file_stem, sha1_of_reader},
@ -32,29 +32,6 @@ pub(super) struct MediaUseMap {
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<'_> {
pub(super) fn prepare_media(&mut self) -> Result<MediaUseMap> {
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<()> {
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() {
progress.increment()?;
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<()>,
) -> Result<MediaUseMap> {
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)? {
progress.increment()?;

View file

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

View file

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