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/// SQLite transaction types
34#[derive(Default, Debug, Clone, Copy)]
35pub enum SQLiteTransactionType {
36    #[default]
37    /// A deferred transaction is the default - it does not acquire locks until needed
38    Deferred,
39    /// An immediate transaction acquires a RESERVED lock immediately
40    Immediate,
41    /// An exclusive transaction acquires an EXCLUSIVE lock immediately
42    Exclusive,
43}
44
45#[cfg(feature = "rusqlite")]
46impl From<SQLiteTransactionType> for ::rusqlite::TransactionBehavior {
47    fn from(tx_type: SQLiteTransactionType) -> Self {
48        match tx_type {
49            SQLiteTransactionType::Deferred => ::rusqlite::TransactionBehavior::Deferred,
50            SQLiteTransactionType::Immediate => ::rusqlite::TransactionBehavior::Immediate,
51            SQLiteTransactionType::Exclusive => ::rusqlite::TransactionBehavior::Exclusive,
52        }
53    }
54}
55
56#[cfg(feature = "rusqlite")]
57impl From<::rusqlite::TransactionBehavior> for SQLiteTransactionType {
58    fn from(behavior: ::rusqlite::TransactionBehavior) -> Self {
59        match behavior {
60            ::rusqlite::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
61            ::rusqlite::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
62            ::rusqlite::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
63            _ => SQLiteTransactionType::Deferred, // Default for any future variants
64        }
65    }
66}
67
68// Convert to libsql::TransactionBehavior
69#[cfg(feature = "libsql")]
70impl From<SQLiteTransactionType> for libsql::TransactionBehavior {
71    fn from(tx_type: SQLiteTransactionType) -> Self {
72        match tx_type {
73            SQLiteTransactionType::Deferred => libsql::TransactionBehavior::Deferred,
74            SQLiteTransactionType::Immediate => libsql::TransactionBehavior::Immediate,
75            SQLiteTransactionType::Exclusive => libsql::TransactionBehavior::Exclusive,
76        }
77    }
78}
79
80// Convert from libsql::TransactionBehavior
81#[cfg(feature = "libsql")]
82impl From<libsql::TransactionBehavior> for SQLiteTransactionType {
83    fn from(behavior: libsql::TransactionBehavior) -> Self {
84        match behavior {
85            libsql::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
86            libsql::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
87            libsql::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
88            libsql::TransactionBehavior::ReadOnly => SQLiteTransactionType::Deferred, // Map ReadOnly to Deferred as closest equivalent
89        }
90    }
91}
92// Convert to turso::TransactionBehavior
93#[cfg(feature = "turso")]
94impl From<SQLiteTransactionType> for turso::transaction::TransactionBehavior {
95    fn from(tx_type: SQLiteTransactionType) -> Self {
96        match tx_type {
97            SQLiteTransactionType::Deferred => turso::transaction::TransactionBehavior::Deferred,
98            SQLiteTransactionType::Immediate => turso::transaction::TransactionBehavior::Immediate,
99            SQLiteTransactionType::Exclusive => turso::transaction::TransactionBehavior::Exclusive,
100        }
101    }
102}
103
104// Convert from turso::TransactionBehavior
105#[cfg(feature = "turso")]
106impl From<turso::transaction::TransactionBehavior> for SQLiteTransactionType {
107    fn from(behavior: turso::transaction::TransactionBehavior) -> Self {
108        match behavior {
109            turso::transaction::TransactionBehavior::Deferred => SQLiteTransactionType::Deferred,
110            turso::transaction::TransactionBehavior::Immediate => SQLiteTransactionType::Immediate,
111            turso::transaction::TransactionBehavior::Exclusive => SQLiteTransactionType::Exclusive,
112            _ => SQLiteTransactionType::Deferred,
113        }
114    }
115}
116
117/// Creates an array of SQL parameters for binding values to placeholders.
118///
119/// # Syntax
120/// - `{ name: value }` - Colon parameter (creates :name placeholder)
121///
122/// # Examples
123///
124/// ```
125/// use drizzle_rs::prelude::*;
126///
127/// let params = params![{ name: "alice" }, { active: true }];
128/// ```
129#[macro_export]
130macro_rules! params {
131    // Multiple parameters - creates a fixed-size array of Param structs
132    [$($param:tt),+ $(,)?] => {
133        [
134            $(
135                $crate::params_internal!($param)
136            ),+
137        ]
138    };
139}
140
141/// Internal helper macro for params! - converts individual items to Param structs
142#[macro_export]
143macro_rules! params_internal {
144    // Colon-style named parameter
145    ({ $key:ident: $value:expr }) => {
146        ::drizzle_rs::core::ParamBind::new(stringify!($key), $crate::SQLiteValue::from($value))
147    };
148    // Positional parameter
149    ($value:expr) => {
150        ::drizzle_rs::core::ParamBind::new($crate::SQLiteValue::from($value))
151    };
152}