diff --git a/proto/backend.proto b/proto/backend.proto index 6a4fb91dc..ad16f6bed 100644 --- a/proto/backend.proto +++ b/proto/backend.proto @@ -385,14 +385,14 @@ message Card { sint32 usn = 6; uint32 ctype = 7; sint32 queue = 8; - int64 due = 9; - int64 ivl = 10; + sint32 due = 9; + uint32 ivl = 10; uint32 factor = 11; - int64 reps = 12; - int64 lapses = 13; - int64 left = 14; - int64 odue = 15; + uint32 reps = 12; + uint32 lapses = 13; + uint32 left = 14; + sint32 odue = 15; int64 odid = 16; - int64 flags = 17; + uint32 flags = 17; string data = 18; } diff --git a/pylib/anki/cards.py b/pylib/anki/cards.py index 823d8f1de..d3887410c 100644 --- a/pylib/anki/cards.py +++ b/pylib/anki/cards.py @@ -82,28 +82,23 @@ class Card: self.flags = c.flags self.data = c.data - def _preFlush(self) -> None: - hooks.card_will_flush(self) - self.mod = intTime() - self.usn = self.col.usn() - # bug check + def _bugcheck(self) -> None: if ( self.queue == QUEUE_TYPE_REV and self.odue and not self.col.decks.isDyn(self.did) ): hooks.card_odue_was_invalid() - assert self.due < 4294967296 def flush(self) -> None: - self._preFlush() + self._bugcheck() + hooks.card_will_flush(self) + # mtime & usn are set by backend card = BackendCard( id=self.id, nid=self.nid, did=self.did, ord=self.ord, - mtime=self.mod, - usn=self.usn, ctype=self.type, queue=self.queue, due=self.due, diff --git a/rslib/src/backend/mod.rs b/rslib/src/backend/mod.rs index 66282c5fc..81a71c266 100644 --- a/rslib/src/backend/mod.rs +++ b/rslib/src/backend/mod.rs @@ -637,8 +637,8 @@ impl Backend { } fn update_card(&self, pbcard: pb::Card) -> Result<()> { - let card = pbcard_to_native(pbcard)?; - self.with_col(|col| col.with_ctx(|ctx| ctx.storage.update_card(&card))) + let mut card = pbcard_to_native(pbcard)?; + self.with_col(|col| col.with_ctx(|ctx| ctx.update_card(&mut card))) } } @@ -751,7 +751,7 @@ fn card_to_pb(c: Card) -> pb::Card { left: c.left, odue: c.odue, odid: c.odid.0, - flags: c.flags, + flags: c.flags as u32, data: c.data, } } @@ -778,7 +778,7 @@ fn pbcard_to_native(c: pb::Card) -> Result { left: c.left, odue: c.odue, odid: DeckID(c.odid), - flags: c.flags, + flags: c.flags as u8, data: c.data, }) } diff --git a/rslib/src/card.rs b/rslib/src/card.rs index d1267fc87..05bd3d857 100644 --- a/rslib/src/card.rs +++ b/rslib/src/card.rs @@ -3,8 +3,9 @@ use crate::decks::DeckID; use crate::define_newtype; +use crate::err::Result; use crate::notes::NoteID; -use crate::{timestamp::TimestampSecs, types::Usn}; +use crate::{collection::RequestContext, timestamp::TimestampSecs, types::Usn}; use num_enum::TryFromPrimitive; use serde_repr::{Deserialize_repr, Serialize_repr}; @@ -48,15 +49,15 @@ pub struct Card { pub(crate) usn: Usn, pub(crate) ctype: CardType, pub(crate) queue: CardQueue, - pub(crate) due: i64, - pub(crate) ivl: i64, + pub(crate) due: i32, + pub(crate) ivl: u32, pub(crate) factor: u16, - pub(crate) reps: i64, - pub(crate) lapses: i64, - pub(crate) left: i64, - pub(crate) odue: i64, + pub(crate) reps: u32, + pub(crate) lapses: u32, + pub(crate) left: u32, + pub(crate) odue: i32, pub(crate) odid: DeckID, - pub(crate) flags: i64, + pub(crate) flags: u8, pub(crate) data: String, } @@ -84,3 +85,11 @@ impl Default for Card { } } } + +impl RequestContext<'_> { + pub fn update_card(&mut self, card: &mut Card) -> Result<()> { + card.mtime = TimestampSecs::now(); + card.usn = self.storage.usn()?; + self.storage.update_card(card) + } +} diff --git a/rslib/src/storage/sqlite.rs b/rslib/src/storage/sqlite.rs index a3bb4caf0..b57a3fd4f 100644 --- a/rslib/src/storage/sqlite.rs +++ b/rslib/src/storage/sqlite.rs @@ -215,9 +215,7 @@ impl SqliteStorage { pub(crate) struct StorageContext<'a> { pub(crate) db: &'a Connection, - #[allow(dead_code)] server: bool, - #[allow(dead_code)] usn: Option, timing_today: Option, @@ -303,7 +301,6 @@ impl StorageContext<'_> { Ok(()) } - #[allow(dead_code)] pub(crate) fn usn(&mut self) -> Result { if self.server { if self.usn.is_none() { @@ -313,7 +310,7 @@ impl StorageContext<'_> { .query_row(NO_PARAMS, |row| row.get(0))?, ); } - Ok(*self.usn.as_ref().unwrap()) + Ok(self.usn.clone().unwrap()) } else { Ok(Usn(-1)) }