Implement all_task_uuids and base version methods
This commit is contained in:
@@ -22,7 +22,7 @@ lmdb-rkv = {version = "^0.14.0"}
|
|||||||
ureq = "^2.1.0"
|
ureq = "^2.1.0"
|
||||||
log = "^0.4.14"
|
log = "^0.4.14"
|
||||||
tindercrypt = { version = "^0.2.2", default-features = false }
|
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]
|
[dev-dependencies]
|
||||||
proptest = "^1.0.0"
|
proptest = "^1.0.0"
|
||||||
|
|||||||
@@ -23,11 +23,15 @@ impl SqliteStorage {
|
|||||||
pub fn new<P: AsRef<Path>>(directory: P) -> anyhow::Result<SqliteStorage> {
|
pub fn new<P: AsRef<Path>>(directory: P) -> anyhow::Result<SqliteStorage> {
|
||||||
let db_file = directory.as_ref().join("taskchampion.sqlite3");
|
let db_file = directory.as_ref().join("taskchampion.sqlite3");
|
||||||
let con = Connection::open(db_file)?;
|
let con = Connection::open(db_file)?;
|
||||||
con.execute(
|
|
||||||
"CREATE TABLE IF NOT EXISTS tasks (uuid STRING PRIMARY KEY, data STRING)",
|
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);",
|
||||||
.context("Creating table")?;
|
];
|
||||||
|
for q in queries {
|
||||||
|
con.execute(q, []).context("Creating table")?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(SqliteStorage { con })
|
Ok(SqliteStorage { con })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,6 +114,7 @@ impl<'t> StorageTxn for Txn<'t> {
|
|||||||
|
|
||||||
fn all_tasks(&mut self) -> anyhow::Result<Vec<(Uuid, TaskMap)>> {
|
fn all_tasks(&mut self) -> anyhow::Result<Vec<(Uuid, TaskMap)>> {
|
||||||
let t = self.get_txn()?;
|
let t = self.get_txn()?;
|
||||||
|
|
||||||
let mut q = t.prepare("SELECT uuid, data FROM tasks")?;
|
let mut q = t.prepare("SELECT uuid, data FROM tasks")?;
|
||||||
let rows = q.query_map([], |r| {
|
let rows = q.query_map([], |r| {
|
||||||
let uuid: Uuid = r.get("uuid")?;
|
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
|
let data: TaskMap = serde_json::from_str(&data_str).unwrap(); // FIXME: Remove unwrap
|
||||||
Ok((uuid, data))
|
Ok((uuid, data))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let mut ret = vec![];
|
let mut ret = vec![];
|
||||||
for r in rows {
|
for r in rows {
|
||||||
ret.push(r?);
|
ret.push(r?);
|
||||||
@@ -125,15 +131,42 @@ impl<'t> StorageTxn for Txn<'t> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn all_task_uuids(&mut self) -> anyhow::Result<Vec<Uuid>> {
|
fn all_task_uuids(&mut self) -> anyhow::Result<Vec<Uuid>> {
|
||||||
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<VersionId> {
|
fn base_version(&mut self) -> anyhow::Result<VersionId> {
|
||||||
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<()> {
|
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<Vec<Operation>> {
|
fn operations(&mut self) -> anyhow::Result<Vec<Operation>> {
|
||||||
|
|||||||
Reference in New Issue
Block a user