2022-01-05 22:52:17 +00:00
|
|
|
use tokio_postgres::config::{Config as DbConfig};
|
2022-04-08 18:52:13 +00:00
|
|
|
use tokio_postgres::error::{Error as PgError, SqlState};
|
|
|
|
use crate::errors::DatabaseError;
|
2022-01-05 22:52:17 +00:00
|
|
|
|
2021-11-19 17:32:51 +00:00
|
|
|
pub mod int_enum;
|
2022-04-21 22:37:08 +00:00
|
|
|
pub mod json_macro;
|
2021-04-09 00:22:17 +00:00
|
|
|
pub mod migrate;
|
2022-01-07 16:33:23 +00:00
|
|
|
pub mod query_macro;
|
2021-04-09 00:22:17 +00:00
|
|
|
|
2022-01-06 11:09:45 +00:00
|
|
|
#[cfg(test)]
|
|
|
|
pub mod test_utils;
|
|
|
|
|
2021-04-09 00:22:17 +00:00
|
|
|
pub type Pool = deadpool_postgres::Pool;
|
|
|
|
|
2022-01-05 22:52:17 +00:00
|
|
|
pub async fn create_database_client(db_config: &DbConfig) -> tokio_postgres::Client {
|
|
|
|
let (client, connection) = db_config.connect(tokio_postgres::NoTls)
|
|
|
|
.await.unwrap();
|
|
|
|
tokio::spawn(async move {
|
|
|
|
if let Err(err) = connection.await {
|
|
|
|
log::error!("connection error: {}", err);
|
|
|
|
};
|
|
|
|
});
|
|
|
|
client
|
|
|
|
}
|
|
|
|
|
2021-04-09 00:22:17 +00:00
|
|
|
pub fn create_pool(database_url: &str) -> Pool {
|
2022-04-08 18:52:13 +00:00
|
|
|
let manager = deadpool_postgres::Manager::new(
|
|
|
|
database_url.parse().expect("invalid database URL"),
|
|
|
|
tokio_postgres::NoTls,
|
|
|
|
);
|
|
|
|
// https://wiki.postgresql.org/wiki/Number_Of_Database_Connections
|
|
|
|
let pool_size = num_cpus::get() * 2;
|
|
|
|
Pool::builder(manager).max_size(pool_size).build().unwrap()
|
2021-04-09 00:22:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn get_database_client(pool: &Pool)
|
|
|
|
-> Result<deadpool_postgres::Client, DatabaseError>
|
|
|
|
{
|
|
|
|
// Returns wrapped client
|
|
|
|
// https://github.com/bikeshedder/deadpool/issues/56
|
|
|
|
let client = pool.get().await?;
|
|
|
|
Ok(client)
|
|
|
|
}
|
2021-10-17 16:55:33 +00:00
|
|
|
|
|
|
|
pub fn catch_unique_violation(
|
|
|
|
object_type: &'static str,
|
|
|
|
) -> impl Fn(PgError) -> DatabaseError {
|
|
|
|
move |err| {
|
|
|
|
if let Some(code) = err.code() {
|
|
|
|
if code == &SqlState::UNIQUE_VIOLATION {
|
|
|
|
return DatabaseError::AlreadyExists(object_type);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
err.into()
|
|
|
|
}
|
|
|
|
}
|