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}