diff options
Diffstat (limited to 'src/transaction.rs')
-rw-r--r-- | src/transaction.rs | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/transaction.rs b/src/transaction.rs index 296b2aa..2c4c6c0 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -87,6 +87,7 @@ pub struct Transaction<'conn> { /// sp.commit() /// } /// ``` +#[derive(Debug)] pub struct Savepoint<'conn> { conn: &'conn Connection, name: String, @@ -375,6 +376,20 @@ impl Drop for Savepoint<'_> { } } +/// Transaction state of a database +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[non_exhaustive] +#[cfg(feature = "modern_sqlite")] // 3.37.0 +#[cfg_attr(docsrs, doc(cfg(feature = "modern_sqlite")))] +pub enum TransactionState { + /// Equivalent to SQLITE_TXN_NONE + None, + /// Equivalent to SQLITE_TXN_READ + Read, + /// Equivalent to SQLITE_TXN_WRITE + Write, +} + impl Connection { /// Begin a new transaction with the default behavior (DEFERRED). /// @@ -499,6 +514,16 @@ impl Connection { pub fn savepoint_with_name<T: Into<String>>(&mut self, name: T) -> Result<Savepoint<'_>> { Savepoint::with_name(self, name) } + + /// Determine the transaction state of a database + #[cfg(feature = "modern_sqlite")] // 3.37.0 + #[cfg_attr(docsrs, doc(cfg(feature = "modern_sqlite")))] + pub fn transaction_state( + &self, + db_name: Option<crate::DatabaseName<'_>>, + ) -> Result<TransactionState> { + self.db.borrow().txn_state(db_name) + } } #[cfg(test)] @@ -534,7 +559,7 @@ mod test { } Ok(()) } - fn assert_nested_tx_error(e: crate::Error) { + fn assert_nested_tx_error(e: Error) { if let Error::SqliteFailure(e, Some(m)) = &e { assert_eq!(e.extended_code, crate::ffi::SQLITE_ERROR); // FIXME: Not ideal... @@ -710,4 +735,25 @@ mod test { assert_eq!(x, i); Ok(()) } + + #[test] + #[cfg(feature = "modern_sqlite")] + fn txn_state() -> Result<()> { + use super::TransactionState; + use crate::DatabaseName; + let db = Connection::open_in_memory()?; + assert_eq!( + TransactionState::None, + db.transaction_state(Some(DatabaseName::Main))? + ); + assert_eq!(TransactionState::None, db.transaction_state(None)?); + db.execute_batch("BEGIN")?; + assert_eq!(TransactionState::None, db.transaction_state(None)?); + let _: i32 = db.pragma_query_value(None, "user_version", |row| row.get(0))?; + assert_eq!(TransactionState::Read, db.transaction_state(None)?); + db.pragma_update(None, "user_version", 1)?; + assert_eq!(TransactionState::Write, db.transaction_state(None)?); + db.execute_batch("ROLLBACK")?; + Ok(()) + } } |