#[cfg(feature = "arrow")]
use crate::arrow;
use crate::bind_params::BindParameters;
use crate::client::ClientRef;
use crate::cursor::Cursor;
use crate::db_value::ToDbValue;
use crate::error::Error;
use crate::exec_result::ExecResult;
use crate::row::Row;
use crate::statement::StatementHolder;
use crate::statement::StatementOptions;
pub struct Statement<'sql> {
client_ref: ClientRef,
sql: &'sql str,
options: StatementOptions,
cache_statement: bool,
}
impl<'sql> Statement<'sql> {
fn holder(&self) -> Result<StatementHolder, Error> {
let mut client = self.client_ref.lock().unwrap();
let statement = client.get_statement(
self.sql,
self.cache_statement,
&self.options,
)?;
Ok(StatementHolder::new(self.client_ref.clone(), statement))
}
pub(crate) fn new(client_ref: &ClientRef, sql: &'sql str) -> Self {
Self {
client_ref: client_ref.clone(),
sql,
options: StatementOptions::new(),
cache_statement: true,
}
}
pub fn execute(
&self,
params: &[&dyn ToDbValue],
) -> Result<ExecResult, Error> {
let mut holder = self.holder()?;
let mut response = holder.execute(params)?;
Ok(ExecResult::new(&mut response))
}
pub fn execute_batch(
&self,
params: BindParameters,
) -> Result<ExecResult, Error> {
let mut holder = self.holder()?;
let mut response = holder.execute_batch(params)?;
Ok(ExecResult::new(&mut response))
}
pub fn execute_named(
&self,
params: &[(&str, &dyn ToDbValue)],
) -> Result<ExecResult, Error> {
let mut holder = self.holder()?;
let mut response = holder.execute_named(params)?;
Ok(ExecResult::new(&mut response))
}
pub fn exclude_from_cache(&mut self) -> &mut Self {
self.cache_statement = false;
self
}
pub fn fetch_array_size(&mut self, value: u32) -> &mut Self {
self.options.set_fetch_array_size(value);
self
}
pub fn fetch_lobs(&mut self) -> &mut Self {
self.options.set_fetch_lobs();
self
}
pub fn prefetch_rows(&mut self, value: u32) -> &mut Self {
self.options.set_prefetch_rows(value);
self
}
pub fn query(&self, params: &[&dyn ToDbValue]) -> Result<Cursor, Error> {
let mut holder = self.holder()?;
let response = holder.execute(params)?;
let mut cursor = Cursor::new(holder);
cursor.set_from_initial_response(response);
Ok(cursor)
}
#[cfg(feature = "arrow")]
pub fn query_arrow(
&self,
params: BindParameters,
) -> Result<arrow_array::RecordBatch, Error> {
arrow::query_single_batch(self.holder()?, params)
}
pub fn query_named(
&self,
params: &[(&str, &dyn ToDbValue)],
) -> Result<Cursor, Error> {
let mut holder = self.holder()?;
let response = holder.execute_named(params)?;
let mut cursor = Cursor::new(holder);
cursor.set_from_initial_response(response);
Ok(cursor)
}
pub fn query_row(&self, params: &[&dyn ToDbValue]) -> Result<Row, Error> {
let mut cursor = self.query(params)?;
if let Some(row) = cursor.next() {
return row;
}
Err(Error::no_data_found())
}
pub fn query_row_named(
&self,
params: &[(&str, &dyn ToDbValue)],
) -> Result<Row, Error> {
let mut cursor = self.query_named(params)?;
if let Some(row) = cursor.next() {
return row;
}
Err(Error::no_data_found())
}
}