drizzle_sqlite/
connection.rs

1//! Connection types and transaction handling for SQLite drivers
2
3#[cfg(not(any(feature = "libsql", feature = "rusqlite", feature = "turso")))]
4use std::marker::PhantomData;
5
6/// Reference to different SQLite driver connection types
7#[derive(Debug)]
8pub enum ConnectionRef<'a> {
9    #[cfg(feature = "libsql")]
10    LibSql(&'a libsql::Connection),
11    #[cfg(feature = "rusqlite")]
12    Rusqlite(&'a rusqlite::Connection),
13    #[cfg(feature = "turso")]
14    Turso(&'a turso::Connection),
15    #[cfg(not(any(feature = "libsql", feature = "rusqlite", feature = "turso")))]
16    _Phantom(PhantomData<&'a ()>),
17}
18
19// Implement Into trait for each connection type
20#[cfg(feature = "libsql")]
21impl<'a> From<&'a libsql::Connection> for ConnectionRef<'a> {
22    fn from(conn: &'a libsql::Connection) -> Self {
23        ConnectionRef::LibSql(conn)
24    }
25}
26
27#[cfg(feature = "rusqlite")]
28impl<'a> From<&'a rusqlite::Connection> for ConnectionRef<'a> {
29    fn from(conn: &'a rusqlite::Connection) -> Self {
30        ConnectionRef::Rusqlite(conn)
31    }
32}
33
34#[cfg(feature = "turso")]
35impl<'a> From<&'a turso::Connection> for ConnectionRef<'a> {
36    fn from(conn: &'a turso::Connection) -> Self {
37        ConnectionRef::Turso(conn)
38    }
39}
40
41/// SQLite transaction types
42#[derive(Default, Debug, Clone, Copy)]
43pub enum SQLiteTransactionType {
44    #[default]
45    /// A deferred transaction is the default - it does not acquire locks until needed
46    Deferred,
47    /// An immediate transaction acquires a RESERVED lock immediately
48    Immediate,
49    /// An exclusive transaction acquires an EXCLUSIVE lock immediately
50    Exclusive,
51}
52
53#[cfg(feature = "rusqlite")]
54impl From<SQLiteTransactionType> for ::rusqlite::TransactionBehavior {
55    fn from(tx_type: SQLiteTransactionType) -> Self {
56        match tx_type {
57            SQLiteTransactionType::Deferred => ::rusqlite::TransactionBehavior::Deferred,
58            SQLiteTransactionType::Immediate => ::rusqlite::TransactionBehavior::Immediate,
59            SQLiteTransactionType::Exclusive => ::rusqlite::TransactionBehavior::Exclusive,
60        }
61    }
62}
63
64#[cfg(feature = "rusqlite")]
65impl From<::rusqlite::TransactionBehavior> for SQLiteTransactionType {
66    fn from(behavior: ::rusqlite::TransactionBehavior) -> Self {
67        match behavior {
68            ::rusqlite::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
69            ::rusqlite::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
70            ::rusqlite::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
71            _ => SQLiteTransactionType::Deferred, // Default for any future variants
72        }
73    }
74}
75
76// Convert to libsql::TransactionBehavior
77#[cfg(feature = "libsql")]
78impl From<SQLiteTransactionType> for libsql::TransactionBehavior {
79    fn from(tx_type: SQLiteTransactionType) -> Self {
80        match tx_type {
81            SQLiteTransactionType::Deferred => libsql::TransactionBehavior::Deferred,
82            SQLiteTransactionType::Immediate => libsql::TransactionBehavior::Immediate,
83            SQLiteTransactionType::Exclusive => libsql::TransactionBehavior::Exclusive,
84        }
85    }
86}
87
88// Convert from libsql::TransactionBehavior
89#[cfg(feature = "libsql")]
90impl From<libsql::TransactionBehavior> for SQLiteTransactionType {
91    fn from(behavior: libsql::TransactionBehavior) -> Self {
92        match behavior {
93            libsql::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
94            libsql::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
95            libsql::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
96            libsql::TransactionBehavior::ReadOnly => SQLiteTransactionType::Deferred, // Map ReadOnly to Deferred as closest equivalent
97        }
98    }
99}
100
101// Convert to turso::TransactionBehavior
102#[cfg(feature = "turso")]
103impl From<SQLiteTransactionType> for turso::transaction::TransactionBehavior {
104    fn from(tx_type: SQLiteTransactionType) -> Self {
105        match tx_type {
106            SQLiteTransactionType::Deferred => turso::transaction::TransactionBehavior::Deferred,
107            SQLiteTransactionType::Immediate => turso::transaction::TransactionBehavior::Immediate,
108            SQLiteTransactionType::Exclusive => turso::transaction::TransactionBehavior::Exclusive,
109        }
110    }
111}
112
113// Convert from turso::TransactionBehavior
114#[cfg(feature = "turso")]
115impl From<turso::transaction::TransactionBehavior> for SQLiteTransactionType {
116    fn from(behavior: turso::transaction::TransactionBehavior) -> Self {
117        match behavior {
118            turso::transaction::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
119            turso::transaction::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
120            turso::transaction::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
121            _ => SQLiteTransactionType::Deferred,
122        }
123    }
124}