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
use conn::Conn;
use conn::futures::Prepare;
use conn::futures::query_result::BinQueryResult;
use conn::futures::query_result::UnconsumedQueryResult;
use conn::futures::query_result::futures::DropResult;
use conn::stmt::futures::Execute;
use errors::*;
use lib_futures::Async;
use lib_futures::Async::Ready;
use lib_futures::Future;
use lib_futures::Poll;
use std::mem;
use value::Params;
steps! {
BatchExec {
Prepare(Prepare),
Execute(Execute),
DropResult(DropResult<BinQueryResult>),
}
}
pub struct BatchExec {
step: Step,
params_vec: Vec<Params>,
current: usize,
}
pub fn new<Q, P>(conn: Conn, query: Q, params_vec: Vec<P>) -> BatchExec
where Q: AsRef<str>,
P: Into<Params>,
{
BatchExec {
step: Step::Prepare(conn.prepare(query)),
params_vec: params_vec.into_iter().map(Into::into).collect(),
current: 0,
}
}
impl Future for BatchExec {
type Item = Conn;
type Error = Error;
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
match try_ready!(self.either_poll()) {
Out::Prepare(stmt) |
Out::DropResult(stmt) => {
let current = self.current;
self.current += 1;
let params = match self.params_vec.get_mut(current) {
Some(params) => mem::replace(params, Params::Empty),
None => return Ok(Ready(stmt.unwrap())),
};
self.step = Step::Execute(stmt.execute(params));
self.poll()
},
Out::Execute(query_result) => {
self.step = Step::DropResult(query_result.drop_result());
self.poll()
},
}
}
}