diff options
author | Joris | 2022-02-13 12:17:00 +0100 |
---|---|---|
committer | Joris | 2022-02-13 12:17:00 +0100 |
commit | 8a29f30fb2a949c03b318c4f7699136a8001be37 (patch) | |
tree | 51decc33aa776201bc800dc2196bc4f8b72337d7 /src/db | |
parent | 8170fb5e432cc81986479a6a3a400e009426d76a (diff) |
Synchronize deck only if necessary
Look at the modification time of the deck, and synchronize if it has
been modified after the last deck read.
Diffstat (limited to 'src/db')
-rw-r--r-- | src/db/db.rs | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/src/db/db.rs b/src/db/db.rs index 30ea1da..b42da3f 100644 --- a/src/db/db.rs +++ b/src/db/db.rs @@ -19,13 +19,23 @@ pub fn init(database: String) -> Result<Connection> { Ok(conn) } +pub fn last_deck_read(conn: &Connection) -> Option<u64> { + let mut stmt = conn + .prepare("SELECT deck_read FROM cards ORDER BY deck_read DESC LIMIT 1") + .ok()?; + + let mut rows = stmt.query([]).ok()?; + let row = rows.next().ok()??; + row.get(0).ok()? +} + /// Synchronize the DB with the deck: /// /// - insert new cards, /// - keep existing cards, /// - hide unused cards (keep state in case the card is added back afterward). pub fn synchronize(conn: &Connection, entries: Vec<Entry>) -> Result<()> { - let now = time::now()?; + let now = time::seconds_since_unix_epoch()?; let state = serde_json::to_string(&space_repetition::init())?; @@ -76,19 +86,21 @@ fn delete_read_before(conn: &Connection, t: u64) -> Result<()> { } pub fn pick_random_ready(conn: &Connection) -> Option<Card> { + let now = time::seconds_since_unix_epoch().ok()?; + let mut stmt = conn .prepare( " SELECT question, responses, state, ready FROM cards - WHERE deleted IS NULL + WHERE deleted IS NULL AND ready <= ? ORDER BY RANDOM() LIMIT 1 ", ) .ok()?; - let mut rows = stmt.query([]).ok()?; + let mut rows = stmt.query([now]).ok()?; let row = rows.next().ok()??; let state_str: String = row.get(2).ok()?; let responses_str: String = row.get(1).ok()?; @@ -101,9 +113,29 @@ pub fn pick_random_ready(conn: &Connection) -> Option<Card> { }) } +pub fn next_ready(conn: &Connection) -> Option<u64> { + let mut stmt = conn + .prepare( + " + SELECT ready + FROM cards + WHERE deleted IS NULL + ORDER BY ready + LIMIT 1 + ", + ) + .ok()?; + + let mut rows = stmt.query([]).ok()?; + let row = rows.next().ok()??; + row.get(0).ok()? +} + pub fn count_available(conn: &Connection) -> Option<i32> { - let now = time::now().ok()?; - let mut stmt = conn.prepare("SELECT COUNT(*) FROM cards WHERE ready <= ? AND deleted IS NULL").ok()?; + let now = time::seconds_since_unix_epoch().ok()?; + let mut stmt = conn + .prepare("SELECT COUNT(*) FROM cards WHERE ready <= ? AND deleted IS NULL") + .ok()?; let mut rows = stmt.query([now]).ok()?; let row = rows.next().ok()??; @@ -111,7 +143,7 @@ pub fn count_available(conn: &Connection) -> Option<i32> { } pub fn update(conn: &Connection, question: &String, state: &space_repetition::State) -> Result<()> { - let now = time::now()?; + let now = time::seconds_since_unix_epoch()?; let ready = now + state.get_interval_seconds(); let state_str = serde_json::to_string(state)?; |