mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-23 00:39:20 +08:00
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:
parent
89f38b4098
commit
6855b5052d
55
src/lib.rs
55
src/lib.rs
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user