1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use backend::Backend;
use result::Error::SerializationError;
use result::QueryResult;
use serialize::{IsNull, Output, ToSql};
use sql_types::{HasSqlType, TypeMetadata};
pub trait BindCollector<DB: Backend> {
fn push_bound_value<T, U>(
&mut self,
bind: &U,
metadata_lookup: &DB::MetadataLookup,
) -> QueryResult<()>
where
DB: HasSqlType<T>,
U: ToSql<T, DB>;
}
#[derive(Debug)]
pub struct RawBytesBindCollector<DB: Backend + TypeMetadata> {
pub metadata: Vec<DB::TypeMetadata>,
pub binds: Vec<Option<Vec<u8>>>,
}
#[allow(clippy::new_without_default_derive)]
impl<DB: Backend + TypeMetadata> RawBytesBindCollector<DB> {
pub fn new() -> Self {
RawBytesBindCollector {
metadata: Vec::new(),
binds: Vec::new(),
}
}
}
impl<DB: Backend + TypeMetadata> BindCollector<DB> for RawBytesBindCollector<DB> {
fn push_bound_value<T, U>(
&mut self,
bind: &U,
metadata_lookup: &DB::MetadataLookup,
) -> QueryResult<()>
where
DB: HasSqlType<T>,
U: ToSql<T, DB>,
{
let mut to_sql_output = Output::new(Vec::new(), metadata_lookup);
let is_null = bind
.to_sql(&mut to_sql_output)
.map_err(SerializationError)?;
let bytes = to_sql_output.into_inner();
let metadata = <DB as HasSqlType<T>>::metadata(metadata_lookup);
match is_null {
IsNull::No => self.binds.push(Some(bytes)),
IsNull::Yes => self.binds.push(None),
}
self.metadata.push(metadata);
Ok(())
}
}