simple_database/
memory_store.rs1use super::Error;
2use super::traits::KeyValueStore;
3
4use std::collections::HashMap;
5use std::path::{PathBuf, Path};
6use std::sync::Arc;
7use tokio::sync::Mutex;
8use std::sync::{LazyLock};
9
10use serde::{Serialize, Deserialize};
11
12type Store = Arc<Mutex<(Vec<PathBuf>, HashMap<Vec<u8>, Vec<u8>>)>>;
13
14static MEMORY: LazyLock<Mutex<HashMap<PathBuf, Store>>> = LazyLock::new(|| Mutex::new(HashMap::new()));
15
16
17#[derive(Serialize, Deserialize, Debug)]
18pub struct Partitions {
19 names: Vec<String>
20}
21
22#[derive(Clone)]
23pub struct MemoryStore {
24 location: PathBuf,
25 store: Store
26}
27
28#[async_trait::async_trait]
29impl KeyValueStore for MemoryStore {
30 async fn new(location: PathBuf) -> Result<Self, Error> {
31 let mut memory = MEMORY.lock().await;
32 let store = if let Some(store) = memory.get(&location) {
33 store.clone()
34 } else {
35 let store = Arc::new(Mutex::new((vec![], HashMap::new())));
36 memory.insert(location.clone(), store.clone());
37 store
38 };
39 Ok(MemoryStore{location, store})
40 }
41
42 async fn partition(&self, location: PathBuf) -> Result<Box<dyn KeyValueStore>, Error> {
43 if let Some(ns) = self.get_partition(&location).await {Ok(ns)} else {
44 self.store.lock().await.0.push(location.clone());
45 Ok(Box::new(Self::new(self.location.join(location)).await?))
46 }
47 }
48
49 async fn get_partition(&self, location: &Path) -> Option<Box<dyn KeyValueStore>> {
50 if self.store.lock().await.0.contains(&location.to_path_buf()) {
51 Some(Box::new(Self::new(self.location.join(location)).await.unwrap()))
52 } else {None}
53 }
54
55 async fn clear(&self) -> Result<(), Error> {
56 let mut store = self.store.lock().await;
57 for loc in &store.0 {
58 Box::pin(self.get_partition(loc)).await.unwrap().clear().await?;
59 }
60 store.0.clear();
61 store.1.clear();
62 Ok(())
63 }
64 async fn delete(&self, key: &[u8]) -> Result<(), Error> {
65 self.store.lock().await.1.remove(key);
66 Ok(())
67 }
68 async fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Error> {
69 Ok(self.store.lock().await.1.get(key).cloned())
70 }
71 async fn set(&self, key: &[u8], value: &[u8]) -> Result<(), Error> {
72 self.store.lock().await.1.insert(key.to_vec(), value.to_vec());
73 Ok(())
74 }
75
76 async fn get_all(&self) -> Result<Vec<(Vec<u8>, Vec<u8>)>, Error> {
77 Ok(self.store.lock().await.1.iter().map(|(k, v)| (k.clone(), v.clone())).collect())
78 }
79 async fn keys(&self) -> Result<Vec<Vec<u8>>, Error> {
80 Ok(self.store.lock().await.1.keys().cloned().collect())
81 }
82 async fn values(&self) -> Result<Vec<Vec<u8>>, Error> {
83 Ok(self.store.lock().await.1.values().cloned().collect())
84 }
85
86 fn location(&self) -> PathBuf { self.location.clone() }
87}
88
89impl std::fmt::Debug for MemoryStore {
90 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
91 let mut fmt = f.debug_struct("MemoryStore");
92 fmt
93 .field("location", &self.location)
94 .finish()
95 }
96}