1use crate::params::IntoParams;
2use crate::params::Params;
3pub use crate::Column;
4use crate::{Error, Result};
5use crate::{Row, Rows};
6
7#[async_trait::async_trait]
8pub(crate) trait Stmt {
9 fn finalize(&mut self);
10
11 async fn execute(&self, params: &Params) -> Result<usize>;
12
13 async fn query(&self, params: &Params) -> Result<Rows>;
14
15 async fn run(&self, params: &Params) -> Result<()>;
16
17 fn interrupt(&self) -> Result<()>;
18
19 fn reset(&self);
20
21 fn parameter_count(&self) -> usize;
22
23 fn parameter_name(&self, idx: i32) -> Option<&str>;
24
25 fn column_count(&self) -> usize;
26
27 fn columns(&self) -> Vec<Column>;
28}
29
30pub struct Statement {
32 pub(crate) inner: Box<dyn Stmt + Send + Sync>,
33}
34
35impl Statement {
36 pub fn finalize(&mut self) {
38 self.inner.finalize();
39 }
40
41 pub async fn execute(&self, params: impl IntoParams) -> Result<usize> {
43 tracing::trace!("execute for prepared statement");
44 self.inner.execute(¶ms.into_params()?).await
45 }
46
47 pub async fn query(&self, params: impl IntoParams) -> Result<Rows> {
49 tracing::trace!("query for prepared statement");
50 self.inner.query(¶ms.into_params()?).await
51 }
52
53 pub async fn run(&self, params: impl IntoParams) -> Result<()> {
62 tracing::trace!("run for prepared statement");
63 self.inner.run(¶ms.into_params()?).await?;
64 Ok(())
65 }
66
67 pub fn interrupt(&self) -> Result<()> {
69 self.inner.interrupt()
70 }
71
72 pub async fn query_row(&mut self, params: impl IntoParams) -> Result<Row> {
78 let mut rows = self.query(params).await?;
79
80 let row = rows.next().await?.ok_or(Error::QueryReturnedNoRows)?;
81
82 Ok(row)
83 }
84
85 pub fn reset(&self) {
87 self.inner.reset();
88 }
89
90 pub fn parameter_count(&self) -> usize {
92 self.inner.parameter_count()
93 }
94
95 pub fn parameter_name(&self, idx: i32) -> Option<&str> {
97 self.inner.parameter_name(idx)
98 }
99
100 pub fn column_count(&self) -> usize {
102 self.inner.column_count()
103 }
104
105 pub fn columns(&self) -> Vec<Column> {
107 self.inner.columns()
108 }
109}