Skip to main content

sqlx_sqlserver/
row.rs

1use sqlx_core::column::{Column, ColumnIndex};
2use sqlx_core::error::Error;
3use sqlx_core::row::Row;
4use sqlx_core::value::Value;
5
6use crate::{Mssql, MssqlColumn, MssqlValue, MssqlValueRef};
7
8/// SQL Server row skeleton.
9#[derive(Debug, Default, Clone)]
10pub struct MssqlRow {
11    columns: Vec<MssqlColumn>,
12    values: Vec<MssqlValue>,
13}
14
15impl MssqlRow {
16    /// Creates an empty row skeleton.
17    pub fn empty() -> Self {
18        Self::default()
19    }
20
21    pub(crate) fn new(columns: Vec<MssqlColumn>, values: Vec<MssqlValue>) -> Self {
22        Self { columns, values }
23    }
24}
25
26impl Row for MssqlRow {
27    type Database = Mssql;
28
29    fn columns(&self) -> &[MssqlColumn] {
30        &self.columns
31    }
32
33    fn try_get_raw<I>(&self, index: I) -> Result<MssqlValueRef<'_>, Error>
34    where
35        I: ColumnIndex<Self>,
36    {
37        let index = index.index(self)?;
38        Ok(self.values[index].as_ref())
39    }
40}
41
42impl ColumnIndex<MssqlRow> for usize {
43    fn index(&self, row: &MssqlRow) -> Result<usize, Error> {
44        if *self >= row.columns.len() {
45            return Err(Error::ColumnIndexOutOfBounds {
46                index: *self,
47                len: row.columns.len(),
48            });
49        }
50
51        Ok(*self)
52    }
53}
54
55impl ColumnIndex<MssqlRow> for &'_ str {
56    fn index(&self, row: &MssqlRow) -> Result<usize, Error> {
57        row.columns
58            .iter()
59            .position(|column| column.name() == *self)
60            .ok_or_else(|| Error::ColumnNotFound((*self).to_owned()))
61    }
62}