sqlx_core_oldapi/mssql/
value.rs

1use crate::error::{BoxDynError, UnexpectedNullError};
2use crate::mssql::{Mssql, MssqlTypeInfo};
3use crate::value::{Value, ValueRef};
4use bytes::Bytes;
5use std::borrow::Cow;
6
7/// Implementation of [`ValueRef`] for MSSQL.
8#[derive(Clone, Debug)]
9pub struct MssqlValueRef<'r> {
10    pub(crate) type_info: MssqlTypeInfo,
11    pub(crate) data: Option<&'r Bytes>,
12}
13
14impl<'r> MssqlValueRef<'r> {
15    pub(crate) fn as_bytes(&self) -> Result<&'r [u8], BoxDynError> {
16        match &self.data {
17            Some(v) => Ok(v),
18            None => Err(UnexpectedNullError.into()),
19        }
20    }
21}
22
23impl ValueRef<'_> for MssqlValueRef<'_> {
24    type Database = Mssql;
25
26    fn to_owned(&self) -> MssqlValue {
27        MssqlValue {
28            data: self.data.cloned(),
29            type_info: self.type_info.clone(),
30        }
31    }
32
33    fn type_info(&self) -> Cow<'_, MssqlTypeInfo> {
34        Cow::Borrowed(&self.type_info)
35    }
36
37    fn is_null(&self) -> bool {
38        self.data.is_none() || self.type_info.0.is_null()
39    }
40}
41
42#[cfg(feature = "any")]
43impl<'r> From<MssqlValueRef<'r>> for crate::any::AnyValueRef<'r> {
44    #[inline]
45    fn from(value: MssqlValueRef<'r>) -> Self {
46        crate::any::AnyValueRef {
47            type_info: value.type_info.clone().into(),
48            kind: crate::any::value::AnyValueRefKind::Mssql(value),
49        }
50    }
51}
52
53/// Implementation of [`Value`] for MSSQL.
54#[derive(Clone)]
55pub struct MssqlValue {
56    pub(crate) type_info: MssqlTypeInfo,
57    pub(crate) data: Option<Bytes>,
58}
59
60impl Value for MssqlValue {
61    type Database = Mssql;
62
63    fn as_ref(&self) -> MssqlValueRef<'_> {
64        MssqlValueRef {
65            data: self.data.as_ref(),
66            type_info: self.type_info.clone(),
67        }
68    }
69
70    fn type_info(&self) -> Cow<'_, MssqlTypeInfo> {
71        Cow::Borrowed(&self.type_info)
72    }
73
74    fn is_null(&self) -> bool {
75        self.data.is_none() || self.type_info.0.is_null()
76    }
77}
78
79#[cfg(feature = "any")]
80impl From<MssqlValue> for crate::any::AnyValue {
81    #[inline]
82    fn from(value: MssqlValue) -> Self {
83        crate::any::AnyValue {
84            type_info: value.type_info.clone().into(),
85            kind: crate::any::value::AnyValueKind::Mssql(value),
86        }
87    }
88}