sqlx_mysql/
statement.rs

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}