Every lock of the store goes through Db::conn
Db::conn is documented as the one way to take the lock, yet five production and test sites reached past it with db.0.lock(): the startup summary, the desktop's trash sweep and config_get, and tests in sharing and update. All five now call conn(). DRY pass #2, batch 2, F8 (#5372). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -84,7 +84,7 @@ pub fn open_in_memory() -> rusqlite::Result<Db> {
|
|||||||
|
|
||||||
/// A one-line count summary of the store, for the startup log.
|
/// A one-line count summary of the store, for the startup log.
|
||||||
pub fn summary(db: &Db) -> String {
|
pub fn summary(db: &Db) -> String {
|
||||||
let conn = match db.0.lock() {
|
let conn = match db.conn() {
|
||||||
Ok(c) => c,
|
Ok(c) => c,
|
||||||
Err(_) => return "counts unavailable (lock poisoned)".to_string(),
|
Err(_) => return "counts unavailable (lock poisoned)".to_string(),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ mod tests {
|
|||||||
fn the_shared_flag_follows_the_servers_answer_without_dirtying_the_note() {
|
fn the_shared_flag_follows_the_servers_answer_without_dirtying_the_note() {
|
||||||
let db = db();
|
let db = db();
|
||||||
{
|
{
|
||||||
let conn = db.0.lock().unwrap();
|
let conn = db.conn().unwrap();
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"INSERT INTO notes (id, body, created_at, updated_at, dirty)
|
"INSERT INTO notes (id, body, created_at, updated_at, dirty)
|
||||||
VALUES ('n1', 'x', '2026-01-01', '2026-01-01', 0)",
|
VALUES ('n1', 'x', '2026-01-01', '2026-01-01', 0)",
|
||||||
@@ -125,7 +125,7 @@ mod tests {
|
|||||||
created_at: None,
|
created_at: None,
|
||||||
};
|
};
|
||||||
let read = |db: &Db| -> (bool, i64) {
|
let read = |db: &Db| -> (bool, i64) {
|
||||||
let conn = db.0.lock().unwrap();
|
let conn = db.conn().unwrap();
|
||||||
conn.query_row("SELECT shared, dirty FROM notes WHERE id = 'n1'", [], |r| {
|
conn.query_row("SELECT shared, dirty FROM notes WHERE id = 'n1'", [], |r| {
|
||||||
Ok((r.get(0)?, r.get(1)?))
|
Ok((r.get(0)?, r.get(1)?))
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ pub fn config_get(db: State<'_, Db>) -> PublicConfig {
|
|||||||
// be enforced. A store error falls back to the default rather than failing the
|
// be enforced. A store error falls back to the default rather than failing the
|
||||||
// call — the app must still boot.
|
// call — the app must still boot.
|
||||||
let fallback = retention::LOCAL_RETENTION_DAYS;
|
let fallback = retention::LOCAL_RETENTION_DAYS;
|
||||||
let retention_days = match db.0.lock() {
|
let retention_days = match db.conn() {
|
||||||
Ok(conn) => state::effective_retention_days(&conn, fallback).unwrap_or(fallback),
|
Ok(conn) => state::effective_retention_days(&conn, fallback).unwrap_or(fallback),
|
||||||
Err(_) => fallback,
|
Err(_) => fallback,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -269,7 +269,7 @@ fn paint_window_before_the_webview_does(app: &tauri::App) {
|
|||||||
/// user is present for is one they can see the result of. A failure here is logged and
|
/// user is present for is one they can see the result of. A failure here is logged and
|
||||||
/// stepped over — housekeeping must never be the reason the app won't open.
|
/// stepped over — housekeeping must never be the reason the app won't open.
|
||||||
fn sweep_local_trash(db: &local::Db) {
|
fn sweep_local_trash(db: &local::Db) {
|
||||||
let conn = match db.0.lock() {
|
let conn = match db.conn() {
|
||||||
Ok(conn) => conn,
|
Ok(conn) => conn,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
log::warn!("skipping the trash sweep: store lock poisoned");
|
log::warn!("skipping the trash sweep: store lock poisoned");
|
||||||
|
|||||||
@@ -553,7 +553,7 @@ mod tests {
|
|||||||
|
|
||||||
/// The channel `update_check` would actually use.
|
/// The channel `update_check` would actually use.
|
||||||
fn effective(db: &Db) -> Channel {
|
fn effective(db: &Db) -> Channel {
|
||||||
let conn = db.0.lock().expect("lock");
|
let conn = db.conn().expect("lock");
|
||||||
store::pref(&conn, CHANNEL_PREF)
|
store::pref(&conn, CHANNEL_PREF)
|
||||||
.expect("read pref")
|
.expect("read pref")
|
||||||
.as_deref()
|
.as_deref()
|
||||||
@@ -562,7 +562,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_channel(db: &Db, channel: Channel) {
|
fn set_channel(db: &Db, channel: Channel) {
|
||||||
let conn = db.0.lock().expect("lock");
|
let conn = db.conn().expect("lock");
|
||||||
store::set_pref(&conn, CHANNEL_PREF, channel.as_str()).expect("set pref");
|
store::set_pref(&conn, CHANNEL_PREF, channel.as_str()).expect("set pref");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -702,7 +702,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_server(db: &Db, value: &str) {
|
fn set_server(db: &Db, value: &str) {
|
||||||
let conn = db.0.lock().expect("lock");
|
let conn = db.conn().expect("lock");
|
||||||
store::set_pref(&conn, SERVER_PREF, value).expect("set pref");
|
store::set_pref(&conn, SERVER_PREF, value).expect("set pref");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -780,7 +780,7 @@ mod tests {
|
|||||||
let db = db();
|
let db = db();
|
||||||
assert_eq!(token_for(&db, "https://notes.example.com"), Ok(None));
|
assert_eq!(token_for(&db, "https://notes.example.com"), Ok(None));
|
||||||
{
|
{
|
||||||
let conn = db.0.lock().expect("lock");
|
let conn = db.conn().expect("lock");
|
||||||
state::set_link(&conn, "https://notes.example.com/", "tok").expect("link");
|
state::set_link(&conn, "https://notes.example.com/", "tok").expect("link");
|
||||||
}
|
}
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|||||||
Reference in New Issue
Block a user