use crate::params::IntoParams;
use crate::params::Params;
pub use crate::Column;
use crate::{Error, Result};
use crate::{Row, Rows};
#[async_trait::async_trait]
pub(crate) trait Stmt {
fn finalize(&mut self);
async fn execute(&self, params: &Params) -> Result<usize>;
async fn query(&self, params: &Params) -> Result<Rows>;
async fn run(&self, params: &Params) -> Result<()>;
fn interrupt(&self) -> Result<()>;
fn reset(&self);
fn parameter_count(&self) -> usize;
fn parameter_name(&self, idx: i32) -> Option<&str>;
fn column_count(&self) -> usize;
fn columns(&self) -> Vec<Column>;
}
pub struct Statement {
pub(crate) inner: Box<dyn Stmt + Send + Sync>,
}
impl Statement {
pub fn finalize(&mut self) {
self.inner.finalize();
}
pub async fn execute(&self, params: impl IntoParams) -> Result<usize> {
tracing::trace!("execute for prepared statement");
self.inner.execute(¶ms.into_params()?).await
}
pub async fn query(&self, params: impl IntoParams) -> Result<Rows> {
tracing::trace!("query for prepared statement");
self.inner.query(¶ms.into_params()?).await
}
pub async fn run(&self, params: impl IntoParams) -> Result<()> {
tracing::trace!("run for prepared statement");
self.inner.run(¶ms.into_params()?).await?;
Ok(())
}
pub fn interrupt(&self) -> Result<()> {
self.inner.interrupt()
}
pub async fn query_row(&mut self, params: impl IntoParams) -> Result<Row> {
let mut rows = self.query(params).await?;
let row = rows.next().await?.ok_or(Error::QueryReturnedNoRows)?;
Ok(row)
}
pub fn reset(&self) {
self.inner.reset();
}
pub fn parameter_count(&self) -> usize {
self.inner.parameter_count()
}
pub fn parameter_name(&self, idx: i32) -> Option<&str> {
self.inner.parameter_name(idx)
}
pub fn column_count(&self) -> usize {
self.inner.column_count()
}
pub fn columns(&self) -> Vec<Column> {
self.inner.columns()
}
}