aboutsummaryrefslogtreecommitdiff
path: root/src/transaction.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/transaction.rs')
-rw-r--r--src/transaction.rs48
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(())
+ }
}