Skip to main content

drizzle_sqlite/
connection.rs

1//! Transaction-type marker and per-driver behavior conversions for `SQLite` drivers.
2
3/// Locking behavior used when starting a `SQLite` transaction.
4#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
5pub enum TransactionConfig {
6    #[default]
7    /// A deferred transaction is the default - it does not acquire locks until needed
8    Deferred,
9    /// An immediate transaction acquires a RESERVED lock immediately
10    Immediate,
11    /// An exclusive transaction acquires an EXCLUSIVE lock immediately
12    Exclusive,
13}
14
15/// Backwards-compatible name for [`TransactionConfig`].
16pub type SQLiteTransactionType = TransactionConfig;
17
18#[cfg(feature = "rusqlite")]
19impl From<SQLiteTransactionType> for ::rusqlite::TransactionBehavior {
20    fn from(tx_type: SQLiteTransactionType) -> Self {
21        match tx_type {
22            SQLiteTransactionType::Deferred => Self::Deferred,
23            SQLiteTransactionType::Immediate => Self::Immediate,
24            SQLiteTransactionType::Exclusive => Self::Exclusive,
25        }
26    }
27}
28
29#[cfg(feature = "rusqlite")]
30impl From<::rusqlite::TransactionBehavior> for SQLiteTransactionType {
31    fn from(behavior: ::rusqlite::TransactionBehavior) -> Self {
32        match behavior {
33            ::rusqlite::TransactionBehavior::Immediate => Self::Immediate,
34            ::rusqlite::TransactionBehavior::Exclusive => Self::Exclusive,
35            // Deferred and any future variants default to Deferred.
36            _ => Self::Deferred,
37        }
38    }
39}
40
41// Convert to libsql::TransactionBehavior
42#[cfg(feature = "libsql")]
43impl From<SQLiteTransactionType> for libsql::TransactionBehavior {
44    fn from(tx_type: SQLiteTransactionType) -> Self {
45        match tx_type {
46            SQLiteTransactionType::Deferred => Self::Deferred,
47            SQLiteTransactionType::Immediate => Self::Immediate,
48            SQLiteTransactionType::Exclusive => Self::Exclusive,
49        }
50    }
51}
52
53// Convert from libsql::TransactionBehavior
54#[cfg(feature = "libsql")]
55impl From<libsql::TransactionBehavior> for SQLiteTransactionType {
56    fn from(behavior: libsql::TransactionBehavior) -> Self {
57        match behavior {
58            libsql::TransactionBehavior::Immediate => Self::Immediate,
59            libsql::TransactionBehavior::Exclusive => Self::Exclusive,
60            // Deferred and ReadOnly (mapped as closest equivalent) both fall through to Deferred.
61            libsql::TransactionBehavior::Deferred | libsql::TransactionBehavior::ReadOnly => {
62                Self::Deferred
63            }
64        }
65    }
66}
67
68// Convert to turso::TransactionBehavior
69#[cfg(feature = "turso")]
70impl From<SQLiteTransactionType> for turso::transaction::TransactionBehavior {
71    fn from(tx_type: SQLiteTransactionType) -> Self {
72        match tx_type {
73            SQLiteTransactionType::Deferred => Self::Deferred,
74            SQLiteTransactionType::Immediate => Self::Immediate,
75            SQLiteTransactionType::Exclusive => Self::Exclusive,
76        }
77    }
78}
79
80// Convert from turso::TransactionBehavior
81#[cfg(feature = "turso")]
82impl From<turso::transaction::TransactionBehavior> for SQLiteTransactionType {
83    fn from(behavior: turso::transaction::TransactionBehavior) -> Self {
84        match behavior {
85            turso::transaction::TransactionBehavior::Immediate => Self::Immediate,
86            turso::transaction::TransactionBehavior::Exclusive => Self::Exclusive,
87            // Deferred and any future variants default to Deferred.
88            _ => Self::Deferred,
89        }
90    }
91}