1use super::MySqlColumn;
2use crate::column::ColumnIndex;
3use crate::error::Error;
4use crate::ext::ustr::UStr;
5use crate::HashMap;
6use crate::{MySql, MySqlArguments, MySqlTypeInfo};
7use either::Either;
8use sqlx_core::sql_str::SqlStr;
9use std::sync::Arc;
10
11pub(crate) use sqlx_core::statement::*;
12
13#[derive(Debug, Clone)]
14pub struct MySqlStatement {
15 pub(crate) sql: SqlStr,
16 pub(crate) metadata: MySqlStatementMetadata,
17}
18
19#[derive(Debug, Default, Clone)]
20pub(crate) struct MySqlStatementMetadata {
21 pub(crate) columns: Arc<Vec<MySqlColumn>>,
22 pub(crate) column_names: Arc<HashMap<UStr, usize>>,
23 pub(crate) parameters: usize,
24}
25
26impl Statement for MySqlStatement {
27 type Database = MySql;
28
29 fn into_sql(self) -> SqlStr {
30 self.sql
31 }
32
33 fn sql(&self) -> &SqlStr {
34 &self.sql
35 }
36
37 fn parameters(&self) -> Option<Either<&[MySqlTypeInfo], usize>> {
38 Some(Either::Right(self.metadata.parameters))
39 }
40
41 fn columns(&self) -> &[MySqlColumn] {
42 &self.metadata.columns
43 }
44
45 impl_statement_query!(MySqlArguments);
46}
47
48impl ColumnIndex<MySqlStatement> for &'_ str {
49 fn index(&self, statement: &MySqlStatement) -> Result<usize, Error> {
50 statement
51 .metadata
52 .column_names
53 .get(*self)
54 .ok_or_else(|| Error::ColumnNotFound((*self).into()))
55 .copied()
56 }
57}