ddb_core/functions/
system.rs1use super::Value;
3use crate::error::Result;
4use uuid::Uuid;
5
6pub fn database(db_name: Option<&str>) -> Value {
8 Value::String(db_name.unwrap_or("main").to_string())
9}
10
11pub fn version() -> Value {
13 Value::String(crate::VERSION.to_string())
14}
15
16pub fn uuid() -> Value {
18 Value::String(Uuid::new_v4().to_string())
19}
20
21pub fn row_number(row: i64) -> Value {
23 Value::Integer(row)
24}
25
26pub fn user() -> Value {
28 Value::String("file_user".to_string())
29}
30
31pub fn connection_id() -> Value {
33 Value::Integer(std::process::id() as i64)
34}
35
36pub fn last_insert_id(id: Option<i64>) -> Value {
38 Value::Integer(id.unwrap_or(0))
39}
40
41pub fn found_rows(count: Option<i64>) -> Value {
43 Value::Integer(count.unwrap_or(0))
44}
45
46pub 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
59pub 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); }
88
89 #[test]
90 fn test_row_number() {
91 assert_eq!(row_number(42), Value::Integer(42));
92 }
93}