1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use crate::{FbError, Queryable};
pub trait SystemInfos {
fn db_name(&mut self) -> Result<String, FbError>;
fn server_engine(&mut self) -> Result<EngineVersion, FbError>;
}
#[derive(PartialOrd, PartialEq, Eq, Debug, Copy, Clone)]
#[repr(u8)]
pub enum EngineVersion {
V1 = 1,
V2 = 2,
V3 = 3,
V4 = 4,
}
impl<T> SystemInfos for T
where
T: Queryable,
{
fn db_name(&mut self) -> Result<String, FbError> {
let (name,): (String,) = self
.query_first(
"SELECT rdb$get_context('SYSTEM', 'DB_NAME') from rdb$database;",
(),
)?
.unwrap();
Ok(name)
}
fn server_engine(&mut self) -> Result<EngineVersion, FbError> {
let row: Option<(String,)> = self.query_first(
"SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') from rdb$database;",
(),
)?;
if let Some((version,)) = row {
return match &version.get(0..2) {
Some("4.") => Ok(EngineVersion::V4),
Some("3.") => Ok(EngineVersion::V3),
Some("2.") => Ok(EngineVersion::V2),
_ => Err(FbError::from(format!("Version not detected: {}", version))),
};
}
Ok(EngineVersion::V1)
}
}
#[cfg(test)]
mk_tests_default! {
use crate::*;
#[test]
fn server_engine() -> Result<(), FbError> {
let mut conn = cbuilder().connect()?;
let version = conn.server_engine()?;
assert!([EngineVersion::V2, EngineVersion::V3, EngineVersion::V4].contains(&version));
Ok(())
}
}