1use crate::{Odbc, OdbcArguments, OdbcColumn, OdbcTypeInfo};
2use sqlx_core::sql_str::SqlStr;
3
4#[derive(Debug, Clone)]
6pub struct OdbcStatement {
7 sql: SqlStr,
8 columns: Vec<OdbcColumn>,
9 parameters: usize,
10}
11
12impl OdbcStatement {
13 pub fn new(sql: SqlStr, columns: Vec<OdbcColumn>, parameters: usize) -> Self {
15 Self {
16 sql,
17 columns,
18 parameters,
19 }
20 }
21}
22
23impl sqlx_core::statement::Statement for OdbcStatement {
24 type Database = Odbc;
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<&[OdbcTypeInfo], usize>> {
35 Some(sqlx_core::Either::Right(self.parameters))
36 }
37
38 fn columns(&self) -> &[OdbcColumn] {
39 &self.columns
40 }
41
42 sqlx_core::impl_statement_query!(OdbcArguments);
43}
44
45impl sqlx_core::column::ColumnIndex<OdbcStatement> for usize {
46 fn index(&self, statement: &OdbcStatement) -> 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<OdbcStatement> for &str {
59 fn index(&self, statement: &OdbcStatement) -> 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}