sqlx_mssql_odbc_core/
statement.rs1use crate::{Mssql, MssqlArguments, MssqlColumn, MssqlTypeInfo};
2use sqlx_core::sql_str::SqlStr;
3
4#[derive(Debug, Clone)]
6pub struct MssqlStatement {
7 sql: SqlStr,
8 columns: Vec<MssqlColumn>,
9 parameters: usize,
10}
11
12impl MssqlStatement {
13 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}