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}