use super::*;
use odbc_sys::*;
pub type State = [SQLCHAR; SQL_SQLSTATE_SIZE + 1];
#[derive(Debug, Clone, Copy)]
pub struct DiagResult {
pub state: State,
pub native_error: SQLINTEGER,
pub text_length: SQLSMALLINT,
}
pub trait Diagnostics {
fn diagnostics(
&self,
rec_number: SQLSMALLINT,
message_text: &mut [SQLCHAR],
) -> ReturnOption<DiagResult>;
}
impl<H: Handle> Diagnostics for H {
fn diagnostics(
&self,
rec_number: SQLSMALLINT,
message_text: &mut [SQLCHAR],
) -> ReturnOption<DiagResult> {
unsafe {
let mut text_length = 0;
let mut state = [0; 6];
let mut native_error = 0;
let ret = SQLGetDiagRec(
H::handle_type(),
self.handle(),
rec_number,
state.as_mut_ptr(),
&mut native_error,
message_text.as_mut_ptr(),
message_text.buf_len(),
&mut text_length,
);
let result = DiagResult {
text_length: text_length,
state: state,
native_error: native_error,
};
match ret {
SQL_SUCCESS => ReturnOption::Success(result),
SQL_SUCCESS_WITH_INFO => ReturnOption::Info(result),
SQL_ERROR => ReturnOption::Error(()),
SQL_NO_DATA => ReturnOption::NoData(()),
unexpected => panic!("SQLGetDiagRec returned: {:?}", unexpected),
}
}
}
}
impl<S, E> Diagnostics for Return<S, E>
where
S: Diagnostics,
E: Diagnostics,
{
fn diagnostics(
&self,
rec_number: SQLSMALLINT,
message_text: &mut [SQLCHAR],
) -> ReturnOption<DiagResult> {
match self {
&Success(ref s) | &Info(ref s) => s.diagnostics(rec_number, message_text),
&Error(ref e) => e.diagnostics(rec_number, message_text),
}
}
}