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#[derive(Debug, Default, Clone)]
10pub struct MssqlRow {
11 columns: Vec<MssqlColumn>,
12 values: Vec<MssqlValue>,
13}
14
15impl MssqlRow {
16 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}