diff --git a/libsqlite3-sys/build.rs b/libsqlite3-sys/build.rs index bbeba26..f06647f 100644 --- a/libsqlite3-sys/build.rs +++ b/libsqlite3-sys/build.rs @@ -86,6 +86,11 @@ mod build { fn find_sqlite() -> HeaderLocation { let link_lib = link_lib(); + println!("cargo:rerun-if-env-changed={}_INCLUDE_DIR", env_prefix()); + println!("cargo:rerun-if-env-changed={}_LIB_DIR", env_prefix()); + if cfg!(target_os="windows") { + println!("cargo:rerun-if-env-changed=PATH"); + } // Allow users to specify where to find SQLite. if let Ok(dir) = env::var(format!("{}_LIB_DIR", env_prefix())) { println!("cargo:rustc-link-lib={}", link_lib); diff --git a/src/lib.rs b/src/lib.rs index 6710bbd..f981e87 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -577,6 +577,18 @@ impl Connection { fn changes(&self) -> c_int { 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 { @@ -907,6 +919,25 @@ impl InnerConnection { 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"))] fn remove_hooks(&mut self) { } @@ -1227,6 +1258,30 @@ mod test { 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] fn test_statement_debugging() { let db = checked_memory_handle();