welds_sqlx_mssql/types/
float.rs

1use byteorder::{ByteOrder, LittleEndian};
2
3use crate::decode::Decode;
4use crate::encode::{Encode, IsNull};
5use crate::error::BoxDynError;
6use crate::protocol::type_info::{DataType, TypeInfo};
7use crate::{Mssql, MssqlTypeInfo, MssqlValueRef};
8use sqlx_core::types::Type;
9
10impl Type<Mssql> for f32 {
11    fn type_info() -> MssqlTypeInfo {
12        MssqlTypeInfo(TypeInfo::new(DataType::FloatN, 4))
13    }
14
15    fn compatible(ty: &MssqlTypeInfo) -> bool {
16        matches!(ty.0.ty, DataType::Real | DataType::FloatN) && ty.0.size == 4
17    }
18}
19
20impl Encode<'_, Mssql> for f32 {
21    fn encode_by_ref(&self, buf: &mut Vec<u8>) -> IsNull {
22        buf.extend(&self.to_le_bytes());
23
24        IsNull::No
25    }
26}
27
28impl Decode<'_, Mssql> for f32 {
29    fn decode(value: MssqlValueRef<'_>) -> Result<Self, BoxDynError> {
30        Ok(LittleEndian::read_f32(value.as_bytes()?))
31    }
32}
33
34impl Type<Mssql> for f64 {
35    fn type_info() -> MssqlTypeInfo {
36        MssqlTypeInfo(TypeInfo::new(DataType::FloatN, 8))
37    }
38
39    fn compatible(ty: &MssqlTypeInfo) -> bool {
40        matches!(ty.0.ty, DataType::Float | DataType::FloatN) && ty.0.size == 8
41    }
42}
43
44impl Encode<'_, Mssql> for f64 {
45    fn encode_by_ref(&self, buf: &mut Vec<u8>) -> IsNull {
46        buf.extend(&self.to_le_bytes());
47
48        IsNull::No
49    }
50}
51
52impl Decode<'_, Mssql> for f64 {
53    fn decode(value: MssqlValueRef<'_>) -> Result<Self, BoxDynError> {
54        Ok(LittleEndian::read_f64(value.as_bytes()?))
55    }
56}