Skip to main content

sqlx_odbc/
statement.rs

1use crate::{Odbc, OdbcArguments, OdbcColumn, OdbcTypeInfo};
2use sqlx_core::sql_str::SqlStr;
3
4/// Prepared statement metadata for ODBC.
5#[derive(Debug, Clone)]
6pub struct OdbcStatement {
7    sql: SqlStr,
8    columns: Vec<OdbcColumn>,
9    parameters: usize,
10}
11
12impl OdbcStatement {
13    /// Creates a statement metadata value.
14    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}