Ensure connection can be safely returned to a pool (#353)

* Add binding to sqlite3_get_autocommit.
* Add binding to sqlite3_stmt_busy.
* Disable test_is_busy by default
This commit is contained in:
gwenn 2018-05-12 18:35:08 +02:00 committed by GitHub
parent 89f38b4098
commit 6855b5052d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -573,6 +573,18 @@ impl Connection {
fn changes(&self) -> c_int { fn changes(&self) -> c_int {
self.db.borrow_mut().changes() self.db.borrow_mut().changes()
} }
/// Test for auto-commit mode.
/// Autocommit mode is on by default.
pub fn is_autocommit(&self) -> bool {
self.db.borrow().is_autocommit()
}
/// Determine if all associated prepared statements have been reset.
#[cfg(feature = "bundled")]
pub fn is_busy(&self) -> bool {
self.db.borrow().is_busy()
}
} }
impl fmt::Debug for Connection { impl fmt::Debug for Connection {
@ -903,6 +915,25 @@ impl InnerConnection {
unsafe { ffi::sqlite3_changes(self.db()) } unsafe { ffi::sqlite3_changes(self.db()) }
} }
fn is_autocommit(&self) -> bool {
unsafe { ffi::sqlite3_get_autocommit(self.db()) != 0 }
}
#[cfg(feature = "bundled")] // 3.8.6
fn is_busy(&self) -> bool {
let db = self.db();
unsafe {
let mut stmt = ffi::sqlite3_next_stmt(db, ptr::null_mut());
while !stmt.is_null() {
if ffi::sqlite3_stmt_busy(stmt) != 0 {
return true;
}
stmt = ffi::sqlite3_next_stmt(db, stmt);
}
}
return false;
}
#[cfg(not(feature = "hooks"))] #[cfg(not(feature = "hooks"))]
fn remove_hooks(&mut self) { fn remove_hooks(&mut self) {
} }
@ -1223,6 +1254,30 @@ mod test {
assert_eq!(db.last_insert_rowid(), 10); assert_eq!(db.last_insert_rowid(), 10);
} }
#[test]
fn test_is_autocommit() {
let db = checked_memory_handle();
assert!(db.is_autocommit(),
"autocommit expected to be active by default");
}
#[test]
#[cfg(feature = "bundled")]
fn test_is_busy() {
let db = checked_memory_handle();
assert!(!db.is_busy());
let mut stmt = db.prepare("PRAGMA schema_version").unwrap();
assert!(!db.is_busy());
{
let mut rows = stmt.query(&[]).unwrap();
assert!(!db.is_busy());
let row = rows.next();
assert!(db.is_busy());
assert!(row.is_some());
}
assert!(!db.is_busy());
}
#[test] #[test]
fn test_statement_debugging() { fn test_statement_debugging() {
let db = checked_memory_handle(); let db = checked_memory_handle();