use std::sync::Arc;
use crate::adapters::params::convert_params;
use crate::middleware::{ConversionMode, ResultSet, RowValues, SqlMiddlewareDbError};
use super::connection::SqliteConnection;
use super::params::Params;
pub struct SqlitePreparedStatement<'conn> {
connection: &'conn mut SqliteConnection,
query: Arc<String>,
}
impl<'conn> SqlitePreparedStatement<'conn> {
pub(crate) fn new(connection: &'conn mut SqliteConnection, query: Arc<String>) -> Self {
Self { connection, query }
}
pub async fn query(&mut self, params: &[RowValues]) -> Result<ResultSet, SqlMiddlewareDbError> {
let params_owned = convert_params::<Params>(params, ConversionMode::Query)?.0;
self.connection
.execute_select(
self.query.as_ref(),
¶ms_owned,
super::query::build_result_set,
)
.await
}
pub async fn execute(&mut self, params: &[RowValues]) -> Result<usize, SqlMiddlewareDbError> {
let params_owned = convert_params::<Params>(params, ConversionMode::Execute)?.0;
self.connection
.execute_dml(self.query.as_ref(), ¶ms_owned)
.await
}
#[must_use]
pub fn sql(&self) -> &str {
self.query.as_str()
}
}