mark deletions in media DB when files are deleted

This commit is contained in:
Damien Elmes 2020-02-11 19:50:52 +10:00
parent 1b0e8485fd
commit 23483b0a57
3 changed files with 25 additions and 5 deletions

View file

@ -7,7 +7,6 @@ use crate::backend_proto::{Empty, RenderedTemplateReplacement, SyncMediaIn};
use crate::err::{AnkiError, NetworkErrorKind, Result, SyncErrorKind};
use crate::latex::{extract_latex, ExtractedLatex};
use crate::media::check::MediaChecker;
use crate::media::files::remove_files;
use crate::media::sync::MediaSyncProgress;
use crate::media::MediaManager;
use crate::sched::{local_minutes_west_for_stamp, sched_timing_today};
@ -368,7 +367,9 @@ impl Backend {
}
fn remove_media_files(&self, fnames: &[String]) -> Result<()> {
remove_files(&self.media_folder, fnames)
let mgr = MediaManager::new(&self.media_folder, &self.media_db)?;
let mut ctx = mgr.dbctx();
mgr.remove_files(&mut ctx, fnames)
}
}

View file

@ -3,7 +3,7 @@
use crate::err::Result;
use crate::media::database::{open_or_create, MediaDatabaseContext, MediaEntry};
use crate::media::files::{add_data_to_folder_uniquely, mtime_as_i64, sha1_of_data};
use crate::media::files::{add_data_to_folder_uniquely, mtime_as_i64, remove_files, sha1_of_data};
use crate::media::sync::{MediaSyncProgress, MediaSyncer};
use rusqlite::Connection;
use std::borrow::Cow;
@ -91,6 +91,25 @@ impl MediaManager {
Ok(chosen_fname)
}
pub fn remove_files<S>(&self, ctx: &mut MediaDatabaseContext, filenames: &[S]) -> Result<()>
where
S: AsRef<str> + std::fmt::Debug,
{
remove_files(&self.media_folder, &filenames)?;
ctx.transact(|ctx| {
for fname in filenames {
if let Some(mut entry) = ctx.get_entry(fname.as_ref())? {
entry.sha1 = None;
entry.mtime = 0;
entry.sync_required = true;
ctx.set_entry(&entry)?;
}
}
Ok(())
})
}
/// Sync media.
pub async fn sync_media<F>(&self, progress: F, endpoint: &str, hkey: &str) -> Result<()>
where

View file

@ -5,7 +5,7 @@ use crate::err::{AnkiError, Result, SyncErrorKind};
use crate::media::changetracker::ChangeTracker;
use crate::media::database::{MediaDatabaseContext, MediaDatabaseMetadata, MediaEntry};
use crate::media::files::{
add_file_from_ankiweb, data_for_file, mtime_as_i64, normalize_filename, remove_files, AddedFile,
add_file_from_ankiweb, data_for_file, mtime_as_i64, normalize_filename, AddedFile,
};
use crate::media::MediaManager;
use crate::version;
@ -259,7 +259,7 @@ where
determine_required_changes(&mut self.ctx, &batch)?;
// file removal
remove_files(self.mgr.media_folder.as_path(), to_delete.as_slice())?;
self.mgr.remove_files(&mut self.ctx, to_delete.as_slice())?;
self.progress.downloaded_deletions += to_delete.len();
self.maybe_fire_progress_cb()?;