1#[derive(Debug, Clone)]
3pub struct DatabaseConfig {
4 pub max_memtable_size_bytes: Option<usize>,
6
7 pub max_memtable_records: usize,
9
10 pub max_wal_size_bytes: Option<u64>,
12
13 pub max_total_disk_bytes: Option<u64>,
15
16 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 pub fn new() -> Self {
35 Self::default()
36 }
37
38 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 pub fn with_max_memtable_records(mut self, records: usize) -> Self {
46 self.max_memtable_records = records;
47 self
48 }
49
50 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 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 pub fn with_write_buffer_size(mut self, size: usize) -> Self {
64 self.write_buffer_size = size;
65 self
66 }
67
68 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}