From cf2c3986dfd5c980ad36ddbf36f76d0fb5d02d34 Mon Sep 17 00:00:00 2001 From: Remco Pander Date: Wed, 18 Jun 2025 17:32:35 +0200 Subject: [PATCH 1/4] feat: see if manually setting max_connections works --- plugins/sql/src/wrapper.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/sql/src/wrapper.rs b/plugins/sql/src/wrapper.rs index d47b2d1cbe..54f124befb 100644 --- a/plugins/sql/src/wrapper.rs +++ b/plugins/sql/src/wrapper.rs @@ -88,7 +88,12 @@ impl DbPool { if !Sqlite::database_exists(conn_url).await.unwrap_or(false) { Sqlite::create_database(conn_url).await?; } - Ok(Self::Sqlite(Pool::connect(conn_url).await?)) + + let pool = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(1) + .connect(conn_url); + + Ok(Self::Sqlite(pool.await?)) } #[cfg(feature = "mysql")] "mysql" => { From 1393c8cf68c56b5df00aac232c19ca7d684d4f27 Mon Sep 17 00:00:00 2001 From: Remco Pander Date: Fri, 20 Jun 2025 16:05:21 +0200 Subject: [PATCH 2/4] feat: add ability to set pool options when connecting --- plugins/sql/guest-js/index.ts | 15 ++++++++++++- plugins/sql/src/commands.rs | 5 +++-- plugins/sql/src/lib.rs | 2 +- plugins/sql/src/wrapper.rs | 40 +++++++++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/plugins/sql/guest-js/index.ts b/plugins/sql/guest-js/index.ts index 11d39e70b4..5a468c7c26 100644 --- a/plugins/sql/guest-js/index.ts +++ b/plugins/sql/guest-js/index.ts @@ -18,6 +18,15 @@ export interface QueryResult { lastInsertId?: number } +export interface ConnectionOptions { + sqlite?: { + pool?: { + max_connections?: number + min_connections?: number + } + } +} + /** * **Database** * @@ -45,8 +54,12 @@ export default class Database { * const db = await Database.load("sqlite:test.db"); * ``` */ - static async load(path: string): Promise { + static async load( + path: string, + options?: ConnectionOptions + ): Promise { const _path = await invoke('plugin:sql|load', { + options, db: path }) diff --git a/plugins/sql/src/commands.rs b/plugins/sql/src/commands.rs index 760d00b2d2..5b40d2304d 100644 --- a/plugins/sql/src/commands.rs +++ b/plugins/sql/src/commands.rs @@ -7,7 +7,7 @@ use serde_json::Value as JsonValue; use sqlx::migrate::Migrator; use tauri::{command, AppHandle, Runtime, State}; -use crate::{DbInstances, DbPool, Error, LastInsertId, Migrations}; +use crate::{wrapper::ConnectionOptions, DbInstances, DbPool, Error, LastInsertId, Migrations}; #[command] pub(crate) async fn load( @@ -15,8 +15,9 @@ pub(crate) async fn load( db_instances: State<'_, DbInstances>, migrations: State<'_, Migrations>, db: String, + options: Option, ) -> Result { - let pool = DbPool::connect(&db, &app).await?; + let pool = DbPool::connect(&db, &app, options).await?; if let Some(migrations) = migrations.0.lock().await.remove(&db) { let migrator = Migrator::new(migrations).await?; diff --git a/plugins/sql/src/lib.rs b/plugins/sql/src/lib.rs index 56b2a3a6b7..7c981ce45f 100644 --- a/plugins/sql/src/lib.rs +++ b/plugins/sql/src/lib.rs @@ -150,7 +150,7 @@ impl Builder { let mut lock = instances.0.write().await; for db in config.preload { - let pool = DbPool::connect(&db, app).await?; + let pool = DbPool::connect(&db, app, None).await?; if let Some(migrations) = self.migrations.as_mut().and_then(|mm| mm.remove(&db)) diff --git a/plugins/sql/src/wrapper.rs b/plugins/sql/src/wrapper.rs index 54f124befb..23fde475a4 100644 --- a/plugins/sql/src/wrapper.rs +++ b/plugins/sql/src/wrapper.rs @@ -33,6 +33,25 @@ pub enum DbPool { None, } +#[cfg(feature = "sqlite")] +#[derive(serde::Serialize, serde::Deserialize, Debug)] +pub struct SqlitePoolOptions { + max_connections: Option, + min_connections: Option, +} + +#[cfg(feature = "sqlite")] +#[derive(serde::Serialize, serde::Deserialize, Debug)] +pub struct SqliteOptions { + pub pool: Option, +} + +#[derive(serde::Serialize, serde::Deserialize, Debug)] +pub struct ConnectionOptions { + #[cfg(feature = "sqlite")] + pub sqlite: Option, +} + // public methods /* impl DbPool { /// Get the inner Sqlite Pool. Returns None for MySql and Postgres pools. @@ -68,6 +87,7 @@ impl DbPool { pub(crate) async fn connect( conn_url: &str, _app: &AppHandle, + options: Option, ) -> Result { match conn_url .split_once(':') @@ -89,11 +109,23 @@ impl DbPool { Sqlite::create_database(conn_url).await?; } - let pool = sqlx::sqlite::SqlitePoolOptions::new() - .max_connections(1) - .connect(conn_url); + let mut pool_options = sqlx::sqlite::SqlitePoolOptions::new(); + + let sqlite_pool_options = options + .and_then(|opts| opts.sqlite) + .and_then(|sqlite_opts| sqlite_opts.pool); + + if let Some(custom_pool_opts) = sqlite_pool_options { + if let Some(max_connections) = custom_pool_opts.max_connections { + pool_options = pool_options.max_connections(max_connections); + } + + if let Some(min_connections) = custom_pool_opts.min_connections { + pool_options = pool_options.min_connections(min_connections); + } + } - Ok(Self::Sqlite(pool.await?)) + Ok(Self::Sqlite(pool_options.connect(conn_url).await?)) } #[cfg(feature = "mysql")] "mysql" => { From 77d1f9a9e0b6e19b2ac1a927492682f488678c6f Mon Sep 17 00:00:00 2001 From: Remco Pander Date: Tue, 26 Aug 2025 18:56:04 +0200 Subject: [PATCH 3/4] chore: update api-iife.js --- plugins/sql/api-iife.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sql/api-iife.js b/plugins/sql/api-iife.js index a30f68d909..f869d9425b 100644 --- a/plugins/sql/api-iife.js +++ b/plugins/sql/api-iife.js @@ -1 +1 @@ -if("__TAURI__"in window){var __TAURI_PLUGIN_SQL__=function(){"use strict";async function e(e,t={},s){return window.__TAURI_INTERNALS__.invoke(e,t,s)}"function"==typeof SuppressedError&&SuppressedError;class t{constructor(e){this.path=e}static async load(s){const n=await e("plugin:sql|load",{db:s});return new t(n)}static get(e){return new t(e)}async execute(t,s){const[n,r]=await e("plugin:sql|execute",{db:this.path,query:t,values:s??[]});return{lastInsertId:r,rowsAffected:n}}async select(t,s){return await e("plugin:sql|select",{db:this.path,query:t,values:s??[]})}async close(t){return await e("plugin:sql|close",{db:t})}}return t}();Object.defineProperty(window.__TAURI__,"sql",{value:__TAURI_PLUGIN_SQL__})} +if("__TAURI__"in window){var __TAURI_PLUGIN_SQL__=function(){"use strict";async function t(t,e={},s){return window.__TAURI_INTERNALS__.invoke(t,e,s)}"function"==typeof SuppressedError&&SuppressedError;class e{constructor(t){this.path=t}static async load(s,n){const r=await t("plugin:sql|load",{options:n,db:s});return new e(r)}static get(t){return new e(t)}async execute(e,s){const[n,r]=await t("plugin:sql|execute",{db:this.path,query:e,values:s??[]});return{lastInsertId:r,rowsAffected:n}}async select(e,s){return await t("plugin:sql|select",{db:this.path,query:e,values:s??[]})}async close(e){return await t("plugin:sql|close",{db:e})}}return e}();Object.defineProperty(window.__TAURI__,"sql",{value:__TAURI_PLUGIN_SQL__})} From 667737e937c2fe2e9a12f238ad29427459bf1ab9 Mon Sep 17 00:00:00 2001 From: Remco Pander Date: Tue, 26 Aug 2025 18:57:33 +0200 Subject: [PATCH 4/4] fix: suppress unused `options` variable --- plugins/sql/src/wrapper.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sql/src/wrapper.rs b/plugins/sql/src/wrapper.rs index 23fde475a4..18bcd85c7b 100644 --- a/plugins/sql/src/wrapper.rs +++ b/plugins/sql/src/wrapper.rs @@ -87,7 +87,7 @@ impl DbPool { pub(crate) async fn connect( conn_url: &str, _app: &AppHandle, - options: Option, + #[allow(unused_variables)] options: Option, ) -> Result { match conn_url .split_once(':')