Skip to main content

sqlx_mssql_odbc_core/
statement.rs

1use crate::{Mssql, MssqlArguments, MssqlColumn, MssqlTypeInfo};
2use sqlx_core::sql_str::SqlStr;
3
4/// Prepared statement metadata for MSSQL via ODBC.
5#[derive(Debug, Clone)]
6pub struct MssqlStatement {
7    sql: SqlStr,
8    columns: Vec<MssqlColumn>,
9    parameters: usize,
10}
11
12impl MssqlStatement {
13    /// Creates a statement metadata value.
14    pub fn new(sql: SqlStr, columns: Vec<MssqlColumn>, parameters: usize) -> Self {
15        Self {
16            sql,
17            columns,
18            parameters,
19        }
20    }
21}
22
23impl sqlx_core::statement::Statement for MssqlStatement {
24    type Database = Mssql;
25
26    fn into_sql(self) -> SqlStr {
27        self.sql
28    }
29
30    fn sql(&self) -> &SqlStr {
31        &self.sql
32    }
33
34    fn parameters(&self) -> Option<sqlx_core::Either<&[MssqlTypeInfo], usize>> {
35        Some(sqlx_core::Either::Right(self.parameters))
36    }
37
38    fn columns(&self) -> &[MssqlColumn] {
39        &self.columns
40    }
41
42    sqlx_core::impl_statement_query!(MssqlArguments);
43}
44
45impl sqlx_core::column::ColumnIndex<MssqlStatement> for usize {
46    fn index(&self, statement: &MssqlStatement) -> Result<usize, sqlx_core::Error> {
47        if *self >= statement.columns.len() {
48            return Err(sqlx_core::Error::ColumnIndexOutOfBounds {
49                index: *self,
50                len: statement.columns.len(),
51            });
52        }
53
54        Ok(*self)
55    }
56}
57
58impl sqlx_core::column::ColumnIndex<MssqlStatement> for &str {
59    fn index(&self, statement: &MssqlStatement) -> Result<usize, sqlx_core::Error> {
60        if let Some(index) = statement
61            .columns
62            .iter()
63            .position(|column| sqlx_core::column::Column::name(column) == *self)
64        {
65            return Ok(index);
66        }
67
68        statement
69            .columns
70            .iter()
71            .position(|column| sqlx_core::column::Column::name(column).eq_ignore_ascii_case(self))
72            .ok_or_else(|| sqlx_core::Error::ColumnNotFound((*self).to_owned()))
73    }
74}