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