sqlx_core/mssql/protocol/
row.rs

1use bytes::Bytes;
2
3use crate::error::Error;
4use crate::io::BufExt;
5use crate::mssql::{MssqlColumn, MssqlTypeInfo};
6
7#[derive(Debug)]
8pub(crate) struct Row {
9    pub(crate) column_types: Vec<MssqlTypeInfo>,
10    pub(crate) values: Vec<Option<Bytes>>,
11}
12
13impl Row {
14    pub(crate) fn get(
15        buf: &mut Bytes,
16        nullable: bool,
17        columns: &[MssqlColumn],
18    ) -> Result<Self, Error> {
19        let mut values = Vec::with_capacity(columns.len());
20        let mut column_types = Vec::with_capacity(columns.len());
21
22        let nulls = if nullable {
23            buf.get_bytes((columns.len() + 7) / 8)
24        } else {
25            Bytes::from_static(b"")
26        };
27
28        for (i, column) in columns.iter().enumerate() {
29            column_types.push(column.type_info.clone());
30
31            if !(column.type_info.0.is_null() || (nullable && (nulls[i / 8] & (1 << (i % 8))) != 0))
32            {
33                values.push(column.type_info.0.get_value(buf));
34            } else {
35                values.push(None);
36            }
37        }
38
39        Ok(Self {
40            values,
41            column_types,
42        })
43    }
44}