sqlx_mysql/types/
str.rs

1use crate::decode::Decode;
2use crate::encode::{Encode, IsNull};
3use crate::error::BoxDynError;
4use crate::io::MySqlBufMutExt;
5use crate::protocol::text::{ColumnFlags, ColumnType};
6use crate::types::Type;
7use crate::{MySql, MySqlTypeInfo, MySqlValueRef};
8use std::borrow::Cow;
9
10impl Type<MySql> for str {
11    fn type_info() -> MySqlTypeInfo {
12        MySqlTypeInfo {
13            r#type: ColumnType::VarString, // VARCHAR
14            flags: ColumnFlags::empty(),
15            max_size: None,
16        }
17    }
18
19    fn compatible(ty: &MySqlTypeInfo) -> bool {
20        // TODO: Support more collations being returned from SQL?
21        matches!(
22            ty.r#type,
23            ColumnType::VarChar
24                | ColumnType::Blob
25                | ColumnType::TinyBlob
26                | ColumnType::MediumBlob
27                | ColumnType::LongBlob
28                | ColumnType::String
29                | ColumnType::VarString
30                | ColumnType::Enum
31        ) && !ty.flags.contains(ColumnFlags::BINARY)
32    }
33}
34
35impl Encode<'_, MySql> for &'_ str {
36    fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
37        buf.put_str_lenenc(self);
38
39        Ok(IsNull::No)
40    }
41}
42
43impl<'r> Decode<'r, MySql> for &'r str {
44    fn decode(value: MySqlValueRef<'r>) -> Result<Self, BoxDynError> {
45        value.as_str()
46    }
47}
48
49impl Type<MySql> for Box<str> {
50    fn type_info() -> MySqlTypeInfo {
51        <&str as Type<MySql>>::type_info()
52    }
53
54    fn compatible(ty: &MySqlTypeInfo) -> bool {
55        <&str as Type<MySql>>::compatible(ty)
56    }
57}
58
59impl Encode<'_, MySql> for Box<str> {
60    fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
61        <&str as Encode<MySql>>::encode(&**self, buf)
62    }
63}
64
65impl<'r> Decode<'r, MySql> for Box<str> {
66    fn decode(value: MySqlValueRef<'r>) -> Result<Self, BoxDynError> {
67        <&str as Decode<MySql>>::decode(value).map(Box::from)
68    }
69}
70
71impl Type<MySql> for String {
72    fn type_info() -> MySqlTypeInfo {
73        <str as Type<MySql>>::type_info()
74    }
75
76    fn compatible(ty: &MySqlTypeInfo) -> bool {
77        <str as Type<MySql>>::compatible(ty)
78    }
79}
80
81impl Encode<'_, MySql> for String {
82    fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
83        <&str as Encode<MySql>>::encode(&**self, buf)
84    }
85}
86
87impl Decode<'_, MySql> for String {
88    fn decode(value: MySqlValueRef<'_>) -> Result<Self, BoxDynError> {
89        <&str as Decode<MySql>>::decode(value).map(ToOwned::to_owned)
90    }
91}
92
93impl Type<MySql> for Cow<'_, str> {
94    fn type_info() -> MySqlTypeInfo {
95        <&str as Type<MySql>>::type_info()
96    }
97
98    fn compatible(ty: &MySqlTypeInfo) -> bool {
99        <&str as Type<MySql>>::compatible(ty)
100    }
101}
102
103impl Encode<'_, MySql> for Cow<'_, str> {
104    fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
105        match self {
106            Cow::Borrowed(str) => <&str as Encode<MySql>>::encode(*str, buf),
107            Cow::Owned(str) => <&str as Encode<MySql>>::encode(&**str, buf),
108        }
109    }
110}
111
112impl<'r> Decode<'r, MySql> for Cow<'r, str> {
113    fn decode(value: MySqlValueRef<'r>) -> Result<Self, BoxDynError> {
114        value.as_str().map(Cow::Borrowed)
115    }
116}