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