kvp.rs

 1use super::Db;
 2use anyhow::Result;
 3use indoc::indoc;
 4use sqlez::migrations::Migration;
 5
 6pub(crate) const KVP_MIGRATION: Migration = Migration::new(
 7    "kvp",
 8    &[indoc! {"
 9    CREATE TABLE kv_store(
10        key TEXT PRIMARY KEY,
11        value TEXT NOT NULL
12    ) STRICT;
13    "}],
14);
15
16impl Db {
17    pub fn read_kvp(&self, key: &str) -> Result<Option<String>> {
18        self.0
19            .prepare("SELECT value FROM kv_store WHERE key = (?)")?
20            .with_bindings(key)?
21            .maybe_row()
22    }
23
24    pub fn write_kvp(&self, key: &str, value: &str) -> Result<()> {
25        self.0
26            .prepare("INSERT OR REPLACE INTO kv_store(key, value) VALUES (?, ?)")?
27            .with_bindings((key, value))?
28            .exec()
29    }
30
31    pub fn delete_kvp(&self, key: &str) -> Result<()> {
32        self.0
33            .prepare("DELETE FROM kv_store WHERE key = (?)")?
34            .with_bindings(key)?
35            .exec()
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use anyhow::Result;
42
43    use super::*;
44
45    #[test]
46    fn test_kvp() -> Result<()> {
47        let db = Db::open_in_memory();
48
49        assert_eq!(db.read_kvp("key-1")?, None);
50
51        db.write_kvp("key-1", "one")?;
52        assert_eq!(db.read_kvp("key-1")?, Some("one".to_string()));
53
54        db.write_kvp("key-1", "one-2")?;
55        assert_eq!(db.read_kvp("key-1")?, Some("one-2".to_string()));
56
57        db.write_kvp("key-2", "two")?;
58        assert_eq!(db.read_kvp("key-2")?, Some("two".to_string()));
59
60        db.delete_kvp("key-1")?;
61        assert_eq!(db.read_kvp("key-1")?, None);
62
63        Ok(())
64    }
65}