//! # Database connection management use crate::app_config::AppConfig; use diesel::{Connection, PgConnection}; use std::cell::RefCell; thread_local! { static POSTGRES_CONNECTION: RefCell> = RefCell::new(None); } /// Execute a request on the database pub fn execute(cb: E) -> anyhow::Result where E: FnOnce(&mut PgConnection) -> anyhow::Result, { // Establish connection if required if POSTGRES_CONNECTION.with(|i| i.borrow().is_none()) { let database_url = AppConfig::get().db_connection_chain(); let conn = PgConnection::establish(&database_url) .unwrap_or_else(|_| panic!("Error connecting to {}", database_url)); POSTGRES_CONNECTION.with(|i| *i.borrow_mut() = Some(conn)) } POSTGRES_CONNECTION.with(|i| cb(i.borrow_mut().as_mut().unwrap())) }