gluesql_shared_memory_storage/
lib.rs1#![deny(clippy::str_to_string)]
2
3mod alter_table;
4mod index;
5mod transaction;
6
7use {
8 async_trait::async_trait,
9 futures::stream,
10 gluesql_core::{
11 data::{Key, Schema},
12 error::Result,
13 store::{DataRow, Metadata, RowIter, Store, StoreMut},
14 },
15 gluesql_memory_storage::MemoryStorage,
16 std::sync::Arc,
17 tokio::sync::RwLock,
18};
19
20#[derive(Clone, Debug)]
21pub struct SharedMemoryStorage {
22 pub database: Arc<RwLock<MemoryStorage>>,
23}
24
25impl SharedMemoryStorage {
26 pub fn new() -> Self {
27 let database = MemoryStorage::default();
28 let database = Arc::new(RwLock::new(database));
29
30 Self { database }
31 }
32}
33
34impl Default for SharedMemoryStorage {
35 fn default() -> Self {
36 Self::new()
37 }
38}
39
40impl From<MemoryStorage> for SharedMemoryStorage {
41 fn from(storage: MemoryStorage) -> Self {
42 let database = Arc::new(RwLock::new(storage));
43 Self { database }
44 }
45}
46
47#[async_trait(?Send)]
48impl Store for SharedMemoryStorage {
49 async fn fetch_all_schemas(&self) -> Result<Vec<Schema>> {
50 let database = Arc::clone(&self.database);
51 let database = database.read().await;
52
53 database.fetch_all_schemas().await
54 }
55 async fn fetch_schema(&self, table_name: &str) -> Result<Option<Schema>> {
56 let database = Arc::clone(&self.database);
57 let database = database.read().await;
58
59 database.fetch_schema(table_name).await
60 }
61
62 async fn fetch_data(&self, table_name: &str, key: &Key) -> Result<Option<DataRow>> {
63 let database = Arc::clone(&self.database);
64 let database = database.read().await;
65
66 database.fetch_data(table_name, key).await
67 }
68
69 async fn scan_data<'a>(&'a self, table_name: &str) -> Result<RowIter<'a>> {
70 let rows = self
71 .database
72 .read()
73 .await
74 .scan_data(table_name)
75 .into_iter()
76 .map(Ok);
77
78 Ok(Box::pin(stream::iter(rows)))
79 }
80}
81
82#[async_trait(?Send)]
83impl StoreMut for SharedMemoryStorage {
84 async fn insert_schema(&mut self, schema: &Schema) -> Result<()> {
85 let database = Arc::clone(&self.database);
86 let mut database = database.write().await;
87
88 database.insert_schema(schema).await
89 }
90
91 async fn delete_schema(&mut self, table_name: &str) -> Result<()> {
92 let database = Arc::clone(&self.database);
93 let mut database = database.write().await;
94
95 database.delete_schema(table_name).await
96 }
97
98 async fn append_data(&mut self, table_name: &str, rows: Vec<DataRow>) -> Result<()> {
99 let database = Arc::clone(&self.database);
100 let mut database = database.write().await;
101
102 database.append_data(table_name, rows).await
103 }
104
105 async fn insert_data(&mut self, table_name: &str, rows: Vec<(Key, DataRow)>) -> Result<()> {
106 let database = Arc::clone(&self.database);
107 let mut database = database.write().await;
108
109 database.insert_data(table_name, rows).await
110 }
111
112 async fn delete_data(&mut self, table_name: &str, keys: Vec<Key>) -> Result<()> {
113 let database = Arc::clone(&self.database);
114 let mut database = database.write().await;
115
116 database.delete_data(table_name, keys).await
117 }
118}
119
120impl Metadata for SharedMemoryStorage {}
121impl gluesql_core::store::CustomFunction for SharedMemoryStorage {}
122impl gluesql_core::store::CustomFunctionMut for SharedMemoryStorage {}