1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! SQLite storage adapters for codlet (RFC-011).
//!
//! Each adapter is a thin wrapper around a [`sqlx::SqlitePool`] that
//! implements the corresponding `codlet-core` store trait using SQLite's
//! conditional `UPDATE` semantics for atomic single-winner operations
//! (RFC-022).
//!
//! ## Usage
//!
//! ```rust,ignore
//! use codlet_sqlx::{SqliteStore, run_migrations};
//!
//! let pool = sqlx::SqlitePool::connect("sqlite::memory:").await?;
//! run_migrations(&pool).await?;
//! let store = SqliteStore::new(pool);
//! // store implements CodeStore + SessionStore + FormTokenStore
//! ```
//!
//! ## Atomicity guarantee
//!
//! Every one-time transition (code claim, form-token consume) uses a single
//! `UPDATE … WHERE … AND <guard condition>` followed by an affected-row count
//! check. SQLite's serialised write mode ensures these are atomic under
//! concurrent access from multiple threads within the same process. For
//! multi-process deployments (rare for codlet's target use case), WAL mode
//! and appropriate busy-timeout settings are recommended.
//!
//! ## Conformance
//!
//! All three stores pass the full `codlet-conformance` suite, including the
//! concurrent-claim race test (RFC-022, RFC-023).
pub use run_migrations;
/// A handle wrapping a [`sqlx::SqlitePool`] that implements all three
/// codlet store traits.
///
/// Clone is cheap (the pool is reference-counted internally).