#[cfg(feature = "database-mysql")]
use strut_database::sqlx::MySql;
#[cfg(feature = "database-postgres")]
use strut_database::sqlx::Postgres;
#[cfg(feature = "database-sqlite")]
use strut_database::sqlx::Sqlite;
#[cfg(any(
feature = "database-mysql",
feature = "database-postgres",
feature = "database-sqlite",
))]
use {
crate::AppConfig,
parking_lot::Mutex as SyncMutex,
std::collections::HashMap,
std::sync::OnceLock,
strut_database::{sqlx::Pool, Connector},
};
#[cfg(any(
feature = "database-mysql",
feature = "database-postgres",
feature = "database-sqlite",
))]
pub struct Database;
#[cfg(any(
feature = "database-default-mysql",
all(
feature = "database-mysql",
not(feature = "database-postgres"),
not(feature = "database-sqlite"),
),
))]
impl Database {
pub fn default() -> Pool<MySql> {
static POOL: OnceLock<Pool<MySql>> = OnceLock::new();
POOL.get_or_init(Self::start_default).clone()
}
fn start_default() -> Pool<MySql> {
let handle = AppConfig::get().database().default_handle().clone();
Connector::start(handle)
}
}
#[cfg(any(
feature = "database-default-postgres",
all(
feature = "database-postgres",
not(feature = "database-mysql"),
not(feature = "database-sqlite"),
),
))]
impl Database {
pub fn default() -> Pool<Postgres> {
static POOL: OnceLock<Pool<Postgres>> = OnceLock::new();
POOL.get_or_init(Self::start_default).clone()
}
fn start_default() -> Pool<Postgres> {
let handle = AppConfig::get().database().default_handle().clone();
Connector::start(handle)
}
}
#[cfg(any(
feature = "database-default-sqlite",
all(
feature = "database-sqlite",
not(feature = "database-mysql"),
not(feature = "database-postgres"),
),
))]
impl Database {
pub fn default() -> Pool<Sqlite> {
static POOL: OnceLock<Pool<Sqlite>> = OnceLock::new();
POOL.get_or_init(Self::start_default).clone()
}
fn start_default() -> Pool<Sqlite> {
let handle = AppConfig::get().database().default_handle().clone();
Connector::start(handle)
}
}
#[cfg(feature = "database-mysql")]
impl Database {
pub fn mysql(name: impl AsRef<str>) -> Pool<MySql> {
static MAP: OnceLock<SyncMutex<HashMap<String, Pool<MySql>>>> = OnceLock::new();
let name = name.as_ref();
MAP.get_or_init(Self::init_mysql_map)
.lock()
.entry(name.to_string())
.or_insert_with(|| Self::make_mysql_pool(name))
.clone()
}
fn init_mysql_map() -> SyncMutex<HashMap<String, Pool<MySql>>> {
SyncMutex::new(HashMap::new())
}
fn make_mysql_pool(name: &str) -> Pool<MySql> {
let handle = AppConfig::get()
.database()
.mysql_handles()
.expect(name)
.clone();
Connector::start(handle)
}
}
#[cfg(feature = "database-postgres")]
impl Database {
pub fn postgres(name: impl AsRef<str>) -> Pool<Postgres> {
static MAP: OnceLock<SyncMutex<HashMap<String, Pool<Postgres>>>> = OnceLock::new();
let name = name.as_ref();
MAP.get_or_init(Self::init_postgres_map)
.lock()
.entry(name.to_string())
.or_insert_with(|| Self::make_postgres_pool(name))
.clone()
}
fn init_postgres_map() -> SyncMutex<HashMap<String, Pool<Postgres>>> {
SyncMutex::new(HashMap::new())
}
fn make_postgres_pool(name: &str) -> Pool<Postgres> {
let handle = AppConfig::get()
.database()
.postgres_handles()
.expect(name)
.clone();
Connector::start(handle)
}
}
#[cfg(feature = "database-sqlite")]
impl Database {
pub fn sqlite(name: impl AsRef<str>) -> Pool<Sqlite> {
static MAP: OnceLock<SyncMutex<HashMap<String, Pool<Sqlite>>>> = OnceLock::new();
let name = name.as_ref();
MAP.get_or_init(Self::init_sqlite_map)
.lock()
.entry(name.to_string())
.or_insert_with(|| Self::make_sqlite_pool(name))
.clone()
}
fn init_sqlite_map() -> SyncMutex<HashMap<String, Pool<Sqlite>>> {
SyncMutex::new(HashMap::new())
}
fn make_sqlite_pool(name: &str) -> Pool<Sqlite> {
let handle = AppConfig::get()
.database()
.sqlite_handles()
.expect(name)
.clone();
Connector::start(handle)
}
}