sqlx_mysql/types/
bytes.rs1use std::borrow::Cow;
2use std::rc::Rc;
3use std::sync::Arc;
4
5use crate::decode::Decode;
6use crate::encode::{Encode, IsNull};
7use crate::error::BoxDynError;
8use crate::io::MySqlBufMutExt;
9use crate::protocol::text::ColumnType;
10use crate::types::Type;
11use crate::{MySql, MySqlTypeInfo, MySqlValueRef};
12
13impl Type<MySql> for [u8] {
14 fn type_info() -> MySqlTypeInfo {
15 MySqlTypeInfo::binary(ColumnType::Blob)
16 }
17
18 fn compatible(ty: &MySqlTypeInfo) -> bool {
19 matches!(
20 ty.r#type,
21 ColumnType::VarChar
22 | ColumnType::Blob
23 | ColumnType::TinyBlob
24 | ColumnType::MediumBlob
25 | ColumnType::LongBlob
26 | ColumnType::String
27 | ColumnType::VarString
28 | ColumnType::Enum
29 )
30 }
31}
32
33impl Encode<'_, MySql> for &'_ [u8] {
34 fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
35 buf.put_bytes_lenenc(self);
36
37 Ok(IsNull::No)
38 }
39}
40
41impl<'r> Decode<'r, MySql> for &'r [u8] {
42 fn decode(value: MySqlValueRef<'r>) -> Result<Self, BoxDynError> {
43 value.as_bytes()
44 }
45}
46
47impl Type<MySql> for Vec<u8> {
48 fn type_info() -> MySqlTypeInfo {
49 <[u8] as Type<MySql>>::type_info()
50 }
51
52 fn compatible(ty: &MySqlTypeInfo) -> bool {
53 <&[u8] as Type<MySql>>::compatible(ty)
54 }
55}
56
57impl Encode<'_, MySql> for Vec<u8> {
58 fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
59 <&[u8] as Encode<MySql>>::encode(&**self, buf)
60 }
61}
62
63impl Decode<'_, MySql> for Vec<u8> {
64 fn decode(value: MySqlValueRef<'_>) -> Result<Self, BoxDynError> {
65 <&[u8] as Decode<MySql>>::decode(value).map(ToOwned::to_owned)
66 }
67}
68
69forward_encode_impl!(Arc<[u8]>, &[u8], MySql);
70forward_encode_impl!(Rc<[u8]>, &[u8], MySql);
71forward_encode_impl!(Box<[u8]>, &[u8], MySql);
72forward_encode_impl!(Cow<'_, [u8]>, &[u8], MySql);