sqlx_core/mssql/protocol/
row.rs1use 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}