welds_sqlx_mssql/types/
float.rs1use 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}