compact_str/features/
sqlx.rs

1use sqlx::error::BoxDynError;
2#[cfg(any(
3    feature = "sqlx-mysql",
4    feature = "sqlx-postgres",
5    feature = "sqlx-sqlite"
6))]
7use sqlx::{encode::IsNull, Encode};
8use sqlx::{Database, Decode, Type};
9
10use crate::{CompactString, ToCompactString};
11
12#[cfg_attr(docsrs, doc(cfg(feature = "sqlx")))]
13impl<DB> Type<DB> for CompactString
14where
15    DB: Database,
16    for<'x> &'x str: Type<DB>,
17{
18    #[inline]
19    fn type_info() -> <DB as Database>::TypeInfo {
20        <&str as Type<DB>>::type_info()
21    }
22}
23
24#[cfg_attr(docsrs, doc(cfg(feature = "sqlx")))]
25impl<'r, DB> Decode<'r, DB> for CompactString
26where
27    DB: Database,
28    for<'x> &'x str: Decode<'x, DB> + Type<DB>,
29{
30    fn decode(value: <DB as Database>::ValueRef<'r>) -> Result<Self, BoxDynError> {
31        let value = <&str as Decode<DB>>::decode(value)?;
32        Ok(value.try_to_compact_string()?)
33    }
34}
35
36#[cfg(feature = "sqlx-mysql")]
37#[cfg_attr(docsrs, doc(cfg(feature = "sqlx-mysql")))]
38impl<'q> Encode<'q, sqlx::MySql> for CompactString {
39    fn encode_by_ref(
40        &self,
41        buf: &mut <sqlx::MySql as Database>::ArgumentBuffer<'q>,
42    ) -> Result<IsNull, BoxDynError> {
43        Encode::<'_, sqlx::MySql>::encode_by_ref(&self.as_str(), buf)
44    }
45
46    #[inline]
47    fn produces(&self) -> Option<<sqlx::MySql as Database>::TypeInfo> {
48        <&str as Encode<'_, sqlx::MySql>>::produces(&self.as_str())
49    }
50
51    #[inline]
52    fn size_hint(&self) -> usize {
53        <&str as Encode<'_, sqlx::MySql>>::size_hint(&self.as_str())
54    }
55}
56
57#[cfg(feature = "sqlx-postgres")]
58#[cfg_attr(docsrs, doc(cfg(feature = "sqlx-postgres")))]
59impl<'q> Encode<'q, sqlx::Postgres> for CompactString {
60    fn encode_by_ref(
61        &self,
62        buf: &mut <sqlx::Postgres as Database>::ArgumentBuffer<'q>,
63    ) -> Result<IsNull, BoxDynError> {
64        Encode::<'_, sqlx::Postgres>::encode_by_ref(&self.as_str(), buf)
65    }
66
67    #[inline]
68    fn produces(&self) -> Option<<sqlx::Postgres as Database>::TypeInfo> {
69        <&str as Encode<'_, sqlx::Postgres>>::produces(&self.as_str())
70    }
71
72    #[inline]
73    fn size_hint(&self) -> usize {
74        <&str as Encode<'_, sqlx::Postgres>>::size_hint(&self.as_str())
75    }
76}
77
78#[cfg(feature = "sqlx-postgres")]
79#[cfg_attr(docsrs, doc(cfg(feature = "sqlx-postgres")))]
80impl sqlx::postgres::PgHasArrayType for CompactString {
81    fn array_type_info() -> sqlx::postgres::PgTypeInfo {
82        <std::string::String as sqlx::postgres::PgHasArrayType>::array_type_info()
83    }
84}
85
86#[cfg(feature = "sqlx-sqlite")]
87#[cfg_attr(docsrs, doc(cfg(feature = "sqlx-sqlite")))]
88impl<'q> Encode<'q, sqlx::Sqlite> for CompactString {
89    fn encode(
90        self,
91        buf: &mut <sqlx::Sqlite as Database>::ArgumentBuffer<'q>,
92    ) -> Result<IsNull, BoxDynError> {
93        Encode::<'_, sqlx::Sqlite>::encode(self.into_string(), buf)
94    }
95
96    fn encode_by_ref(
97        &self,
98        buf: &mut <sqlx::Sqlite as Database>::ArgumentBuffer<'q>,
99    ) -> Result<IsNull, BoxDynError> {
100        Encode::<'_, sqlx::Sqlite>::encode(alloc::string::String::from(self.as_str()), buf)
101    }
102
103    #[inline]
104    fn produces(&self) -> Option<<sqlx::Sqlite as Database>::TypeInfo> {
105        <&str as Encode<'_, sqlx::Sqlite>>::produces(&self.as_str())
106    }
107
108    #[inline]
109    fn size_hint(&self) -> usize {
110        <&str as Encode<'_, sqlx::Sqlite>>::size_hint(&self.as_str())
111    }
112}