Skip to main content

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}