gluesql_shared_memory_storage/
lib.rs

1#![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 {}