bsql/lib.rs
1#![forbid(unsafe_code)]
2
3//! # bsql — Safe SQL for Rust
4//!
5//! **If it compiles, the SQL is correct.**
6//!
7//! bsql validates every SQL query against a real database at compile time.
8//! No runtime, no async — just safe, fast, synchronous SQL.
9//!
10//! ## Quick Start
11//!
12//! ```toml
13//! [dependencies]
14//! bsql = "0.17"
15//! ```
16//!
17//! ```rust,ignore
18//! use bsql::Pool;
19//!
20//! fn main() -> Result<(), bsql::BsqlError> {
21//! let pool = Pool::connect("postgres://user:pass@localhost/mydb")?;
22//!
23//! let id = 1i32;
24//! let users = bsql::query!(
25//! "SELECT id, login, active FROM users WHERE id = $id: i32"
26//! ).fetch(&pool)?;
27//!
28//! let user = &users[0];
29//! // user.id: i32, user.login: String, user.active: bool
30//! println!("{}: active={}", user.login, user.active);
31//! Ok(())
32//! }
33//! ```
34//!
35//! ## Two methods — that's it
36//!
37//! | Method | Returns | Use |
38//! |--------|---------|-----|
39//! | `.fetch(&pool)` | `Vec<Row>` | SELECT queries |
40//! | `.run(&pool)` | `u64` | INSERT, UPDATE, DELETE |
41//!
42//! Also: `fetch_one`, `fetch_optional`, `fetch_stream`, `for_each`, `defer` (for transactions).
43//!
44//! ## Escape hatch
45//!
46//! For rare cases requiring dynamic SQL (dynamic table names, pivots, DDL):
47//!
48//! ```rust,ignore
49//! let rows = pool.raw_query("SELECT * FROM pg_tables LIMIT 5")?;
50//! pool.raw_execute("CREATE INDEX CONCURRENTLY idx ON users (email)")?;
51//! ```
52//!
53//! `raw_query` / `raw_execute` bypass compile-time validation entirely.
54//! Use `query!` for everything else.
55
56// Re-export the query! macro and attribute macros
57pub use bsql_macros::pg_enum;
58pub use bsql_macros::query;
59pub use bsql_macros::sort;
60
61// Re-export all runtime types
62pub use bsql_core::error::{self, BsqlError, BsqlResult};
63// Used by generated code from `bsql::query!`. Not part of the user-facing API.
64#[doc(hidden)]
65pub use bsql_core::executor::{Executor, OwnedResult};
66pub use bsql_core::listener::{Listener, Notification};
67pub use bsql_core::pool::{Pool, PoolBuilder, PoolStatus, RawRow};
68
69/// A connection borrowed from the pool via [`Pool::acquire()`].
70///
71/// Most users should use `Pool` directly (query methods acquire and release
72/// connections automatically). `PoolConnection` is for advanced use cases
73/// where you need to hold a connection across multiple queries without a
74/// transaction.
75#[doc(hidden)]
76pub use bsql_core::pool::PoolConnection;
77pub use bsql_core::stream::QueryStream;
78pub use bsql_core::transaction::{IsolationLevel, Transaction};
79
80// SQLite pool, transaction, and streaming
81#[cfg(feature = "sqlite")]
82pub use bsql_core::{SqlitePool, SqliteStreamingQuery, SqliteTransaction};
83
84// Re-export driver types used by generated code
85#[doc(hidden)]
86pub use bsql_core::driver;
87
88// Re-export SQLite driver types used by generated code
89#[cfg(feature = "sqlite")]
90#[doc(hidden)]
91pub use bsql_core::driver_sqlite;