From 0d822c056540ff067a0a8eaf776c9f226e34c147 Mon Sep 17 00:00:00 2001 From: Huliiiiii <308013446a@gmail.com> Date: Fri, 24 Oct 2025 00:16:00 +0800 Subject: [PATCH 1/4] Add sqlx pool options mapping for drivers --- src/database/mod.rs | 80 +++++++++++++++++++++++++++++++++++++ src/driver/sqlx_mysql.rs | 13 ++++-- src/driver/sqlx_postgres.rs | 4 ++ src/driver/sqlx_sqlite.rs | 15 +++++-- 4 files changed, 104 insertions(+), 8 deletions(-) diff --git a/src/database/mod.rs b/src/database/mod.rs index 6f8104a29..41bce94eb 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -86,6 +86,35 @@ pub struct ConnectOptions { pub(crate) connect_lazy: bool, #[cfg(feature = "sqlx-mysql")] #[debug(skip)] + pub(crate) mysql_pool_opts_fn: Option< + Arc< + dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync, + >, + >, + #[cfg(feature = "sqlx-postgres")] + #[debug(skip)] + pub(crate) pg_pool_opts_fn: Option< + Arc< + dyn Fn( + sqlx::pool::PoolOptions, + ) -> sqlx::pool::PoolOptions + + Send + + Sync, + >, + >, + #[cfg(feature = "sqlx-sqlite")] + #[debug(skip)] + pub(crate) sqlite_pool_opts_fn: Option< + Arc< + dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync, + >, + >, + #[cfg(feature = "sqlx-mysql")] + #[debug(skip)] pub(crate) mysql_opts_fn: Option MySqlConnectOptions + Send + Sync>>, #[cfg(feature = "sqlx-postgres")] @@ -199,6 +228,12 @@ impl ConnectOptions { test_before_acquire: true, connect_lazy: false, #[cfg(feature = "sqlx-mysql")] + mysql_pool_opts_fn: None, + #[cfg(feature = "sqlx-postgres")] + pg_pool_opts_fn: None, + #[cfg(feature = "sqlx-sqlite")] + sqlite_pool_opts_fn: None, + #[cfg(feature = "sqlx-mysql")] mysql_opts_fn: None, #[cfg(feature = "sqlx-postgres")] pg_opts_fn: None, @@ -369,6 +404,21 @@ impl ConnectOptions { self } + #[cfg(feature = "sqlx-mysql")] + #[cfg_attr(docsrs, doc(cfg(feature = "sqlx-mysql")))] + /// Apply a function to modify the underlying [`sqlx::pool::PoolOptions`] + /// before creating the connection pool. + pub fn map_sqlx_mysql_pool_opts(&mut self, f: F) -> &mut Self + where + F: Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync + + 'static, + { + self.mysql_pool_opts_fn = Some(Arc::new(f)); + self + } + #[cfg(feature = "sqlx-postgres")] #[cfg_attr(docsrs, doc(cfg(feature = "sqlx-postgres")))] /// Apply a function to modify the underlying [`PgConnectOptions`] before @@ -381,6 +431,21 @@ impl ConnectOptions { self } + #[cfg(feature = "sqlx-postgres")] + #[cfg_attr(docsrs, doc(cfg(feature = "sqlx-postgres")))] + /// Apply a function to modify the underlying [`sqlx::pool::PoolOptions`] + /// before creating the connection pool. + pub fn map_sqlx_postgres_pool_opts(&mut self, f: F) -> &mut Self + where + F: Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync + + 'static, + { + self.pg_pool_opts_fn = Some(Arc::new(f)); + self + } + #[cfg(feature = "sqlx-sqlite")] #[cfg_attr(docsrs, doc(cfg(feature = "sqlx-sqlite")))] /// Apply a function to modify the underlying [`SqliteConnectOptions`] before @@ -392,4 +457,19 @@ impl ConnectOptions { self.sqlite_opts_fn = Some(Arc::new(f)); self } + + #[cfg(feature = "sqlx-sqlite")] + #[cfg_attr(docsrs, doc(cfg(feature = "sqlx-sqlite")))] + /// Apply a function to modify the underlying [`sqlx::pool::PoolOptions`] + /// before creating the connection pool. + pub fn map_sqlx_sqlite_pool_opts(&mut self, f: F) -> &mut Self + where + F: Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync + + 'static, + { + self.sqlite_pool_opts_fn = Some(Arc::new(f)); + self + } } diff --git a/src/driver/sqlx_mysql.rs b/src/driver/sqlx_mysql.rs index 44dc9e40d..7c3ef2daa 100644 --- a/src/driver/sqlx_mysql.rs +++ b/src/driver/sqlx_mysql.rs @@ -80,11 +80,16 @@ impl SqlxMySqlConnector { if let Some(f) = &options.mysql_opts_fn { sqlx_opts = f(sqlx_opts); } - let pool = if options.connect_lazy { - options.sqlx_pool_options().connect_lazy_with(sqlx_opts) + let connect_lazy = options.connect_lazy; + let mysql_pool_opts_fn = options.mysql_pool_opts_fn.clone(); + let mut pool_options = options.sqlx_pool_options(); + if let Some(f) = &mysql_pool_opts_fn { + pool_options = f(pool_options); + } + let pool = if connect_lazy { + pool_options.connect_lazy_with(sqlx_opts) } else { - options - .sqlx_pool_options() + pool_options .connect_with(sqlx_opts) .await .map_err(sqlx_error_to_conn_err)? diff --git a/src/driver/sqlx_postgres.rs b/src/driver/sqlx_postgres.rs index 0b8e3d26b..4d1c6698a 100644 --- a/src/driver/sqlx_postgres.rs +++ b/src/driver/sqlx_postgres.rs @@ -101,6 +101,7 @@ impl SqlxPostgresConnector { string }); let lazy = options.connect_lazy; + let pg_pool_opts_fn = options.pg_pool_opts_fn.clone(); let mut pool_options = options.sqlx_pool_options(); if let Some(sql) = set_search_path_sql { pool_options = pool_options.after_connect(move |conn, _| { @@ -112,6 +113,9 @@ impl SqlxPostgresConnector { }) }); } + if let Some(f) = &pg_pool_opts_fn { + pool_options = f(pool_options); + } let pool = if lazy { pool_options.connect_lazy_with(sqlx_opts) } else { diff --git a/src/driver/sqlx_sqlite.rs b/src/driver/sqlx_sqlite.rs index 551bd5a84..04e729646 100644 --- a/src/driver/sqlx_sqlite.rs +++ b/src/driver/sqlx_sqlite.rs @@ -90,11 +90,18 @@ impl SqlxSqliteConnector { sqlx_opts = f(sqlx_opts); } - let pool = if options.connect_lazy { - options.sqlx_pool_options().connect_lazy_with(sqlx_opts) + let connect_lazy = options.connect_lazy; + let sqlite_pool_opts_fn = options.sqlite_pool_opts_fn.clone(); + let mut pool_options = options.sqlx_pool_options(); + + if let Some(f) = &sqlite_pool_opts_fn { + pool_options = f(pool_options); + } + + let pool = if connect_lazy { + pool_options.connect_lazy_with(sqlx_opts) } else { - options - .sqlx_pool_options() + pool_options .connect_with(sqlx_opts) .await .map_err(sqlx_error_to_conn_err)? From d26a25501cfd15ff0967d4cbd513f86020e75e79 Mon Sep 17 00:00:00 2001 From: Huliiiiii <308013446a@gmail.com> Date: Fri, 24 Oct 2025 00:40:25 +0800 Subject: [PATCH 2/4] Clippy --- src/database/mod.rs | 46 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/database/mod.rs b/src/database/mod.rs index 41bce94eb..e7d4f73d7 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -49,6 +49,26 @@ use crate::error::*; #[derive(Debug, Default)] pub struct Database; +type MapMySqlPoolOptsFn = Arc< + dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync, +>; + +type MapPgPoolOptsFn = Arc< + dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync, +>; + +type MapSqlitePoolOptsFn = Option< + Arc< + dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + + Send + + Sync, + >, +>; + /// Defines the configuration options of a database #[derive(derive_more::Debug, Clone)] pub struct ConnectOptions { @@ -86,33 +106,13 @@ pub struct ConnectOptions { pub(crate) connect_lazy: bool, #[cfg(feature = "sqlx-mysql")] #[debug(skip)] - pub(crate) mysql_pool_opts_fn: Option< - Arc< - dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions - + Send - + Sync, - >, - >, + pub(crate) mysql_pool_opts_fn: Option, #[cfg(feature = "sqlx-postgres")] #[debug(skip)] - pub(crate) pg_pool_opts_fn: Option< - Arc< - dyn Fn( - sqlx::pool::PoolOptions, - ) -> sqlx::pool::PoolOptions - + Send - + Sync, - >, - >, + pub(crate) pg_pool_opts_fn: Option, #[cfg(feature = "sqlx-sqlite")] #[debug(skip)] - pub(crate) sqlite_pool_opts_fn: Option< - Arc< - dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions - + Send - + Sync, - >, - >, + pub(crate) sqlite_pool_opts_fn: MapSqlitePoolOptsFn, #[cfg(feature = "sqlx-mysql")] #[debug(skip)] pub(crate) mysql_opts_fn: From 1be125a10de6929f87c89026cad2403344a50e80 Mon Sep 17 00:00:00 2001 From: Huliiiiii <308013446a@gmail.com> Date: Fri, 24 Oct 2025 00:47:59 +0800 Subject: [PATCH 3/4] Fix --- src/database/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/database/mod.rs b/src/database/mod.rs index e7d4f73d7..45b30bb81 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -49,18 +49,21 @@ use crate::error::*; #[derive(Debug, Default)] pub struct Database; +#[cfg(feature = "sqlx-mysql")] type MapMySqlPoolOptsFn = Arc< dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + Send + Sync, >; +#[cfg(feature = "sqlx-postgres")] type MapPgPoolOptsFn = Arc< dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions + Send + Sync, >; +#[cfg(feature = "sqlx-sqlite")] type MapSqlitePoolOptsFn = Option< Arc< dyn Fn(sqlx::pool::PoolOptions) -> sqlx::pool::PoolOptions From 8b460de61b76635250fa8833a85aacf549855370 Mon Sep 17 00:00:00 2001 From: Huliiiiii <134658521+Huliiiiii@users.noreply.github.com> Date: Thu, 25 Dec 2025 08:00:07 +0800 Subject: [PATCH 4/4] Fmt --- src/database/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/database/mod.rs b/src/database/mod.rs index 51305d3ce..6092362d8 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -78,7 +78,9 @@ type MapSqlitePoolOptsFn = Option< >; type AfterConnectCallback = Option< - Arc BoxFuture<'static, Result<(), DbErr>> + Send + Sync + 'static>, + Arc< + dyn Fn(DatabaseConnection) -> BoxFuture<'static, Result<(), DbErr>> + Send + Sync + 'static, + >, >; /// Defines the configuration options of a database