feat: add ability to set pool options when connecting

pull/2784/head
Remco Pander 4 weeks ago
parent e89dc96881
commit 1393c8cf68

@ -18,6 +18,15 @@ export interface QueryResult {
lastInsertId?: number lastInsertId?: number
} }
export interface ConnectionOptions {
sqlite?: {
pool?: {
max_connections?: number
min_connections?: number
}
}
}
/** /**
* **Database** * **Database**
* *
@ -45,8 +54,12 @@ export default class Database {
* const db = await Database.load("sqlite:test.db"); * const db = await Database.load("sqlite:test.db");
* ``` * ```
*/ */
static async load(path: string): Promise<Database> { static async load(
path: string,
options?: ConnectionOptions
): Promise<Database> {
const _path = await invoke<string>('plugin:sql|load', { const _path = await invoke<string>('plugin:sql|load', {
options,
db: path db: path
}) })

@ -7,7 +7,7 @@ use serde_json::Value as JsonValue;
use sqlx::migrate::Migrator; use sqlx::migrate::Migrator;
use tauri::{command, AppHandle, Runtime, State}; use tauri::{command, AppHandle, Runtime, State};
use crate::{DbInstances, DbPool, Error, LastInsertId, Migrations}; use crate::{wrapper::ConnectionOptions, DbInstances, DbPool, Error, LastInsertId, Migrations};
#[command] #[command]
pub(crate) async fn load<R: Runtime>( pub(crate) async fn load<R: Runtime>(
@ -15,8 +15,9 @@ pub(crate) async fn load<R: Runtime>(
db_instances: State<'_, DbInstances>, db_instances: State<'_, DbInstances>,
migrations: State<'_, Migrations>, migrations: State<'_, Migrations>,
db: String, db: String,
options: Option<ConnectionOptions>,
) -> Result<String, crate::Error> { ) -> Result<String, crate::Error> {
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) { if let Some(migrations) = migrations.0.lock().await.remove(&db) {
let migrator = Migrator::new(migrations).await?; let migrator = Migrator::new(migrations).await?;

@ -150,7 +150,7 @@ impl Builder {
let mut lock = instances.0.write().await; let mut lock = instances.0.write().await;
for db in config.preload { for db in config.preload {
let pool = DbPool::connect(&db, app).await?; let pool = DbPool::connect(&db, app, None).await?;
if let Some(migrations) = if let Some(migrations) =
self.migrations.as_mut().and_then(|mm| mm.remove(&db)) self.migrations.as_mut().and_then(|mm| mm.remove(&db))

@ -33,6 +33,25 @@ pub enum DbPool {
None, None,
} }
#[cfg(feature = "sqlite")]
#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub struct SqlitePoolOptions {
max_connections: Option<u32>,
min_connections: Option<u32>,
}
#[cfg(feature = "sqlite")]
#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub struct SqliteOptions {
pub pool: Option<SqlitePoolOptions>,
}
#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub struct ConnectionOptions {
#[cfg(feature = "sqlite")]
pub sqlite: Option<SqliteOptions>,
}
// public methods // public methods
/* impl DbPool { /* impl DbPool {
/// Get the inner Sqlite Pool. Returns None for MySql and Postgres pools. /// Get the inner Sqlite Pool. Returns None for MySql and Postgres pools.
@ -68,6 +87,7 @@ impl DbPool {
pub(crate) async fn connect<R: Runtime>( pub(crate) async fn connect<R: Runtime>(
conn_url: &str, conn_url: &str,
_app: &AppHandle<R>, _app: &AppHandle<R>,
options: Option<ConnectionOptions>,
) -> Result<Self, crate::Error> { ) -> Result<Self, crate::Error> {
match conn_url match conn_url
.split_once(':') .split_once(':')
@ -89,11 +109,23 @@ impl DbPool {
Sqlite::create_database(conn_url).await?; Sqlite::create_database(conn_url).await?;
} }
let pool = sqlx::sqlite::SqlitePoolOptions::new() let mut pool_options = sqlx::sqlite::SqlitePoolOptions::new();
.max_connections(1)
.connect(conn_url); 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")] #[cfg(feature = "mysql")]
"mysql" => { "mysql" => {

Loading…
Cancel
Save