sql_middleware/pool/mod.rs
1pub mod any_conn_wrapper;
2pub mod connection;
3pub mod interaction;
4#[cfg(any(
5 feature = "postgres",
6 feature = "sqlite",
7 feature = "mssql",
8 feature = "turso"
9))]
10pub mod options;
11pub mod types;
12
13pub use any_conn_wrapper::AnyConnWrapper;
14pub use connection::MiddlewarePoolConnection;
15#[cfg(any(
16 feature = "postgres",
17 feature = "sqlite",
18 feature = "mssql",
19 feature = "turso"
20))]
21pub use options::MiddlewarePoolOptions;
22pub use types::MiddlewarePool;
23
24use crate::SqlMiddlewareDbError;
25use crate::types::{DatabaseType, StatementCacheMode};
26
27/// Configuration plus connection pool for a database backend.
28///
29/// Construct with the backend-specific builders on `ConfigAndPool` (e.g., `sqlite_builder`,
30/// `postgres_builder`), then borrow connections as needed:
31/// ```rust,no_run
32/// use sql_middleware::prelude::*;
33///
34/// # async fn demo() -> Result<(), SqlMiddlewareDbError> {
35/// let cap = ConfigAndPool::sqlite_builder("file::memory:?cache=shared".to_string())
36/// .build()
37/// .await?;
38/// let mut conn = cap.get_connection().await?;
39/// let rows = conn.query("SELECT 1").select().await?;
40/// assert_eq!(rows.results.len(), 1);
41/// # Ok(()) }
42/// ```
43#[derive(Clone, Debug)]
44pub struct ConfigAndPool {
45 /// The connection pool
46 pub pool: MiddlewarePool,
47 /// The database type
48 pub db_type: DatabaseType,
49 /// Whether placeholder translation is enabled by default for this pool
50 pub translate_placeholders: bool,
51 /// Default statement cache mode for SQLite/Turso paths.
52 pub statement_cache_mode: StatementCacheMode,
53}
54
55impl ConfigAndPool {
56 /// Get a pooled connection and attach pool-level defaults to it.
57 ///
58 /// # Errors
59 /// Bubbles up pool checkout errors for the active backend.
60 ///
61 /// # Examples
62 /// ```rust,no_run
63 /// use sql_middleware::prelude::*;
64 ///
65 /// # async fn demo() -> Result<(), SqlMiddlewareDbError> {
66 /// let cap = ConfigAndPool::sqlite_builder("file::memory:?cache=shared".to_string())
67 /// .build()
68 /// .await?;
69 /// let mut conn = cap.get_connection().await?;
70 /// conn.execute_batch("CREATE TABLE t (id INTEGER)").await?;
71 /// # Ok(()) }
72 /// ```
73 pub async fn get_connection(&self) -> Result<MiddlewarePoolConnection, SqlMiddlewareDbError> {
74 let pool_ref = self.pool.get().await?;
75 MiddlewarePool::get_connection(
76 pool_ref,
77 self.translate_placeholders,
78 self.statement_cache_mode,
79 )
80 .await
81 }
82}