use num_enum::TryFromPrimitive;
use crate::*;
pub trait FirebirdClientEmbeddedAttach: FirebirdClient {
fn attach_database(&mut self, db_name: &str, user: &str) -> Result<Self::DbHandle, FbError>;
}
pub trait FirebirdClientRemoteAttach: FirebirdClient {
fn attach_database(
&mut self,
host: &str,
port: u16,
db_name: &str,
user: &str,
pass: &str,
) -> Result<Self::DbHandle, FbError>;
}
pub trait FirebirdClient: Send {
type DbHandle: Send + Clone + Copy;
type TrHandle: Send + Clone + Copy;
type StmtHandle: Send + Clone + Copy;
type Args: Send + Sync + Clone;
fn new(charset: Charset, args: Self::Args) -> Result<Self, FbError>
where
Self: Sized;
fn detach_database(&mut self, db_handle: Self::DbHandle) -> Result<(), FbError>;
fn drop_database(&mut self, db_handle: Self::DbHandle) -> Result<(), FbError>;
fn begin_transaction(
&mut self,
db_handle: Self::DbHandle,
isolation_level: TrIsolationLevel,
) -> Result<Self::TrHandle, FbError>;
fn transaction_operation(&mut self, tr_handle: Self::TrHandle, op: TrOp)
-> Result<(), FbError>;
fn exec_immediate(
&mut self,
db_handle: Self::DbHandle,
tr_handle: Self::TrHandle,
dialect: Dialect,
sql: &str,
) -> Result<(), FbError>;
fn prepare_statement(
&mut self,
db_handle: Self::DbHandle,
tr_handle: Self::TrHandle,
dialect: Dialect,
sql: &str,
) -> Result<(StmtType, Self::StmtHandle), FbError>;
fn free_statement(
&mut self,
stmt_handle: Self::StmtHandle,
op: FreeStmtOp,
) -> Result<(), FbError>;
fn execute(
&mut self,
db_handle: Self::DbHandle,
tr_handle: Self::TrHandle,
stmt_handle: Self::StmtHandle,
params: Vec<SqlType>,
) -> Result<(), FbError>;
fn execute2(
&mut self,
db_handle: Self::DbHandle,
tr_handle: Self::TrHandle,
stmt_handle: Self::StmtHandle,
params: Vec<SqlType>,
) -> Result<Vec<Column>, FbError>;
fn fetch(
&mut self,
db_handle: Self::DbHandle,
tr_handle: Self::TrHandle,
stmt_handle: Self::StmtHandle,
) -> Result<Option<Vec<Column>>, FbError>;
}
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
#[repr(u8)]
pub enum Dialect {
D1 = 1,
D2 = 2,
D3 = 3,
}
#[repr(u8)]
pub enum TrIsolationLevel {
Concurrency = ibase::isc_tpb_concurrency as u8,
Concistency = ibase::isc_tpb_consistency as u8,
ReadCommited = ibase::isc_tpb_read_committed as u8,
}
impl Default for TrIsolationLevel {
fn default() -> Self {
Self::ReadCommited
}
}
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
pub enum TrOp {
Commit,
CommitRetaining,
Rollback,
RollbackRetaining,
}
#[repr(u8)]
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
pub enum FreeStmtOp {
Close = ibase::DSQL_close as u8,
Drop = ibase::DSQL_drop as u8,
}
#[repr(u8)]
#[derive(Debug, Eq, PartialEq, Copy, Clone, TryFromPrimitive)]
pub enum StmtType {
Select = ibase::isc_info_sql_stmt_select as u8,
Insert = ibase::isc_info_sql_stmt_insert as u8,
Update = ibase::isc_info_sql_stmt_update as u8,
Delete = ibase::isc_info_sql_stmt_delete as u8,
DDL = ibase::isc_info_sql_stmt_ddl as u8,
GetSegment = ibase::isc_info_sql_stmt_get_segment as u8,
PutSegment = ibase::isc_info_sql_stmt_put_segment as u8,
ExecProcedure = ibase::isc_info_sql_stmt_exec_procedure as u8,
StartTrans = ibase::isc_info_sql_stmt_start_trans as u8,
Commit = ibase::isc_info_sql_stmt_commit as u8,
Rollback = ibase::isc_info_sql_stmt_rollback as u8,
SelectForUpd = ibase::isc_info_sql_stmt_select_for_upd as u8,
SetGenerator = ibase::isc_info_sql_stmt_set_generator as u8,
Savepoint = ibase::isc_info_sql_stmt_savepoint as u8,
}