Skip to content

Commit ee7f9ee

Browse files
committed
Avoid accidentally closing finished statements
1 parent 247e320 commit ee7f9ee

2 files changed

Lines changed: 12 additions & 7 deletions

File tree

src/lib.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,17 +1312,20 @@ impl<'a> fmt::Show for Statement<'a> {
13121312
#[unsafe_destructor]
13131313
impl<'conn> Drop for Statement<'conn> {
13141314
fn drop(&mut self) {
1315-
if !self.finished {
1316-
let _ = self.finish_inner();
1317-
}
1315+
let _ = self.finish_inner();
13181316
}
13191317
}
13201318

13211319
impl<'conn> Statement<'conn> {
13221320
fn finish_inner(&mut self) -> Result<()> {
1323-
let mut conn = self.conn.conn.borrow_mut();
1324-
check_desync!(conn);
1325-
conn.close_statement(&*self.name, b'S')
1321+
if !self.finished {
1322+
self.finished = true;
1323+
let mut conn = self.conn.conn.borrow_mut();
1324+
check_desync!(conn);
1325+
conn.close_statement(&*self.name, b'S')
1326+
} else {
1327+
Ok(())
1328+
}
13261329
}
13271330

13281331
fn inner_execute(&self, portal_name: &str, row_limit: i32, params: &[&ToSql]) -> Result<()> {
@@ -1480,7 +1483,6 @@ impl<'conn> Statement<'conn> {
14801483
/// Functionally identical to the `Drop` implementation of the
14811484
/// `Statement` except that it returns any error to the caller.
14821485
pub fn finish(mut self) -> Result<()> {
1483-
self.finished = true;
14841486
self.finish_inner()
14851487
}
14861488
}

tests/test.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,10 +906,13 @@ fn test_prepare_cached() {
906906

907907
let stmt = or_panic!(conn.prepare_cached("SELECT id FROM foo ORDER BY id"));
908908
assert_eq!(&[1, 2][], or_panic!(stmt.query(&[])).map(|r| r.get(0)).collect::<Vec<i32>>());
909+
or_panic!(stmt.finish());
909910

910911
let stmt = or_panic!(conn.prepare_cached("SELECT id FROM foo ORDER BY id"));
911912
assert_eq!(&[1, 2][], or_panic!(stmt.query(&[])).map(|r| r.get(0)).collect::<Vec<i32>>());
913+
or_panic!(stmt.finish());
912914

913915
let stmt = or_panic!(conn.prepare_cached("SELECT id FROM foo ORDER BY id DESC"));
914916
assert_eq!(&[2, 1][], or_panic!(stmt.query(&[])).map(|r| r.get(0)).collect::<Vec<i32>>());
917+
or_panic!(stmt.finish());
915918
}

0 commit comments

Comments
 (0)