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}