chronon_backend_sql_common/lib.rs
1//! Shared SQL [`SchedulerStore`](chronon_core::store::SchedulerStore) for `PostgreSQL` and `SQLite`.
2//!
3//! Backend and platform engineers use this crate when implementing or extending SQL persistence.
4//! Application binaries should prefer the thin wrappers
5//! [`chronon_backend_postgres`](https://docs.rs/chronon-backend-postgres) or
6//! [`chronon_backend_sqlite`](https://docs.rs/chronon-backend-sqlite).
7//!
8//! ## Stack position
9//!
10//! ```text
11//! chronon-backend-{postgres,sqlite} → chronon-backend-sql-common → chronon-core
12//! ```
13//!
14//! ## Entry points
15//!
16//! - [`SqlSchedulerStore`] — connect, schema bootstrap, and trait implementation
17//! - [`SqlDialect`] / [`SqlPool`] — engine selection and pool wrapper
18//! - [`bind_sql`] — dialect-specific placeholder rewriting (`?` → `$1`, …)
19//! - [`validate_postgres_schema_name`] — allowlist for isolated schema DDL / `search_path`
20//!
21//! ## Prerequisites
22//!
23//! Schema bootstrap runs on connect. For parallel Postgres tests use
24//! [`SqlSchedulerStore::connect_postgres_isolated`] (schema names must match
25//! [`validate_postgres_schema_name`]).
26//!
27//! ## Example
28//!
29//! ```rust,no_run
30//! use chronon_backend_sql_common::SqlSchedulerStore;
31//!
32//! # async fn example() -> chronon_core::Result<()> {
33//! let store = SqlSchedulerStore::connect_sqlite("sqlite://:memory:").await?;
34//! # Ok(())
35//! # }
36//! ```
37
38mod backend;
39mod claims;
40mod coordinator;
41mod delegate;
42mod error_map;
43mod jobs;
44mod macros;
45mod row;
46mod runs;
47mod schema;
48mod store_impl;
49
50#[cfg(test)]
51mod store_smoke;
52
53pub use backend::{
54 bind_sql, validate_postgres_schema_name, SqlDialect, SqlPool, SqlSchedulerStore,
55};
56pub use coordinator::LEADER_ROW_ID;
57pub use row::run_pool_key;
58pub use row::{row_to_worker, SchedulerLeaderRow};