From 1959f0c63a8a6102bcb2a9670264adadfcd66cd3 Mon Sep 17 00:00:00 2001 From: dbr Date: Tue, 27 Apr 2021 19:35:45 +1000 Subject: [PATCH] Implement all_task_uuids and base version methods --- taskchampion/Cargo.toml | 2 +- taskchampion/src/storage/sqlite.rs | 49 +++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/taskchampion/Cargo.toml b/taskchampion/Cargo.toml index 1f8b52828..e5a1ab801 100644 --- a/taskchampion/Cargo.toml +++ b/taskchampion/Cargo.toml @@ -22,7 +22,7 @@ lmdb-rkv = {version = "^0.14.0"} ureq = "^2.1.0" log = "^0.4.14" tindercrypt = { version = "^0.2.2", default-features = false } -rusqlite = { version = "0.25", features = ["bundled", "uuid"] } +rusqlite = { version = "0.25", features = ["bundled", "uuid", "serde_json"] } [dev-dependencies] proptest = "^1.0.0" diff --git a/taskchampion/src/storage/sqlite.rs b/taskchampion/src/storage/sqlite.rs index e31076898..6aaf7b85a 100644 --- a/taskchampion/src/storage/sqlite.rs +++ b/taskchampion/src/storage/sqlite.rs @@ -23,11 +23,15 @@ impl SqliteStorage { pub fn new>(directory: P) -> anyhow::Result { let db_file = directory.as_ref().join("taskchampion.sqlite3"); let con = Connection::open(db_file)?; - con.execute( - "CREATE TABLE IF NOT EXISTS tasks (uuid STRING PRIMARY KEY, data STRING)", - [], - ) - .context("Creating table")?; + + let queries = vec![ + "CREATE TABLE IF NOT EXISTS tasks (uuid STRING PRIMARY KEY, data STRING);", + "CREATE TABLE IF NOT EXISTS sync_meta (key STRING PRIMARY KEY, value STRING);", + ]; + for q in queries { + con.execute(q, []).context("Creating table")?; + } + Ok(SqliteStorage { con }) } } @@ -110,6 +114,7 @@ impl<'t> StorageTxn for Txn<'t> { fn all_tasks(&mut self) -> anyhow::Result> { let t = self.get_txn()?; + let mut q = t.prepare("SELECT uuid, data FROM tasks")?; let rows = q.query_map([], |r| { let uuid: Uuid = r.get("uuid")?; @@ -117,6 +122,7 @@ impl<'t> StorageTxn for Txn<'t> { let data: TaskMap = serde_json::from_str(&data_str).unwrap(); // FIXME: Remove unwrap Ok((uuid, data)) })?; + let mut ret = vec![]; for r in rows { ret.push(r?); @@ -125,15 +131,42 @@ impl<'t> StorageTxn for Txn<'t> { } fn all_task_uuids(&mut self) -> anyhow::Result> { - todo!() + let t = self.get_txn()?; + + let mut q = t.prepare("SELECT uuid FROM tasks")?; + let rows = q.query_map([], |r| { + let uuid: Uuid = r.get("uuid")?; + Ok(uuid) + })?; + + let mut ret = vec![]; + for r in rows { + ret.push(r?); + } + Ok(ret) } fn base_version(&mut self) -> anyhow::Result { - todo!() + let t = self.get_txn()?; + + let mut version = t + .query_row( + "SELECT value FROM sync_meta WHERE key = 'base_version'", + [], + |r| r.get("value"), + ) + .optional()?; + Ok(version.unwrap_or(DEFAULT_BASE_VERSION)) } fn set_base_version(&mut self, version: VersionId) -> anyhow::Result<()> { - todo!() + let t = self.get_txn()?; + t.execute( + "INSERT OR REPLACE INTO sync_meta (key, value) VALUES (?, ?)", + params!["base_version", &version], + ) + .context("Set base version")?; + Ok(()) } fn operations(&mut self) -> anyhow::Result> {