handle mtime/usn bump in backend, and tweak integer sizes

This commit is contained in:
Damien Elmes 2020-03-26 20:55:04 +10:00
parent 7a56d18539
commit 7f16f436c3
5 changed files with 33 additions and 32 deletions

View file

@ -385,14 +385,14 @@ message Card {
sint32 usn = 6; sint32 usn = 6;
uint32 ctype = 7; uint32 ctype = 7;
sint32 queue = 8; sint32 queue = 8;
int64 due = 9; sint32 due = 9;
int64 ivl = 10; uint32 ivl = 10;
uint32 factor = 11; uint32 factor = 11;
int64 reps = 12; uint32 reps = 12;
int64 lapses = 13; uint32 lapses = 13;
int64 left = 14; uint32 left = 14;
int64 odue = 15; sint32 odue = 15;
int64 odid = 16; int64 odid = 16;
int64 flags = 17; uint32 flags = 17;
string data = 18; string data = 18;
} }

View file

@ -82,28 +82,23 @@ class Card:
self.flags = c.flags self.flags = c.flags
self.data = c.data self.data = c.data
def _preFlush(self) -> None: def _bugcheck(self) -> None:
hooks.card_will_flush(self)
self.mod = intTime()
self.usn = self.col.usn()
# bug check
if ( if (
self.queue == QUEUE_TYPE_REV self.queue == QUEUE_TYPE_REV
and self.odue and self.odue
and not self.col.decks.isDyn(self.did) and not self.col.decks.isDyn(self.did)
): ):
hooks.card_odue_was_invalid() hooks.card_odue_was_invalid()
assert self.due < 4294967296
def flush(self) -> None: def flush(self) -> None:
self._preFlush() self._bugcheck()
hooks.card_will_flush(self)
# mtime & usn are set by backend
card = BackendCard( card = BackendCard(
id=self.id, id=self.id,
nid=self.nid, nid=self.nid,
did=self.did, did=self.did,
ord=self.ord, ord=self.ord,
mtime=self.mod,
usn=self.usn,
ctype=self.type, ctype=self.type,
queue=self.queue, queue=self.queue,
due=self.due, due=self.due,

View file

@ -637,8 +637,8 @@ impl Backend {
} }
fn update_card(&self, pbcard: pb::Card) -> Result<()> { fn update_card(&self, pbcard: pb::Card) -> Result<()> {
let card = pbcard_to_native(pbcard)?; let mut card = pbcard_to_native(pbcard)?;
self.with_col(|col| col.with_ctx(|ctx| ctx.storage.update_card(&card))) 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, left: c.left,
odue: c.odue, odue: c.odue,
odid: c.odid.0, odid: c.odid.0,
flags: c.flags, flags: c.flags as u32,
data: c.data, data: c.data,
} }
} }
@ -778,7 +778,7 @@ fn pbcard_to_native(c: pb::Card) -> Result<Card> {
left: c.left, left: c.left,
odue: c.odue, odue: c.odue,
odid: DeckID(c.odid), odid: DeckID(c.odid),
flags: c.flags, flags: c.flags as u8,
data: c.data, data: c.data,
}) })
} }

View file

@ -3,8 +3,9 @@
use crate::decks::DeckID; use crate::decks::DeckID;
use crate::define_newtype; use crate::define_newtype;
use crate::err::Result;
use crate::notes::NoteID; use crate::notes::NoteID;
use crate::{timestamp::TimestampSecs, types::Usn}; use crate::{collection::RequestContext, timestamp::TimestampSecs, types::Usn};
use num_enum::TryFromPrimitive; use num_enum::TryFromPrimitive;
use serde_repr::{Deserialize_repr, Serialize_repr}; use serde_repr::{Deserialize_repr, Serialize_repr};
@ -48,15 +49,15 @@ pub struct Card {
pub(crate) usn: Usn, pub(crate) usn: Usn,
pub(crate) ctype: CardType, pub(crate) ctype: CardType,
pub(crate) queue: CardQueue, pub(crate) queue: CardQueue,
pub(crate) due: i64, pub(crate) due: i32,
pub(crate) ivl: i64, pub(crate) ivl: u32,
pub(crate) factor: u16, pub(crate) factor: u16,
pub(crate) reps: i64, pub(crate) reps: u32,
pub(crate) lapses: i64, pub(crate) lapses: u32,
pub(crate) left: i64, pub(crate) left: u32,
pub(crate) odue: i64, pub(crate) odue: i32,
pub(crate) odid: DeckID, pub(crate) odid: DeckID,
pub(crate) flags: i64, pub(crate) flags: u8,
pub(crate) data: String, 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)
}
}

View file

@ -215,9 +215,7 @@ impl SqliteStorage {
pub(crate) struct StorageContext<'a> { pub(crate) struct StorageContext<'a> {
pub(crate) db: &'a Connection, pub(crate) db: &'a Connection,
#[allow(dead_code)]
server: bool, server: bool,
#[allow(dead_code)]
usn: Option<Usn>, usn: Option<Usn>,
timing_today: Option<SchedTimingToday>, timing_today: Option<SchedTimingToday>,
@ -303,7 +301,6 @@ impl StorageContext<'_> {
Ok(()) Ok(())
} }
#[allow(dead_code)]
pub(crate) fn usn(&mut self) -> Result<Usn> { pub(crate) fn usn(&mut self) -> Result<Usn> {
if self.server { if self.server {
if self.usn.is_none() { if self.usn.is_none() {
@ -313,7 +310,7 @@ impl StorageContext<'_> {
.query_row(NO_PARAMS, |row| row.get(0))?, .query_row(NO_PARAMS, |row| row.get(0))?,
); );
} }
Ok(*self.usn.as_ref().unwrap()) Ok(self.usn.clone().unwrap())
} else { } else {
Ok(Usn(-1)) Ok(Usn(-1))
} }