mappy_core/storage/
mod.rs1use crate::MapletResult;
6use async_trait::async_trait;
7use serde::{Deserialize, Serialize};
8
9pub mod aof;
10pub mod disk;
11pub mod hybrid;
12pub mod memory;
13
14#[derive(Debug, Clone, Serialize, Deserialize, Default)]
16pub struct StorageStats {
17 pub total_keys: u64,
19 pub memory_usage: u64,
21 pub disk_usage: u64,
23 pub operations_count: u64,
25 pub avg_latency_us: u64,
27}
28
29#[async_trait]
31pub trait Storage: Send + Sync {
32 async fn get(&self, key: &str) -> MapletResult<Option<Vec<u8>>>;
34
35 async fn set(&self, key: String, value: Vec<u8>) -> MapletResult<()>;
37
38 async fn delete(&self, key: &str) -> MapletResult<bool>;
40
41 async fn exists(&self, key: &str) -> MapletResult<bool>;
43
44 async fn keys(&self) -> MapletResult<Vec<String>>;
46
47 async fn clear_database(&self) -> MapletResult<()>;
49
50 async fn flush(&self) -> MapletResult<()>;
52
53 async fn close(&self) -> MapletResult<()>;
55
56 async fn stats(&self) -> MapletResult<StorageStats>;
58}
59
60pub struct StorageFactory;
62
63impl StorageFactory {
64 pub async fn create_storage(
66 mode: PersistenceMode,
67 config: StorageConfig,
68 ) -> MapletResult<Box<dyn Storage>> {
69 match mode {
70 PersistenceMode::Memory => Ok(Box::new(memory::MemoryStorage::new(config)?)),
71 PersistenceMode::Disk => Ok(Box::new(disk::DiskStorage::new(config)?)),
72 PersistenceMode::AOF => Ok(Box::new(aof::AOFStorage::new(config)?)),
73 PersistenceMode::Hybrid => Ok(Box::new(hybrid::HybridStorage::new(config)?)),
74 }
75 }
76}
77
78#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
80pub enum PersistenceMode {
81 Memory,
83 AOF,
85 Disk,
87 Hybrid,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct StorageConfig {
94 pub data_dir: String,
96 pub max_memory: Option<u64>,
98 pub enable_compression: bool,
100 pub sync_interval: u64,
102 pub write_buffer_size: usize,
104}
105
106impl Default for StorageConfig {
107 fn default() -> Self {
108 Self {
109 data_dir: "./data".to_string(),
110 max_memory: None,
111 enable_compression: true,
112 sync_interval: 1,
113 write_buffer_size: 1024 * 1024, }
115 }
116}