kvp.rs

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