Skip to main content

drizzle_sqlite/
connection.rs

1//! `SQLite` transaction locking modes and their conversions to each
2//! driver's type.
3
4/// How a `SQLite` transaction takes locks when it begins
5/// (`BEGIN DEFERRED`, `BEGIN IMMEDIATE` or `BEGIN EXCLUSIVE`).
6#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
7pub enum TransactionConfig {
8    #[default]
9    /// Takes no lock until the first read or write. The default.
10    Deferred,
11    /// Starts a write transaction at once, so other connections cannot
12    /// start writing.
13    Immediate,
14    /// Like `Immediate`; in rollback-journal mode it also blocks other
15    /// connections from reading.
16    Exclusive,
17}
18
19/// Backwards-compatible name for [`TransactionConfig`].
20pub type SQLiteTransactionType = TransactionConfig;
21
22#[cfg(feature = "rusqlite")]
23impl From<SQLiteTransactionType> for ::rusqlite::TransactionBehavior {
24    fn from(tx_type: SQLiteTransactionType) -> Self {
25        match tx_type {
26            SQLiteTransactionType::Deferred => Self::Deferred,
27            SQLiteTransactionType::Immediate => Self::Immediate,
28            SQLiteTransactionType::Exclusive => Self::Exclusive,
29        }
30    }
31}
32
33#[cfg(feature = "rusqlite")]
34impl From<::rusqlite::TransactionBehavior> for SQLiteTransactionType {
35    fn from(behavior: ::rusqlite::TransactionBehavior) -> Self {
36        match behavior {
37            ::rusqlite::TransactionBehavior::Immediate => Self::Immediate,
38            ::rusqlite::TransactionBehavior::Exclusive => Self::Exclusive,
39            // Deferred and any future variants default to Deferred.
40            _ => Self::Deferred,
41        }
42    }
43}
44
45// Convert to libsql::TransactionBehavior
46#[cfg(feature = "libsql")]
47impl From<SQLiteTransactionType> for libsql::TransactionBehavior {
48    fn from(tx_type: SQLiteTransactionType) -> Self {
49        match tx_type {
50            SQLiteTransactionType::Deferred => Self::Deferred,
51            SQLiteTransactionType::Immediate => Self::Immediate,
52            SQLiteTransactionType::Exclusive => Self::Exclusive,
53        }
54    }
55}
56
57// Convert from libsql::TransactionBehavior
58#[cfg(feature = "libsql")]
59impl From<libsql::TransactionBehavior> for SQLiteTransactionType {
60    fn from(behavior: libsql::TransactionBehavior) -> Self {
61        match behavior {
62            libsql::TransactionBehavior::Immediate => Self::Immediate,
63            libsql::TransactionBehavior::Exclusive => Self::Exclusive,
64            // Deferred and ReadOnly (mapped as closest equivalent) both fall through to Deferred.
65            libsql::TransactionBehavior::Deferred | libsql::TransactionBehavior::ReadOnly => {
66                Self::Deferred
67            }
68        }
69    }
70}
71
72// Convert to turso::TransactionBehavior
73#[cfg(feature = "turso")]
74impl From<SQLiteTransactionType> for turso::transaction::TransactionBehavior {
75    fn from(tx_type: SQLiteTransactionType) -> Self {
76        match tx_type {
77            SQLiteTransactionType::Deferred => Self::Deferred,
78            SQLiteTransactionType::Immediate => Self::Immediate,
79            SQLiteTransactionType::Exclusive => Self::Exclusive,
80        }
81    }
82}
83
84// Convert from turso::TransactionBehavior
85#[cfg(feature = "turso")]
86impl From<turso::transaction::TransactionBehavior> for SQLiteTransactionType {
87    fn from(behavior: turso::transaction::TransactionBehavior) -> Self {
88        match behavior {
89            turso::transaction::TransactionBehavior::Immediate => Self::Immediate,
90            turso::transaction::TransactionBehavior::Exclusive => Self::Exclusive,
91            // Deferred and any future variants default to Deferred.
92            _ => Self::Deferred,
93        }
94    }
95}