mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
Use IncrementalProgress in whole import_export code
This commit is contained in:
parent
87fbefb85e
commit
930f4212b2
4 changed files with 36 additions and 36 deletions
|
@ -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(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()?;
|
||||
|
|
|
@ -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(¬e.notetype_id) {
|
||||
if self.target_guids.contains_key(¬e.guid) {
|
||||
self.imports.log_conflicting(note);
|
||||
|
|
|
@ -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)?;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue