Fix/SQL Retrievability Underflow

This commit is contained in:
Luc Mcgrady 2025-11-08 16:41:38 +00:00
parent dac26ce671
commit ec3d187ce2
No known key found for this signature in database
GPG key ID: 4F3D7A0B17CC3D9C

View file

@ -332,14 +332,14 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> {
return Ok(None); return Ok(None);
}; };
let seconds_elapsed = if let Some(last_review_time) = card_data.last_review_time { let seconds_elapsed = if let Some(last_review_time) = card_data.last_review_time {
now.saturating_sub(last_review_time.0) as u32 (now as u32).saturating_sub(last_review_time.0 as u32)
} else if due > 365_000 { } else if due > 365_000 {
// (re)learning card in seconds // (re)learning card in seconds
let Ok(ivl) = ctx.get_raw(2).as_i64() else { let Ok(ivl) = ctx.get_raw(2).as_i64() else {
return Ok(None); return Ok(None);
}; };
let last_review_time = due.saturating_sub(ivl); let last_review_time = (due as u32).saturating_sub(ivl as u32);
now.saturating_sub(last_review_time) as u32 (now as u32).saturating_sub(last_review_time as u32)
} else { } else {
let Ok(ivl) = ctx.get_raw(2).as_i64() else { let Ok(ivl) = ctx.get_raw(2).as_i64() else {
return Ok(None); return Ok(None);
@ -347,8 +347,8 @@ fn add_extract_fsrs_retrievability(db: &Connection) -> rusqlite::Result<()> {
let Ok(days_elapsed) = ctx.get_raw(3).as_i64() else { let Ok(days_elapsed) = ctx.get_raw(3).as_i64() else {
return Ok(None); return Ok(None);
}; };
let review_day = due.saturating_sub(ivl); let review_day = (due as u32).saturating_sub(ivl as u32);
days_elapsed.saturating_sub(review_day) as u32 * 86_400 (days_elapsed as u32).saturating_sub(review_day as u32) * 86_400
}; };
let decay = card_data.decay.unwrap_or(FSRS5_DEFAULT_DECAY); let decay = card_data.decay.unwrap_or(FSRS5_DEFAULT_DECAY);
let retrievability = card_data.memory_state().map(|state| { let retrievability = card_data.memory_state().map(|state| {
@ -416,8 +416,8 @@ fn add_extract_fsrs_relative_retrievability(db: &Connection) -> rusqlite::Result
let Ok(ivl) = ctx.get_raw(2).as_i64() else { let Ok(ivl) = ctx.get_raw(2).as_i64() else {
return Ok(None); return Ok(None);
}; };
let last_review_time = due.saturating_sub(ivl); let last_review_time = due.saturating_sub(ivl) as u32;
now.saturating_sub(last_review_time) as u32 (now as u32).saturating_sub(last_review_time)
} else { } else {
let Ok(ivl) = ctx.get_raw(2).as_i64() else { let Ok(ivl) = ctx.get_raw(2).as_i64() else {
return Ok(None); return Ok(None);