1use super::*;
2
3pub trait Params {
4 fn as_vec_params(&self) -> Result<Vec<Param>>;
5}
6
7impl Params for () {
8 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(Vec::new()) }
9}
10impl<A> Params for A where A: ToParam, {
11 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.to_param()?]) }
12}
13impl<A, B> Params
14for (A, B)
15where A: ToParam, B: ToParam,
16{
17 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?]) }
18}
19impl<A, B, C> Params
20for (A, B, C)
21where A: ToParam, B: ToParam, C: ToParam,
22{
23 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?]) }
24}
25impl<A, B, C, D> Params
26for (A, B, C, D)
27where A: ToParam, B: ToParam, C: ToParam, D: ToParam,
28{
29 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?]) }
30}
31impl<A, B, C, D, E> Params
32for (A, B, C, D, E)
33where A: ToParam, B: ToParam, C: ToParam, D: ToParam, E: ToParam,
34{
35 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?, self.4.to_param()?]) }
36}
37impl<A, B, C, D, E, F> Params
38for (A, B, C, D, E, F)
39where A: ToParam, B: ToParam, C: ToParam, D: ToParam, E: ToParam, F: ToParam, {
40 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?, self.4.to_param()?, self.5.to_param()?]) }
41}
42impl<A, B, C, D, E, F, G> Params
43for (A, B, C, D, E, F, G)
44where A: ToParam, B: ToParam, C: ToParam, D: ToParam, E: ToParam, F: ToParam, G: ToParam, {
45 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?, self.4.to_param()?, self.5.to_param()?, self.6.to_param()?]) }
46}
47impl<A, B, C, D, E, F, G, H> Params
48for (A, B, C, D, E, F, G, H)
49where A: ToParam, B: ToParam, C: ToParam, D: ToParam, E: ToParam, F: ToParam, G: ToParam, H: ToParam, {
50 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?, self.4.to_param()?, self.5.to_param()?, self.6.to_param()?, self.7.to_param()?]) }
51}
52impl<A, B, C, D, E, F, G, H, I> Params
53for (A, B, C, D, E, F, G, H, I)
54where A: ToParam, B: ToParam, C: ToParam, D: ToParam, E: ToParam, F: ToParam, G: ToParam, H: ToParam, I: ToParam, {
55 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?, self.4.to_param()?, self.5.to_param()?, self.6.to_param()?, self.7.to_param()?, self.8.to_param()?]) }
56}
57impl<A, B, C, D, E, F, G, H, I, J> Params
58for (A, B, C, D, E, F, G, H, I, J)
59where A: ToParam, B: ToParam, C: ToParam, D: ToParam, E: ToParam, F: ToParam, G: ToParam, H: ToParam, I: ToParam, J: ToParam, {
60 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?, self.4.to_param()?, self.5.to_param()?, self.6.to_param()?, self.7.to_param()?, self.8.to_param()?, self.9.to_param()?]) }
61}
62impl<A, B, C, D, E, F, G, H, I, J, K> Params
63for (A, B, C, D, E, F, G, H, I, J, K)
64where A: ToParam, B: ToParam, C: ToParam, D: ToParam, E: ToParam, F: ToParam, G: ToParam, H: ToParam, I: ToParam, J: ToParam, K: ToParam, {
65 fn as_vec_params(&self) -> Result<Vec<Param>> { Ok(vec![self.0.to_param()?, self.1.to_param()?, self.2.to_param()?, self.3.to_param()?, self.4.to_param()?, self.5.to_param()?, self.6.to_param()?, self.7.to_param()?, self.8.to_param()?, self.9.to_param()?, self.10.to_param()?]) }
66}
67
68
69#[derive(Debug)]
70pub enum Param {
71 Null,
72 Bytes(Vec<u8>),
73 SmallInt(i16),
74 Int(i32),
75 BigInt(i64),
76 Real(f32),
77 Double(f64),
78 Text(String),
79 NaiveDate(chrono::naive::NaiveDate),
80 NaiveDateTime(chrono::naive::NaiveDateTime),
81 Bool(bool),
82}
83
84#[cfg(feature = "postgres")]
85impl ::postgres::types::ToSql for Param {
86 fn to_sql(&self, ty: &::postgres::types::Type, out: &mut bytes::BytesMut) -> std::result::Result<::postgres::types::IsNull, Box<dyn std::error::Error + Sync + Send>>
87 where Self: Sized
88 {
89 match self {
90 Param::Null => Ok(::postgres::types::IsNull::Yes),
91 Param::Bytes(v) => v.to_sql(ty, out),
92 Param::SmallInt(v) => v.to_sql(ty, out),
93 Param::Int(v) => v.to_sql(ty, out),
94 Param::BigInt(v) => v.to_sql(ty, out),
95 Param::Real(v) => v.to_sql(ty, out),
96 Param::Double(v) => v.to_sql(ty, out),
97 Param::Text(v) => v.to_sql(ty, out),
98 Param::NaiveDate(v) => v.to_sql(ty, out),
99 Param::NaiveDateTime(v) => v.to_sql(ty, out),
100 Param::Bool(v) => v.to_sql(ty, out),
101 }
102 }
103
104 fn accepts(ty: &::postgres::types::Type) -> bool {
105 match ty {
106 _ => true,
107 }
108 }
109
110 fn to_sql_checked(&self, ty: &::postgres::types::Type, out: &mut bytes::BytesMut) -> std::result::Result<::postgres::types::IsNull, Box<dyn std::error::Error + Send + Sync>> {
111 match self {
112 Param::Null => Ok(::postgres::types::IsNull::Yes),
113 Param::Bytes(v) => v.to_sql_checked(ty, out),
114 Param::SmallInt(v) => v.to_sql_checked(ty, out),
115 Param::Int(v) => v.to_sql_checked(ty, out),
116 Param::BigInt(v) => v.to_sql_checked(ty, out),
117 Param::Real(v) => v.to_sql_checked(ty, out),
118 Param::Double(v) => v.to_sql_checked(ty, out),
119 Param::Text(v) => v.to_sql_checked(ty, out),
120 Param::NaiveDate(v) => v.to_sql_checked(ty, out),
121 Param::NaiveDateTime(v) => v.to_sql_checked(ty, out),
122 Param::Bool(v) => v.to_sql_checked(ty, out),
123 }
124 }
125}
126
127#[cfg(feature = "sqlite")]
128impl ::rusqlite::types::ToSql for Param {
129 fn to_sql(&self) -> ::rusqlite::Result<::rusqlite::types::ToSqlOutput<'_>> {
130 match self {
131 Param::Null => ::rusqlite::types::Null.to_sql(),
132 Param::Bytes(v) => v.to_sql(),
133 Param::SmallInt(v) => v.to_sql(),
134 Param::Int(v) => v.to_sql(),
135 Param::BigInt(v) => v.to_sql(),
136 Param::Real(v) => v.to_sql(),
137 Param::Double(v) => v.to_sql(),
138 Param::Text(v) => v.to_sql(),
139 Param::NaiveDate(v) => v.to_sql(),
140 Param::NaiveDateTime(v) => v.to_sql(),
141 Param::Bool(v) => v.to_sql(),
142 }
143 }
144}
145
146#[cfg(feature = "mysql")]
147impl TryFrom<Param> for ::mysql::Value {
148 type Error = Error;
149 fn try_from(p: Param) -> std::result::Result<Self, Self::Error> {
150 match p {
151 Param::Null => Ok(::mysql::Value::NULL),
152 Param::Bytes(v) => Ok(v.into()),
153 Param::SmallInt(v) => Ok(v.into()),
154 Param::Int(v) => Ok(v.into()),
155 Param::BigInt(v) => Ok(v.into()),
156 Param::Real(v) => Ok(v.into()),
157 Param::Double(v) => Ok(v.into()),
158 Param::Text(v) => Ok(v.into()),
159 Param::NaiveDate(v) => Ok(v.into()),
160 Param::NaiveDateTime(v) => Ok(v.into()),
161 Param::Bool(v) => Ok((if v { 1 } else { 0 }).into()),
162 }
163 }
164}
165
166pub trait ToParam { fn to_param(&self) -> Result<Param>; }
167impl ToParam for Vec<u8> { fn to_param(&self) -> Result<Param> { Ok(Param::Bytes(self.clone())) } }
168impl ToParam for bool { fn to_param(&self) -> Result<Param> { Ok(Param::Bool((*self).into())) } }
170impl ToParam for usize { fn to_param(&self) -> Result<Param> { Ok(Param::BigInt((*self).try_into()?)) } }
171impl ToParam for u8 { fn to_param(&self) -> Result<Param> { Ok(Param::SmallInt((*self).into())) } }
172impl ToParam for u16 { fn to_param(&self) -> Result<Param> { Ok(Param::SmallInt((*self).try_into()?)) } }
173impl ToParam for u32 { fn to_param(&self) -> Result<Param> { Ok(Param::Int((*self).try_into()?)) } }
174impl ToParam for u64 { fn to_param(&self) -> Result<Param> { Ok(Param::BigInt((*self).try_into()?)) } }
175impl ToParam for isize { fn to_param(&self) -> Result<Param> { Ok(Param::BigInt((*self).try_into()?)) } }
176impl ToParam for i8 { fn to_param(&self) -> Result<Param> { Ok(Param::SmallInt((*self).into())) } }
177impl ToParam for i16 { fn to_param(&self) -> Result<Param> { Ok(Param::SmallInt((*self).into())) } }
178impl ToParam for i32 { fn to_param(&self) -> Result<Param> { Ok(Param::Int((*self).into())) } }
179impl ToParam for i64 { fn to_param(&self) -> Result<Param> { Ok(Param::BigInt(*self)) } }
180impl ToParam for f32 { fn to_param(&self) -> Result<Param> { Ok(Param::Real((*self).into())) } }
181impl ToParam for f64 { fn to_param(&self) -> Result<Param> { Ok(Param::Double(*self)) } }
182impl ToParam for String { fn to_param(&self) -> Result<Param> { Ok(Param::Text(self.clone())) } }
183impl ToParam for chrono::naive::NaiveDate { fn to_param(&self) -> Result<Param> { Ok(Param::NaiveDate(self.clone())) } }
184impl ToParam for chrono::naive::NaiveDateTime { fn to_param(&self) -> Result<Param> { Ok(Param::NaiveDateTime(self.clone())) } }
185
186impl<T> ToParam for Option<T>
187where T: ToParam
188{
189 fn to_param(&self) -> Result<Param> {
190 if let Some(v) = self {
191 v.to_param()
192 } else {
193 Ok(Param::Null)
194 }
195 }
196}
197