diff --git a/rslib/src/collection.rs b/rslib/src/collection.rs index 0388b19a7..c893d4e68 100644 --- a/rslib/src/collection.rs +++ b/rslib/src/collection.rs @@ -22,7 +22,7 @@ pub fn open_collection>( log: Logger, ) -> Result { let col_path = path.into(); - let storage = SqliteStorage::open_or_create(&col_path, &i18n)?; + let storage = SqliteStorage::open_or_create(&col_path, &i18n, server)?; let col = Collection { storage, diff --git a/rslib/src/storage/card/mod.rs b/rslib/src/storage/card/mod.rs index 1e074252e..e60158777 100644 --- a/rslib/src/storage/card/mod.rs +++ b/rslib/src/storage/card/mod.rs @@ -260,7 +260,7 @@ mod test { #[test] fn add_card() { let i18n = I18n::new(&[""], "", log::terminal()); - let storage = SqliteStorage::open_or_create(Path::new(":memory:"), &i18n).unwrap(); + let storage = SqliteStorage::open_or_create(Path::new(":memory:"), &i18n, false).unwrap(); let mut card = Card::default(); storage.add_card(&mut card).unwrap(); let id1 = card.id; diff --git a/rslib/src/storage/deck/mod.rs b/rslib/src/storage/deck/mod.rs index 99820d283..0793fe420 100644 --- a/rslib/src/storage/deck/mod.rs +++ b/rslib/src/storage/deck/mod.rs @@ -99,9 +99,10 @@ impl SqliteStorage { }) } - // fixme: bail instead of assert pub(crate) fn update_deck(&self, deck: &Deck) -> Result<()> { - assert!(deck.id.0 != 0); + if deck.id.0 == 0 { + return Err(AnkiError::invalid_input("deck with id 0")); + } self.add_or_update_deck(deck) } @@ -257,12 +258,16 @@ impl SqliteStorage { self.update_deck(&deck) } - // fixme: make sure conflicting deck names don't break things - pub(crate) fn upgrade_decks_to_schema15(&self) -> Result<()> { + pub(crate) fn upgrade_decks_to_schema15(&self, server: bool) -> Result<()> { + let usn = self.usn(server)?; let decks = self.get_schema11_decks()?; let mut names = HashSet::new(); for (_id, deck) in decks { + let oldname = deck.name().to_string(); let mut deck = Deck::from(deck); + if deck.human_name() != oldname { + deck.set_modified(usn); + } loop { let name = UniCase::new(deck.name.clone()); if !names.contains(&name) { @@ -270,6 +275,7 @@ impl SqliteStorage { break; } deck.name.push('_'); + deck.set_modified(usn); } self.update_deck(&deck)?; } diff --git a/rslib/src/storage/sqlite.rs b/rslib/src/storage/sqlite.rs index 60ccc627a..0252471e3 100644 --- a/rslib/src/storage/sqlite.rs +++ b/rslib/src/storage/sqlite.rs @@ -138,7 +138,7 @@ fn trace(s: &str) { } impl SqliteStorage { - pub(crate) fn open_or_create(path: &Path, i18n: &I18n) -> Result { + pub(crate) fn open_or_create(path: &Path, i18n: &I18n, server: bool) -> Result { let db = open_or_create_collection_db(path)?; let (create, ver) = schema_version(&db)?; @@ -180,7 +180,7 @@ impl SqliteStorage { let storage = Self { db }; if create || upgrade { - storage.upgrade_to_latest_schema(ver)?; + storage.upgrade_to_latest_schema(ver, server)?; } if create { diff --git a/rslib/src/storage/upgrades/mod.rs b/rslib/src/storage/upgrades/mod.rs index c05d9c8c9..e84f2c570 100644 --- a/rslib/src/storage/upgrades/mod.rs +++ b/rslib/src/storage/upgrades/mod.rs @@ -5,7 +5,7 @@ use super::SqliteStorage; use crate::err::Result; impl SqliteStorage { - pub(super) fn upgrade_to_latest_schema(&self, ver: u8) -> Result<()> { + 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"))?; @@ -17,7 +17,7 @@ impl SqliteStorage { self.db .execute_batch(include_str!("schema15_upgrade.sql"))?; self.upgrade_notetypes_to_schema15()?; - self.upgrade_decks_to_schema15()?; + self.upgrade_decks_to_schema15(server)?; self.upgrade_deck_conf_to_schema15()?; }