compact_str/features/
sqlx.rs1use 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}