Skip to main content

cypherlite_core/
config.rs

1// DatabaseConfig
2
3use std::path::PathBuf;
4
5/// Sync mode for WAL operations.
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub enum SyncMode {
8    /// Full fsync after every write (maximum durability).
9    Full,
10    /// Normal sync (OS decides when to flush).
11    Normal,
12}
13
14/// Configuration for opening or creating a CypherLite database.
15#[derive(Debug, Clone)]
16pub struct DatabaseConfig {
17    /// Path to the main database file (.cyl).
18    pub path: PathBuf,
19    /// Page size in bytes (always 4096).
20    pub page_size: u32,
21    /// Number of pages in the buffer pool cache.
22    pub cache_capacity: usize,
23    /// WAL synchronization mode.
24    pub wal_sync_mode: SyncMode,
25    /// Enable automatic _created_at / _updated_at timestamp tracking (default: true).
26    pub temporal_tracking_enabled: bool,
27    /// Enable version storage for pre-update snapshots (default: true when temporal tracking enabled).
28    pub version_storage_enabled: bool,
29}
30
31impl Default for DatabaseConfig {
32    fn default() -> Self {
33        Self {
34            path: PathBuf::from("database.cyl"),
35            page_size: 4096,
36            cache_capacity: 256,
37            wal_sync_mode: SyncMode::Full,
38            temporal_tracking_enabled: true,
39            version_storage_enabled: true,
40        }
41    }
42}
43
44impl DatabaseConfig {
45    /// Returns the path to the WAL file associated with this database.
46    pub fn wal_path(&self) -> PathBuf {
47        self.path.with_extension("cyl-wal")
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    // REQ-PAGE-001: Always read/write in 4KB fixed pages
56    #[test]
57    fn test_default_page_size_is_4096() {
58        let config = DatabaseConfig::default();
59        assert_eq!(config.page_size, 4096);
60    }
61
62    // REQ-BUF-001: Default 256 pages (1MB)
63    #[test]
64    fn test_default_cache_capacity_is_256() {
65        let config = DatabaseConfig::default();
66        assert_eq!(config.cache_capacity, 256);
67    }
68
69    // REQ-TX-007: Default to Full sync for durability
70    #[test]
71    fn test_default_sync_mode_is_full() {
72        let config = DatabaseConfig::default();
73        assert_eq!(config.wal_sync_mode, SyncMode::Full);
74    }
75
76    #[test]
77    fn test_default_path() {
78        let config = DatabaseConfig::default();
79        assert_eq!(config.path, PathBuf::from("database.cyl"));
80    }
81
82    // REQ-WAL-001: WAL file path derivation
83    #[test]
84    fn test_wal_path_derivation() {
85        let config = DatabaseConfig {
86            path: PathBuf::from("/tmp/test.cyl"),
87            ..Default::default()
88        };
89        assert_eq!(config.wal_path(), PathBuf::from("/tmp/test.cyl-wal"));
90    }
91
92    // REQ-BUF-007: User-configurable capacity
93    #[test]
94    fn test_custom_cache_capacity() {
95        let config = DatabaseConfig {
96            cache_capacity: 1024,
97            ..Default::default()
98        };
99        assert_eq!(config.cache_capacity, 1024);
100    }
101
102    // V-004: Temporal tracking enabled by default
103    #[test]
104    fn test_default_temporal_tracking_enabled() {
105        let config = DatabaseConfig::default();
106        assert!(config.temporal_tracking_enabled);
107    }
108
109    // V-004: Temporal tracking can be disabled
110    #[test]
111    fn test_temporal_tracking_can_be_disabled() {
112        let config = DatabaseConfig {
113            temporal_tracking_enabled: false,
114            ..Default::default()
115        };
116        assert!(!config.temporal_tracking_enabled);
117    }
118
119    // W-005: Version storage enabled by default
120    #[test]
121    fn test_default_version_storage_enabled() {
122        let config = DatabaseConfig::default();
123        assert!(config.version_storage_enabled);
124    }
125
126    // W-005: Version storage can be disabled
127    #[test]
128    fn test_version_storage_can_be_disabled() {
129        let config = DatabaseConfig {
130            version_storage_enabled: false,
131            ..Default::default()
132        };
133        assert!(!config.version_storage_enabled);
134    }
135
136    #[test]
137    fn test_config_clone() {
138        let config = DatabaseConfig::default();
139        let cloned = config.clone();
140        assert_eq!(cloned.page_size, config.page_size);
141        assert_eq!(cloned.cache_capacity, config.cache_capacity);
142    }
143}