Skip to content

Commit 6334f04

Browse files
committed
Be more conservative when closing things
1 parent d0a5bd7 commit 6334f04

2 files changed

Lines changed: 19 additions & 37 deletions

File tree

src/lib.rs

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ impl InnerConnection {
557557
let (stmt_name, _, result_desc) = try!(self.raw_prepare(query[]));
558558

559559
let column_types = result_desc.iter().map(|desc| desc.ty.clone()).collect();
560-
try!(self.close_statement(stmt_name[]));
560+
try!(self.close_statement(stmt_name[], b'S'));
561561

562562
let mut query = vec![];
563563
let _ = write!(&mut query, "COPY {} (", table);
@@ -574,24 +574,25 @@ impl InnerConnection {
574574
})
575575
}
576576

577-
fn close_statement(&mut self, stmt_name: &str) -> Result<()> {
577+
fn close_statement(&mut self, name: &str, type_: u8) -> Result<()> {
578578
try!(self.write_messages(&[
579579
Close {
580-
variant: b'S',
581-
name: stmt_name,
580+
variant: type_,
581+
name: name,
582582
},
583583
Sync]));
584-
loop {
585-
match try!(self.read_message()) {
586-
ReadyForQuery { .. } => break,
587-
ErrorResponse { fields } => {
588-
try!(self.wait_for_ready());
589-
return DbError::new(fields);
590-
}
591-
_ => {}
584+
let resp = match try!(self.read_message()) {
585+
CloseComplete => Ok(()),
586+
ErrorResponse { fields } => {
587+
DbError::new(fields)
592588
}
593-
}
594-
Ok(())
589+
_ => {
590+
self.desynchronized = true;
591+
return Err(Error::BadResponse);
592+
}
593+
};
594+
try!(self.wait_for_ready());
595+
resp
595596
}
596597

597598
fn set_type_names<'a, I>(&mut self, mut it: I) -> Result<()> where I: Iterator<&'a mut Type> {
@@ -1112,7 +1113,7 @@ impl<'conn> Statement<'conn> {
11121113
fn finish_inner(&mut self) -> Result<()> {
11131114
let mut conn = self.conn.conn.borrow_mut();
11141115
check_desync!(conn);
1115-
conn.close_statement(self.name[])
1116+
conn.close_statement(self.name[], b'S')
11161117
}
11171118

11181119
fn inner_execute(&self, portal_name: &str, row_limit: i32, params: &[&ToSql]) -> Result<()> {
@@ -1306,25 +1307,7 @@ impl<'stmt> Rows<'stmt> {
13061307
fn finish_inner(&mut self) -> Result<()> {
13071308
let mut conn = self.stmt.conn.conn.borrow_mut();
13081309
check_desync!(conn);
1309-
try!(conn.write_messages(&[
1310-
Close {
1311-
variant: b'P',
1312-
name: self.name[]
1313-
},
1314-
Sync]));
1315-
1316-
loop {
1317-
match try!(conn.read_message()) {
1318-
ReadyForQuery { .. } => break,
1319-
ErrorResponse { fields } => {
1320-
try!(conn.wait_for_ready());
1321-
return DbError::new(fields);
1322-
}
1323-
_ => {}
1324-
}
1325-
}
1326-
1327-
Ok(())
1310+
conn.close_statement(self.name[], b'P')
13281311
}
13291312

13301313
fn read_rows(&mut self) -> Result<()> {
@@ -1545,7 +1528,7 @@ impl<'a> CopyInStatement<'a> {
15451528
fn finish_inner(&mut self) -> Result<()> {
15461529
let mut conn = self.conn.conn.borrow_mut();
15471530
check_desync!(conn);
1548-
conn.close_statement(self.name[])
1531+
conn.close_statement(self.name[], b'S')
15491532
}
15501533

15511534
/// Returns a slice containing the expected column types.

tests/test.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -559,8 +559,7 @@ fn test_notification_iterator_none() {
559559
assert!(conn.notifications().next().is_none());
560560
}
561561

562-
fn check_notification(expected: Notification,
563-
actual: Notification) {
562+
fn check_notification(expected: Notification, actual: Notification) {
564563
assert_eq!(&expected.channel, &actual.channel);
565564
assert_eq!(&expected.payload, &actual.payload);
566565
}

0 commit comments

Comments
 (0)