kvp.rs

 1use sqlez_macros::sql;
 2
 3use crate::{define_connection, query};
 4
 5define_connection!(pub static ref KEY_VALUE_STORE: KeyValueStore<()> =
 6    &[sql!(
 7        CREATE TABLE IF NOT EXISTS kv_store(
 8            key TEXT PRIMARY KEY,
 9            value TEXT NOT NULL
10        ) STRICT;
11    )];
12);
13
14impl KeyValueStore {
15    query! {
16        pub fn read_kvp(key: &str) -> Result<Option<String>> {
17            SELECT value FROM kv_store WHERE key = (?)
18        }
19    }
20
21    query! {
22        pub async fn write_kvp(key: String, value: String) -> Result<()> {
23            INSERT OR REPLACE INTO kv_store(key, value) VALUES ((?), (?))
24        }
25    }
26
27    query! {
28        pub async fn delete_kvp(key: String) -> Result<()> {
29            DELETE FROM kv_store WHERE key = (?)
30        }
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use crate::kvp::KeyValueStore;
37
38    #[gpui::test]
39    async fn test_kvp() {
40        let db = KeyValueStore(crate::open_test_db("test_kvp").await);
41
42        assert_eq!(db.read_kvp("key-1").unwrap(), None);
43
44        db.write_kvp("key-1".to_string(), "one".to_string())
45            .await
46            .unwrap();
47        assert_eq!(db.read_kvp("key-1").unwrap(), Some("one".to_string()));
48
49        db.write_kvp("key-1".to_string(), "one-2".to_string())
50            .await
51            .unwrap();
52        assert_eq!(db.read_kvp("key-1").unwrap(), Some("one-2".to_string()));
53
54        db.write_kvp("key-2".to_string(), "two".to_string())
55            .await
56            .unwrap();
57        assert_eq!(db.read_kvp("key-2").unwrap(), Some("two".to_string()));
58
59        db.delete_kvp("key-1".to_string()).await.unwrap();
60        assert_eq!(db.read_kvp("key-1").unwrap(), None);
61    }
62}
63
64define_connection!(pub static ref GLOBAL_KEY_VALUE_STORE: GlobalKeyValueStore<()> =
65    &[sql!(
66        CREATE TABLE IF NOT EXISTS kv_store(
67            key TEXT PRIMARY KEY,
68            value TEXT NOT NULL
69        ) STRICT;
70    )];
71    global
72);
73
74impl GlobalKeyValueStore {
75    query! {
76        pub fn read_kvp(key: &str) -> Result<Option<String>> {
77            SELECT value FROM kv_store WHERE key = (?)
78        }
79    }
80
81    query! {
82        pub async fn write_kvp(key: String, value: String) -> Result<()> {
83            INSERT OR REPLACE INTO kv_store(key, value) VALUES ((?), (?))
84        }
85    }
86
87    query! {
88        pub async fn delete_kvp(key: String) -> Result<()> {
89            DELETE FROM kv_store WHERE key = (?)
90        }
91    }
92}