Skip to main content

ddb_core/engine/
system_vars.rs

1// System variables (similar to MSSQL @@VARIABLES)
2use crate::functions::Value;
3use std::collections::HashMap;
4
5pub struct SystemVariables {
6    variables: HashMap<String, Value>,
7}
8
9impl SystemVariables {
10    pub fn new() -> Self {
11        let mut variables = HashMap::new();
12
13        // Static system variables
14        variables.insert("VERSION".to_string(), Value::String(env!("CARGO_PKG_VERSION").to_string()));
15        variables.insert("DB_NAME".to_string(), Value::String("DDB".to_string()));
16        variables.insert("DB_TYPE".to_string(), Value::String("Flat File Database".to_string()));
17
18        // Runtime variables (initialized with defaults)
19        variables.insert("ROWS_SCANNED".to_string(), Value::Integer(0));
20        variables.insert("ROWS_RETURNED".to_string(), Value::Integer(0));
21        variables.insert("LAST_ERROR".to_string(), Value::Null);
22
23        SystemVariables { variables }
24    }
25
26    /// Get a system variable value
27    pub fn get(&self, name: &str) -> Option<&Value> {
28        self.variables.get(&name.to_uppercase())
29    }
30
31    /// Set a system variable value (for runtime variables)
32    pub fn set(&mut self, name: &str, value: Value) {
33        self.variables.insert(name.to_uppercase(), value);
34    }
35
36    /// Get all available system variable names
37    pub fn list_variables(&self) -> Vec<String> {
38        let mut vars: Vec<_> = self.variables.keys().cloned().collect();
39        vars.sort();
40        vars
41    }
42}
43
44impl Default for SystemVariables {
45    fn default() -> Self {
46        Self::new()
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn test_system_variables() {
56        let sys_vars = SystemVariables::new();
57
58        // Test static variables
59        assert!(sys_vars.get("VERSION").is_some());
60        assert!(sys_vars.get("DB_NAME").is_some());
61
62        // Test case insensitivity
63        assert_eq!(sys_vars.get("VERSION"), sys_vars.get("version"));
64    }
65
66    #[test]
67    fn test_set_variable() {
68        let mut sys_vars = SystemVariables::new();
69
70        sys_vars.set("ROWS_SCANNED", Value::Integer(42));
71        assert_eq!(sys_vars.get("ROWS_SCANNED"), Some(&Value::Integer(42)));
72    }
73
74    #[test]
75    fn test_list_variables() {
76        let sys_vars = SystemVariables::new();
77        let vars = sys_vars.list_variables();
78
79        assert!(vars.contains(&"VERSION".to_string()));
80        assert!(vars.contains(&"DB_NAME".to_string()));
81        assert!(vars.contains(&"ROWS_SCANNED".to_string()));
82    }
83}