sqlx_sqlite/types/
bytes.rs

1use std::borrow::Cow;
2
3use crate::decode::Decode;
4use crate::encode::{Encode, IsNull};
5use crate::error::BoxDynError;
6use crate::type_info::DataType;
7use crate::types::Type;
8use crate::{Sqlite, SqliteArgumentValue, SqliteTypeInfo, SqliteValueRef};
9
10impl Type<Sqlite> for [u8] {
11    fn type_info() -> SqliteTypeInfo {
12        SqliteTypeInfo(DataType::Blob)
13    }
14
15    fn compatible(ty: &SqliteTypeInfo) -> bool {
16        matches!(ty.0, DataType::Blob | DataType::Text)
17    }
18}
19
20impl<'q> Encode<'q, Sqlite> for &'q [u8] {
21    fn encode_by_ref(
22        &self,
23        args: &mut Vec<SqliteArgumentValue<'q>>,
24    ) -> Result<IsNull, BoxDynError> {
25        args.push(SqliteArgumentValue::Blob(Cow::Borrowed(self)));
26
27        Ok(IsNull::No)
28    }
29}
30
31impl<'r> Decode<'r, Sqlite> for &'r [u8] {
32    fn decode(value: SqliteValueRef<'r>) -> Result<Self, BoxDynError> {
33        Ok(value.blob())
34    }
35}
36
37impl Type<Sqlite> for Box<[u8]> {
38    fn type_info() -> SqliteTypeInfo {
39        <&[u8] as Type<Sqlite>>::type_info()
40    }
41
42    fn compatible(ty: &SqliteTypeInfo) -> bool {
43        <&[u8] as Type<Sqlite>>::compatible(ty)
44    }
45}
46
47impl Encode<'_, Sqlite> for Box<[u8]> {
48    fn encode(self, args: &mut Vec<SqliteArgumentValue<'_>>) -> Result<IsNull, BoxDynError> {
49        args.push(SqliteArgumentValue::Blob(Cow::Owned(self.into_vec())));
50
51        Ok(IsNull::No)
52    }
53
54    fn encode_by_ref(
55        &self,
56        args: &mut Vec<SqliteArgumentValue<'_>>,
57    ) -> Result<IsNull, BoxDynError> {
58        args.push(SqliteArgumentValue::Blob(Cow::Owned(
59            self.clone().into_vec(),
60        )));
61
62        Ok(IsNull::No)
63    }
64}
65
66impl Decode<'_, Sqlite> for Box<[u8]> {
67    fn decode(value: SqliteValueRef<'_>) -> Result<Self, BoxDynError> {
68        Ok(Box::from(value.blob()))
69    }
70}
71
72impl Type<Sqlite> for Vec<u8> {
73    fn type_info() -> SqliteTypeInfo {
74        <&[u8] as Type<Sqlite>>::type_info()
75    }
76
77    fn compatible(ty: &SqliteTypeInfo) -> bool {
78        <&[u8] as Type<Sqlite>>::compatible(ty)
79    }
80}
81
82impl<'q> Encode<'q, Sqlite> for Vec<u8> {
83    fn encode(self, args: &mut Vec<SqliteArgumentValue<'q>>) -> Result<IsNull, BoxDynError> {
84        args.push(SqliteArgumentValue::Blob(Cow::Owned(self)));
85
86        Ok(IsNull::No)
87    }
88
89    fn encode_by_ref(
90        &self,
91        args: &mut Vec<SqliteArgumentValue<'q>>,
92    ) -> Result<IsNull, BoxDynError> {
93        args.push(SqliteArgumentValue::Blob(Cow::Owned(self.clone())));
94
95        Ok(IsNull::No)
96    }
97}
98
99impl<'r> Decode<'r, Sqlite> for Vec<u8> {
100    fn decode(value: SqliteValueRef<'r>) -> Result<Self, BoxDynError> {
101        Ok(value.blob().to_owned())
102    }
103}