modo/db/mod.rs
1//! # modo::db
2//!
3//! Lightweight libsql (SQLite) database layer with typed row mapping,
4//! composable query building, filtering, and pagination.
5//!
6//! Requires feature `"db"` (enabled by default).
7//!
8//! ## Core types
9//!
10//! | Type | Purpose |
11//! |------|---------|
12//! | [`Database`] | Clone-able, `Arc`-wrapped single-connection handle |
13//! | [`Config`] | YAML-deserializable database configuration with PRAGMA defaults |
14//! | [`ManagedDatabase`] | Wrapper for graceful shutdown via [`crate::run!`] |
15//! | [`managed`] | Wraps a [`Database`] into a [`ManagedDatabase`] |
16//! | [`DatabasePool`] | Multi-database pool with lazy shard opening for tenant isolation |
17//! | [`PoolConfig`] | Configuration for database sharding (base path, shard count) |
18//! | [`ManagedDatabasePool`] | Wrapper for graceful pool shutdown via [`crate::run!`] |
19//! | [`managed_pool`] | Wraps a [`DatabasePool`] into a [`ManagedDatabasePool`] |
20//!
21//! ## Connection & querying
22//!
23//! | Item | Purpose |
24//! |------|---------|
25//! | [`connect`] | Open a database, apply PRAGMAs, optionally run migrations |
26//! | [`migrate`] | Run `*.sql` migrations from a directory with checksum tracking |
27//! | [`ConnExt`] | Low-level `query_raw`/`execute_raw` trait for `Connection` and `Transaction` |
28//! | [`ConnQueryExt`] | High-level `query_one`/`query_all`/`query_optional` helpers (blanket impl on `ConnExt`) |
29//! | [`SelectBuilder`] | Composable query builder combining filters, sorting, and pagination |
30//!
31//! ## Row mapping
32//!
33//! | Item | Purpose |
34//! |------|---------|
35//! | [`FromRow`] | Trait for converting a `libsql::Row` into a Rust struct |
36//! | [`FromValue`] | Trait for converting a `libsql::Value` into a concrete Rust type |
37//! | [`ColumnMap`] | Column name to index lookup for name-based row access |
38//!
39//! ## Filtering & pagination
40//!
41//! | Item | Purpose |
42//! |------|---------|
43//! | [`Filter`] | Raw parsed filter from query string (axum extractor) |
44//! | [`FilterSchema`] | Declares allowed filter and sort fields for an endpoint |
45//! | [`ValidatedFilter`] | Schema-validated filter safe for SQL generation |
46//! | [`FieldType`] | Column type enum for filter value validation |
47//! | [`PageRequest`] | Offset-based pagination extractor (`?page=N&per_page=N`) |
48//! | [`Page`] | Offset-based page response with total/has_next/has_prev |
49//! | [`CursorRequest`] | Cursor-based pagination extractor (`?after=<cursor>&per_page=N`) |
50//! | [`CursorPage`] | Cursor-based page response with next_cursor/has_more |
51//! | [`PaginationConfig`] | Configurable defaults and limits for pagination extractors |
52//!
53//! ## Configuration enums
54//!
55//! | Enum | Purpose |
56//! |------|---------|
57//! | [`JournalMode`] | SQLite journal mode (WAL, Delete, Truncate, Memory, Off) |
58//! | [`SynchronousMode`] | SQLite synchronous mode (Off, Normal, Full, Extra) |
59//! | [`TempStore`] | SQLite temp store location (Default, File, Memory) |
60//!
61//! ## Re-exports
62//!
63//! The [`libsql`] crate is re-exported for direct access to low-level types
64//! such as `libsql::params!`, `libsql::Value`, `libsql::Connection`, and
65//! `libsql::Transaction`.
66//!
67//! ## Quick start
68//!
69//! ```rust,ignore
70//! use modo::db::{self, ConnExt, ConnQueryExt};
71//!
72//! // Connect with defaults (data/app.db, WAL mode, FK on)
73//! let db = db::connect(&db::Config::default()).await?;
74//!
75//! // Use query helpers via ConnQueryExt
76//! let user: User = db.conn().query_one(
77//! "SELECT id, name FROM users WHERE id = ?1",
78//! libsql::params!["user_abc"],
79//! ).await?;
80//!
81//! // Or use the SelectBuilder for filtered, paginated queries
82//! let page = db.conn()
83//! .select("SELECT id, name FROM users")
84//! .filter(validated_filter)
85//! .order_by("\"created_at\" DESC")
86//! .page::<User>(page_request)
87//! .await?;
88//! ```
89
90mod error;
91
92mod config;
93pub use config::{Config, JournalMode, PoolConfig, SynchronousMode, TempStore};
94
95mod database;
96pub use database::Database;
97
98mod connect;
99pub use connect::connect;
100
101mod from_row;
102pub use from_row::{ColumnMap, FromRow, FromValue};
103
104mod conn;
105pub use conn::{ConnExt, ConnQueryExt};
106
107mod managed;
108pub use managed::{ManagedDatabase, managed};
109
110mod pool;
111pub use pool::{DatabasePool, ManagedDatabasePool, managed_pool};
112
113mod migrate;
114pub use migrate::migrate;
115
116mod page;
117pub use page::{CursorPage, CursorRequest, Page, PageRequest, PaginationConfig};
118
119mod filter;
120pub use filter::{FieldType, Filter, FilterSchema, ValidatedFilter};
121
122mod select;
123pub use select::SelectBuilder;
124
125// Re-export libsql for direct access
126pub use libsql;