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