pub use self::connected::{Connected, AutocommitOff, AutocommitOn, AutocommitMode};
pub use self::hdbc_wrapper::HDbcWrapper;
pub use self::unconnected::Unconnected;
use super::*;
use sys::*;
use std::ops::DerefMut;
mod connected;
mod unconnected;
mod hdbc_wrapper;
#[derive(Debug)]
pub struct DataSource<'env, S: HDbcWrapper<'env> = Unconnected<'env>> {
handle: S::Handle
}
impl<'env, Any> DataSource<'env, Any>
where
Any: HDbcWrapper<'env>,
{
pub fn into_raw(self) -> SQLHDBC {
self.handle.into_hdbc().into_raw()
}
pub fn as_raw(&self) -> SQLHDBC {
self.handle.as_raw()
}
pub unsafe fn from_raw(raw: SQLHDBC) -> Self {
DataSource { handle: Any::from_hdbc(HDbc::from_raw(raw)) }
}
fn transit<Other: HDbcWrapper<'env>>(self) -> DataSource<'env, Other> {
DataSource { handle: Other::from_hdbc(self.handle.into_hdbc()) }
}
}
impl<'env> DataSource<'env, Unconnected<'env>> {
pub fn with_parent<V>(parent: &'env Environment<V>) -> Return<Self>
where
V: Version,
{
HDbc::allocate(parent.as_henv()).map(|handle| {
DataSource { handle: Unconnected::from_hdbc(handle) }
})
}
pub fn connect<DSN, U, P>(
mut self,
data_source_name: &DSN,
user: &U,
pwd: &P,
) -> Return<Connection<'env, AutocommitOn>, DataSource<'env, Unconnected<'env>>>
where
DSN: SqlStr + ?Sized,
U: SqlStr + ?Sized,
P: SqlStr + ?Sized,
{
match self.handle.connect(data_source_name, user, pwd) {
Success(()) => Success(self.transit()),
Info(()) => Info(self.transit()),
Error(()) => Error(self.transit()),
}
}
pub fn connect_with_connection_string<C>(
mut self,
connection_string: &C,
) -> Return<Connection<'env, AutocommitOn>, Self>
where
C: SqlStr + ?Sized,
{
let mut out_connection_string = [];
match self.handle.driver_connect(
connection_string,
&mut out_connection_string,
SQL_DRIVER_NOPROMPT,
) {
Success(_) => Success(self.transit()),
Info(_) => Info(self.transit()),
Error(()) => Error(self.transit()),
}
}
}
impl<'env, AC: AutocommitMode> Connection<'env, AC> {
pub(crate) fn as_hdbc(&self) -> &HDbc {
&self.handle
}
pub fn disconnect(mut self) -> Return<DataSource<'env, Unconnected<'env>>, Connection<'env, AC>> {
match self.handle.disconnect() {
Success(()) => Success(self.transit()),
Info(()) => Info(self.transit()),
Error(()) => Error(self.transit()),
}
}
pub fn is_read_only(&mut self) -> Return<bool> {
self.handle.is_read_only()
}
}
impl<'env> Connection<'env, AutocommitOff> {
pub fn enable_autocommit(mut self) -> Return<Connection<'env, AutocommitOn>, Self> {
match self.handle.set_autocommit(true) {
Success(_) => Success(self.transit()),
Info(_) => Info(self.transit()),
Error(()) => Error(self.transit()),
}
}
pub fn commit(&mut self) -> Return<()> {
self.handle.commit()
}
pub fn rollback(&mut self) -> Return<()> {
self.handle.rollback()
}
}
impl<'env> Connection<'env, AutocommitOn> {
pub fn disable_autocommit(mut self) -> Return<Connection<'env, AutocommitOff>, Self> {
match self.handle.set_autocommit(false) {
Success(_) => Success(self.transit()),
Info(_) => Info(self.transit()),
Error(()) => Error(self.transit()),
}
}
}
impl<'env, S> Diagnostics for DataSource<'env, S>
where
S: HDbcWrapper<'env>,
{
fn diagnostics(
&self,
rec_number: SQLSMALLINT,
message_text: &mut [SQLCHAR],
) -> ReturnOption<DiagResult> {
self.handle.diagnostics(rec_number, message_text)
}
}