Skip to main content

ddb_core/functions/
system.rs

1// System functions
2use super::Value;
3use crate::error::Result;
4use uuid::Uuid;
5
6/// DATABASE() - Current database name
7pub fn database(db_name: Option<&str>) -> Value {
8    Value::String(db_name.unwrap_or("main").to_string())
9}
10
11/// VERSION() - DDB version
12pub fn version() -> Value {
13    Value::String(crate::VERSION.to_string())
14}
15
16/// UUID() / UUID_GENERATE() - Generate UUID
17pub fn uuid() -> Value {
18    Value::String(Uuid::new_v4().to_string())
19}
20
21/// ROW_NUMBER() - Row number (context-dependent, passed in)
22pub fn row_number(row: i64) -> Value {
23    Value::Integer(row)
24}
25
26/// USER() / CURRENT_USER() - Current user (not applicable for file-based DB)
27pub fn user() -> Value {
28    Value::String("file_user".to_string())
29}
30
31/// CONNECTION_ID() - Connection identifier (file-based, use process ID)
32pub fn connection_id() -> Value {
33    Value::Integer(std::process::id() as i64)
34}
35
36/// LAST_INSERT_ID() - Last inserted ID (would need context)
37pub fn last_insert_id(id: Option<i64>) -> Value {
38    Value::Integer(id.unwrap_or(0))
39}
40
41/// FOUND_ROWS() - Number of rows found (would need context)
42pub fn found_rows(count: Option<i64>) -> Value {
43    Value::Integer(count.unwrap_or(0))
44}
45
46/// BENCHMARK(count, expr) - Run expression count times (for testing)
47pub fn benchmark(count: &Value, expr: impl Fn() -> Result<Value>) -> Result<Value> {
48    let n = count.as_i64()?;
49    let start = std::time::Instant::now();
50
51    for _ in 0..n {
52        let _ = expr()?;
53    }
54
55    let elapsed = start.elapsed();
56    Ok(Value::Float(elapsed.as_secs_f64()))
57}
58
59/// SLEEP(seconds) - Sleep for specified seconds
60pub fn sleep(seconds: &Value) -> Result<Value> {
61    let secs = seconds.as_f64()?;
62    std::thread::sleep(std::time::Duration::from_secs_f64(secs));
63    Ok(Value::Integer(0))
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn test_database() {
72        assert_eq!(database(Some("test")), Value::from("test"));
73        assert_eq!(database(None), Value::from("main"));
74    }
75
76    #[test]
77    fn test_version() {
78        let v = version();
79        assert!(matches!(v, Value::String(_)));
80    }
81
82    #[test]
83    fn test_uuid() {
84        let u1 = uuid();
85        let u2 = uuid();
86        assert_ne!(u1, u2); // UUIDs should be unique
87    }
88
89    #[test]
90    fn test_row_number() {
91        assert_eq!(row_number(42), Value::Integer(42));
92    }
93}