use super::*;
use sys::*;
use std::marker::PhantomData;
use version::VersionOption;
#[derive(Debug)]
pub struct Environment<V: VersionOption> {
version: PhantomData<V>,
handle: HEnv,
}
impl<V: VersionOption> Environment<V> {
pub fn as_raw(&self) -> SQLHENV {
self.handle.as_raw()
}
fn transit<Other: VersionOption>(self) -> Environment<Other> {
Environment {
version: PhantomData,
handle: self.handle,
}
}
}
impl<V: Version> Environment<V> {
pub(crate) fn as_henv(&self) -> &HEnv {
&self.handle
}
pub fn data_sources(
&mut self,
direction: FetchOrientation,
server_name: &mut [u8],
description: &mut [u8],
) -> ReturnOption<(SQLSMALLINT, SQLSMALLINT)> {
self.handle.data_sources(
direction,
server_name,
description,
)
}
pub fn drivers(
&mut self,
direction: FetchOrientation,
description: &mut [u8],
attributes: &mut [u8],
) -> ReturnOption<(SQLSMALLINT, SQLSMALLINT)> {
self.handle.drivers(direction, description, attributes)
}
}
impl Environment<NoVersion> {
pub fn new() -> Return<Self> {
HEnv::allocate().map(|handle| {
Environment {
version: PhantomData,
handle: handle,
}
})
}
pub fn declare_version<V: Version>(mut self) -> Return<Environment<V>, Environment<NoVersion>> {
let result = self.handle.declare_version(V::constant());
match result {
Success(()) => Success(self.transit()),
Info(()) => Success(self.transit()),
Error(()) => Success(self.transit()),
}
}
pub fn declare_version_3_8(self) -> Return<Environment<Odbc3m8>, Environment<NoVersion>> {
self.declare_version()
}
pub fn declare_version_3(self) -> Return<Environment<Odbc3>, Environment<NoVersion>> {
self.declare_version()
}
}
impl<V: VersionOption> Diagnostics for Environment<V> {
fn diagnostics(
&self,
rec_number: SQLSMALLINT,
message_text: &mut [SQLCHAR],
) -> ReturnOption<DiagResult> {
self.handle.diagnostics(rec_number, message_text)
}
}