mirror of
https://github.com/ankitects/anki.git
synced 2026-01-19 09:22:51 -05:00
* Write media files in chunks
* Test media file writing
* Add iter `ReadDirFiles`
* Remove ImportMediaError, fail fatally instead
Partially reverts commit e7cac9d1d6.
* Compare hashes of media files to be restored
* Improve `MediaCopier::copy()`
* Restore media files atomically with tempfile
* Make downgrade flag an enum
* Remove SchemaVersion::Latest in favour of Option
* Remove sha1 comparison again
* Remove unnecessary repr(u8) (dae)
89 lines
2.9 KiB
Rust
89 lines
2.9 KiB
Rust
// Copyright: Ankitects Pty Ltd and contributors
|
|
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
/// The minimum schema version we can open.
|
|
pub(super) const SCHEMA_MIN_VERSION: u8 = 11;
|
|
/// The version new files are initially created with.
|
|
pub(super) const SCHEMA_STARTING_VERSION: u8 = 11;
|
|
/// The maximum schema version we can open.
|
|
pub(super) const SCHEMA_MAX_VERSION: u8 = 18;
|
|
|
|
use super::{SchemaVersion, SqliteStorage};
|
|
use crate::error::Result;
|
|
|
|
impl SqliteStorage {
|
|
pub(super) fn upgrade_to_latest_schema(&self, ver: u8, server: bool) -> Result<()> {
|
|
if ver < 14 {
|
|
self.db
|
|
.execute_batch(include_str!("schema14_upgrade.sql"))?;
|
|
self.upgrade_deck_conf_to_schema14()?;
|
|
self.upgrade_tags_to_schema14()?;
|
|
self.upgrade_config_to_schema14()?;
|
|
}
|
|
if ver < 15 {
|
|
self.db
|
|
.execute_batch(include_str!("schema15_upgrade.sql"))?;
|
|
self.upgrade_notetypes_to_schema15()?;
|
|
self.upgrade_decks_to_schema15(server)?;
|
|
self.upgrade_deck_conf_to_schema15()?;
|
|
}
|
|
if ver < 16 {
|
|
self.upgrade_deck_conf_to_schema16(server)?;
|
|
self.db.execute_batch("update col set ver = 16")?;
|
|
}
|
|
if ver < 17 {
|
|
self.upgrade_tags_to_schema17()?;
|
|
self.db.execute_batch("update col set ver = 17")?;
|
|
}
|
|
if ver < 18 {
|
|
self.db
|
|
.execute_batch(include_str!("schema18_upgrade.sql"))?;
|
|
}
|
|
|
|
// in some future schema upgrade, we may want to change
|
|
// _collapsed to _expanded in DeckCommon and invert existing values, so
|
|
// that we can avoid serializing the values in the default case, and use
|
|
// DeckCommon::default() in new_normal() and new_filtered()
|
|
|
|
Ok(())
|
|
}
|
|
|
|
pub(super) fn downgrade_to(&self, ver: SchemaVersion) -> Result<()> {
|
|
match ver {
|
|
SchemaVersion::V11 => self.downgrade_to_schema_11(),
|
|
SchemaVersion::V18 => Ok(()),
|
|
}
|
|
}
|
|
|
|
fn downgrade_to_schema_11(&self) -> Result<()> {
|
|
self.begin_trx()?;
|
|
|
|
self.db
|
|
.execute_batch(include_str!("schema18_downgrade.sql"))?;
|
|
self.downgrade_deck_conf_from_schema16()?;
|
|
self.downgrade_decks_from_schema15()?;
|
|
self.downgrade_notetypes_from_schema15()?;
|
|
self.downgrade_config_from_schema14()?;
|
|
self.downgrade_tags_from_schema14()?;
|
|
self.db
|
|
.execute_batch(include_str!("schema11_downgrade.sql"))?;
|
|
|
|
self.commit_trx()?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::*;
|
|
|
|
#[test]
|
|
#[allow(clippy::assertions_on_constants)]
|
|
fn assert_18_is_latest_schema_version() {
|
|
assert!(
|
|
18 == SCHEMA_MAX_VERSION,
|
|
"must implement SqliteStorage::downgrade_to(SchemaVersion::V18)"
|
|
);
|
|
}
|
|
}
|