use oracledb;
use rstest::*;
pub struct TableGuard<'a> {
conn: &'a oracledb::Connection,
table_name: &'a str,
}
impl TableGuard<'_> {
fn create_table(&self, definition: &str) -> Result<(), oracledb::Error> {
let sql = format!("create table {} ({})", self.table_name, definition);
self.conn.execute(&sql, &[])?;
Ok(())
}
fn drop_table(&self) -> Result<(), oracledb::Error> {
let sql = format!("drop table {} purge", self.table_name);
let result = self.conn.execute(&sql, &[]);
if let Err(err) = result {
if let oracledb::ErrorKind::DbError(message) = err.kind() {
if !message.starts_with("ORA-00942:") {
return Err(err);
}
}
}
Ok(())
}
}
impl Drop for TableGuard<'_> {
fn drop(&mut self) {
let _ = self.drop_table();
}
}
fn is_db_min_version(
conn: &oracledb::Connection,
major_version: usize,
minor_version: usize,
) -> bool {
let version = conn.version().unwrap();
version.0 > major_version
|| (version.0 == major_version && version.1 >= minor_version)
}
#[allow(dead_code)]
#[fixture]
pub fn conn() -> oracledb::Connection {
let config = oracledb::get_test_config().config.clone();
oracledb::connect(config).unwrap()
}
#[allow(dead_code)]
pub fn create_table<'a>(
conn: &'a oracledb::Connection,
table_name: &'a str,
definition: &str,
) -> Result<TableGuard<'a>, oracledb::Error> {
let guard = TableGuard { conn, table_name };
guard.drop_table()?;
guard.create_table(definition)?;
Ok(guard)
}
pub fn skip_test(reason: &str) -> bool {
println!("SKIPPED: {reason}");
true
}
#[allow(dead_code)]
pub fn skip_unless_native_boolean_supported(
conn: &oracledb::Connection,
) -> bool {
if is_db_min_version(conn, 23, 0) {
false
} else {
skip_test("database does not support native boolean (requires 23+)")
}
}
#[allow(dead_code)]
pub fn skip_unless_native_json_supported(conn: &oracledb::Connection) -> bool {
if is_db_min_version(conn, 21, 0) {
false
} else {
skip_test("database does not support native JSON (requires 21+)")
}
}
#[allow(dead_code)]
pub fn skip_unless_sparse_vectors_supported(
conn: &oracledb::Connection,
) -> bool {
if is_db_min_version(conn, 23, 7) {
false
} else {
skip_test("database does not support sparse vectors (requires 23.7+)")
}
}
#[allow(dead_code)]
pub fn skip_unless_vectors_supported(conn: &oracledb::Connection) -> bool {
if is_db_min_version(conn, 23, 4) {
false
} else {
skip_test("database does not support vectors (requires 23.4+)")
}
}