Support statement closure
This commit is contained in:
parent
f03b4b181a
commit
fd1724a6e2
@ -555,6 +555,32 @@ impl Connection {
|
|||||||
.boxed()
|
.boxed()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn raw_close(self, type_: u8, name: &str) -> BoxFuture<Connection, Error> {
|
||||||
|
let mut close = vec![];
|
||||||
|
let mut sync = vec![];
|
||||||
|
frontend::close(type_, name, &mut close)
|
||||||
|
.map(|()| frontend::sync(&mut sync))
|
||||||
|
.into_future()
|
||||||
|
.and_then(move |()| {
|
||||||
|
let it = Some(close).into_iter().chain(Some(sync)).map(Ok::<_, io::Error>);
|
||||||
|
self.0.send_all(futures::stream::iter(it))
|
||||||
|
})
|
||||||
|
.and_then(|s| s.0.read())
|
||||||
|
.map_err(Error::Io)
|
||||||
|
.and_then(|(m, s)| {
|
||||||
|
match m {
|
||||||
|
backend::Message::CloseComplete => Either::A(Ok(Connection(s)).into_future()),
|
||||||
|
backend::Message::ErrorResponse(body) => {
|
||||||
|
Either::B(Connection(s).ready_err(body))
|
||||||
|
}
|
||||||
|
_ => Either::A(Err(bad_message()).into_future()),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.and_then(|s| s.ready(()))
|
||||||
|
.map(|((), s)| s)
|
||||||
|
.boxed()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn cancel_data(&self) -> CancelData {
|
pub fn cancel_data(&self) -> CancelData {
|
||||||
self.0.cancel_data
|
self.0.cancel_data
|
||||||
}
|
}
|
||||||
@ -581,6 +607,10 @@ impl Statement {
|
|||||||
.map(|(n, conn)| (n, self, conn))
|
.map(|(n, conn)| (n, self, conn))
|
||||||
.boxed()
|
.boxed()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn close(self, conn: Connection) -> BoxFuture<Connection, Error> {
|
||||||
|
conn.raw_close(b'S', &self.name)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn connect_err(fields: &mut ErrorFields) -> ConnectError {
|
fn connect_err(fields: &mut ErrorFields) -> ConnectError {
|
||||||
|
@ -113,8 +113,11 @@ fn prepare_execute() {
|
|||||||
c.unwrap().prepare("CREATE TEMPORARY TABLE foo (id SERIAL PRIMARY KEY, name VARCHAR)")
|
c.unwrap().prepare("CREATE TEMPORARY TABLE foo (id SERIAL PRIMARY KEY, name VARCHAR)")
|
||||||
})
|
})
|
||||||
.and_then(|(s, c)| s.execute(&[], c))
|
.and_then(|(s, c)| s.execute(&[], c))
|
||||||
.and_then(|(n, _, c)| {
|
.and_then(|(n, s, c)| {
|
||||||
assert_eq!(0, n);
|
assert_eq!(0, n);
|
||||||
|
s.close(c)
|
||||||
|
})
|
||||||
|
.and_then(|c| {
|
||||||
c.prepare("INSERT INTO foo (name) VALUES ($1), ($2)")
|
c.prepare("INSERT INTO foo (name) VALUES ($1), ($2)")
|
||||||
})
|
})
|
||||||
.and_then(|(s, c)| s.execute(&[&"steven", &"bob"], c))
|
.and_then(|(s, c)| s.execute(&[&"steven", &"bob"], c))
|
||||||
|
Loading…
Reference in New Issue
Block a user