kstone_core/
config.rs

1/// Database configuration for resource limits and operational parameters
2#[derive(Debug, Clone)]
3pub struct DatabaseConfig {
4    /// Maximum memtable size in bytes (None = unlimited)
5    pub max_memtable_size_bytes: Option<usize>,
6
7    /// Maximum number of records in memtable before flush
8    pub max_memtable_records: usize,
9
10    /// Maximum WAL size in bytes (None = unlimited)
11    pub max_wal_size_bytes: Option<u64>,
12
13    /// Maximum total disk space in bytes (None = unlimited)
14    pub max_total_disk_bytes: Option<u64>,
15
16    /// Write buffer size for WAL/SST writes
17    pub write_buffer_size: usize,
18}
19
20impl Default for DatabaseConfig {
21    fn default() -> Self {
22        Self {
23            max_memtable_size_bytes: None,
24            max_memtable_records: 1000,
25            max_wal_size_bytes: None,
26            max_total_disk_bytes: None,
27            write_buffer_size: 1024,
28        }
29    }
30}
31
32impl DatabaseConfig {
33    /// Create a new configuration with default values
34    pub fn new() -> Self {
35        Self::default()
36    }
37
38    /// Set maximum memtable size in bytes
39    pub fn with_max_memtable_size_bytes(mut self, size: usize) -> Self {
40        self.max_memtable_size_bytes = Some(size);
41        self
42    }
43
44    /// Set maximum number of records in memtable
45    pub fn with_max_memtable_records(mut self, records: usize) -> Self {
46        self.max_memtable_records = records;
47        self
48    }
49
50    /// Set maximum WAL size in bytes
51    pub fn with_max_wal_size_bytes(mut self, size: u64) -> Self {
52        self.max_wal_size_bytes = Some(size);
53        self
54    }
55
56    /// Set maximum total disk size in bytes
57    pub fn with_max_total_disk_bytes(mut self, size: u64) -> Self {
58        self.max_total_disk_bytes = Some(size);
59        self
60    }
61
62    /// Set write buffer size
63    pub fn with_write_buffer_size(mut self, size: usize) -> Self {
64        self.write_buffer_size = size;
65        self
66    }
67
68    /// Validate configuration values
69    pub fn validate(&self) -> Result<(), String> {
70        if self.max_memtable_records == 0 {
71            return Err("max_memtable_records must be greater than 0".to_string());
72        }
73
74        if self.write_buffer_size == 0 {
75            return Err("write_buffer_size must be greater than 0".to_string());
76        }
77
78        if let Some(size) = self.max_memtable_size_bytes {
79            if size == 0 {
80                return Err("max_memtable_size_bytes must be greater than 0 when set".to_string());
81            }
82        }
83
84        Ok(())
85    }
86}
87
88#[cfg(test)]
89mod tests {
90    use super::*;
91
92    #[test]
93    fn test_default_config() {
94        let config = DatabaseConfig::default();
95        assert_eq!(config.max_memtable_records, 1000);
96        assert_eq!(config.write_buffer_size, 1024);
97        assert!(config.max_memtable_size_bytes.is_none());
98        assert!(config.max_wal_size_bytes.is_none());
99        assert!(config.max_total_disk_bytes.is_none());
100    }
101
102    #[test]
103    fn test_builder_methods() {
104        let config = DatabaseConfig::new()
105            .with_max_memtable_size_bytes(1024 * 1024)
106            .with_max_memtable_records(500)
107            .with_max_wal_size_bytes(10 * 1024 * 1024)
108            .with_write_buffer_size(2048);
109
110        assert_eq!(config.max_memtable_size_bytes, Some(1024 * 1024));
111        assert_eq!(config.max_memtable_records, 500);
112        assert_eq!(config.max_wal_size_bytes, Some(10 * 1024 * 1024));
113        assert_eq!(config.write_buffer_size, 2048);
114    }
115
116    #[test]
117    fn test_validate_success() {
118        let config = DatabaseConfig::default();
119        assert!(config.validate().is_ok());
120    }
121
122    #[test]
123    fn test_validate_zero_records() {
124        let config = DatabaseConfig::new().with_max_memtable_records(0);
125        assert!(config.validate().is_err());
126    }
127
128    #[test]
129    fn test_validate_zero_buffer_size() {
130        let config = DatabaseConfig::new().with_write_buffer_size(0);
131        assert!(config.validate().is_err());
132    }
133}