drizzle_sqlite/
lib.rs

1//! SQLite implementation for Drizzle
2//!
3//! This crate provides SQLite-specific functionality for Drizzle.
4
5//------------------------------------------------------------------------------
6// Module Declarations
7//------------------------------------------------------------------------------
8
9pub mod builder;
10pub mod common;
11pub mod conditions;
12pub mod helpers;
13pub mod traits;
14pub mod values;
15
16//------------------------------------------------------------------------------
17// Prelude
18//------------------------------------------------------------------------------
19
20/// A prelude module that re-exports commonly used types and traits
21pub mod prelude {
22    pub use crate::SQLiteTransactionType;
23    pub use crate::traits::SQLiteColumn;
24    pub use crate::values::SQLiteValue;
25
26    // Re-export rusqlite trait implementations when the feature is enabled
27    #[cfg(feature = "rusqlite")]
28    pub use ::rusqlite::types::ToSql;
29}
30
31pub use self::values::{InsertValue, OwnedSQLiteValue, SQLiteValue};
32
33// Re-export ParamBind for use in macros
34pub use drizzle_core::ParamBind;
35
36/// SQLite transaction types
37#[derive(Default, Debug, Clone, Copy)]
38pub enum SQLiteTransactionType {
39    #[default]
40    /// A deferred transaction is the default - it does not acquire locks until needed
41    Deferred,
42    /// An immediate transaction acquires a RESERVED lock immediately
43    Immediate,
44    /// An exclusive transaction acquires an EXCLUSIVE lock immediately
45    Exclusive,
46}
47
48#[cfg(feature = "rusqlite")]
49impl From<SQLiteTransactionType> for ::rusqlite::TransactionBehavior {
50    fn from(tx_type: SQLiteTransactionType) -> Self {
51        match tx_type {
52            SQLiteTransactionType::Deferred => ::rusqlite::TransactionBehavior::Deferred,
53            SQLiteTransactionType::Immediate => ::rusqlite::TransactionBehavior::Immediate,
54            SQLiteTransactionType::Exclusive => ::rusqlite::TransactionBehavior::Exclusive,
55        }
56    }
57}
58
59#[cfg(feature = "rusqlite")]
60impl From<::rusqlite::TransactionBehavior> for SQLiteTransactionType {
61    fn from(behavior: ::rusqlite::TransactionBehavior) -> Self {
62        match behavior {
63            ::rusqlite::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
64            ::rusqlite::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
65            ::rusqlite::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
66            _ => SQLiteTransactionType::Deferred, // Default for any future variants
67        }
68    }
69}
70
71// Convert to libsql::TransactionBehavior
72#[cfg(feature = "libsql")]
73impl From<SQLiteTransactionType> for libsql::TransactionBehavior {
74    fn from(tx_type: SQLiteTransactionType) -> Self {
75        match tx_type {
76            SQLiteTransactionType::Deferred => libsql::TransactionBehavior::Deferred,
77            SQLiteTransactionType::Immediate => libsql::TransactionBehavior::Immediate,
78            SQLiteTransactionType::Exclusive => libsql::TransactionBehavior::Exclusive,
79        }
80    }
81}
82
83// Convert from libsql::TransactionBehavior
84#[cfg(feature = "libsql")]
85impl From<libsql::TransactionBehavior> for SQLiteTransactionType {
86    fn from(behavior: libsql::TransactionBehavior) -> Self {
87        match behavior {
88            libsql::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
89            libsql::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
90            libsql::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
91            libsql::TransactionBehavior::ReadOnly => SQLiteTransactionType::Deferred, // Map ReadOnly to Deferred as closest equivalent
92        }
93    }
94}
95// Convert to turso::TransactionBehavior
96#[cfg(feature = "turso")]
97impl From<SQLiteTransactionType> for turso::transaction::TransactionBehavior {
98    fn from(tx_type: SQLiteTransactionType) -> Self {
99        match tx_type {
100            SQLiteTransactionType::Deferred => turso::transaction::TransactionBehavior::Deferred,
101            SQLiteTransactionType::Immediate => turso::transaction::TransactionBehavior::Immediate,
102            SQLiteTransactionType::Exclusive => turso::transaction::TransactionBehavior::Exclusive,
103        }
104    }
105}
106
107// Convert from turso::TransactionBehavior
108#[cfg(feature = "turso")]
109impl From<turso::transaction::TransactionBehavior> for SQLiteTransactionType {
110    fn from(behavior: turso::transaction::TransactionBehavior) -> Self {
111        match behavior {
112            turso::transaction::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
113            turso::transaction::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
114            turso::transaction::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
115            _ => SQLiteTransactionType::Deferred,
116        }
117    }
118}
119
120/// Creates an array of SQL parameters for binding values to placeholders.
121///
122/// # Syntax
123/// - `{ name: value }` - Colon parameter (creates :name placeholder)
124///
125/// # Examples
126///
127/// ```
128/// use drizzle_sqlite::params;
129///
130/// let params = params![{ name: "alice" }, { active: true }];
131/// ```
132#[macro_export]
133macro_rules! params {
134    // Multiple parameters - creates a fixed-size array of Param structs
135    [$($param:tt),+ $(,)?] => {
136        [
137            $(
138                $crate::params_internal!($param)
139            ),+
140        ]
141    };
142}
143
144/// Internal helper macro for params! - converts individual items to Param structs
145#[macro_export]
146macro_rules! params_internal {
147    // Colon-style named parameter
148    ({ $key:ident: $value:expr }) => {
149        $crate::ParamBind::new(stringify!($key), $crate::SQLiteValue::from($value))
150    };
151    // Positional parameter
152    ($value:expr) => {
153        $crate::ParamBind::new("", $crate::SQLiteValue::from($value))
154    };
155}