use std::fmt;
use serde::{Deserialize, Serialize};
use diesel::prelude::*;
use diesel::r2d2::{self, CustomizeConnection, State};
use crate::core::serde::default_false;
fn default_db_pool_size() -> u32 {
10
}
fn default_tcp_timeout() -> u64 {
10000
}
fn default_connection_timeout() -> u64 {
30000
}
fn default_statement_timeout() -> u64 {
30000
}
fn default_helper_threads() -> usize {
10
}
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct DbConfig {
pub url: String,
#[serde(default = "default_db_pool_size")]
pub pool_size: u32,
pub min_idle: Option<u32>,
#[serde(default = "default_tcp_timeout")]
pub tcp_timeout: u64,
#[serde(default = "default_connection_timeout")]
pub connection_timeout: u64,
#[serde(default = "default_statement_timeout")]
pub statement_timeout: u64,
#[serde(default = "default_helper_threads")]
pub helper_threads: usize,
#[serde(default = "default_false")]
pub enforce_tls: bool,
}
impl fmt::Display for DbConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let lines = [
("tcp_timeout", self.tcp_timeout),
];
let mut msg: String = "Active config values:\n\n".to_owned();
for line in lines.into_iter().enumerate() {
msg += &format!("{}: {}\n", line.1 .0, line.1 .1);
}
write!(f, "{msg}")
}
}
#[derive(Debug, Clone, Copy)]
pub struct ConnectionConfig {
pub statement_timeout: u64,
}
impl CustomizeConnection<PgConnection, r2d2::Error> for ConnectionConfig {
fn on_acquire(&self, conn: &mut PgConnection) -> Result<(), r2d2::Error> {
use diesel::sql_query;
sql_query(format!("SET statement_timeout = {}", self.statement_timeout))
.execute(conn)
.map_err(r2d2::Error::QueryError)?;
Ok(())
}
}