sqlx_sqlite/types/
bytes.rs1use 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}