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,
V5 = 5,
}
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("5.") => Ok(EngineVersion::V5),
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, EngineVersion::V5].contains(&version));
Ok(())
}
}