Handle database restarts

This commit is contained in:
2023-06-13 15:24:13 +02:00
parent 4bfd30f5dd
commit c979e77c54
2 changed files with 38 additions and 29 deletions

View File

@ -1,6 +1,7 @@
//! # Database connection management
use crate::app_config::AppConfig;
use diesel::result::{DatabaseErrorKind, Error};
use diesel::{Connection, PgConnection};
use std::cell::RefCell;
thread_local! {
@ -10,7 +11,7 @@ thread_local! {
/// Execute a request on the database
pub fn execute<E, I>(cb: E) -> anyhow::Result<I>
where
E: FnOnce(&mut PgConnection) -> anyhow::Result<I>,
E: FnOnce(&mut PgConnection) -> diesel::QueryResult<I>,
{
// Establish connection if required
if POSTGRES_CONNECTION.with(|i| i.borrow().is_none()) {
@ -21,5 +22,20 @@ where
POSTGRES_CONNECTION.with(|i| *i.borrow_mut() = Some(conn))
}
POSTGRES_CONNECTION.with(|i| cb(i.borrow_mut().as_mut().unwrap()))
match POSTGRES_CONNECTION.with(|i| cb(i.borrow_mut().as_mut().unwrap())) {
Ok(res) => Ok(res),
Err(e) => {
if matches!(
e,
Error::DatabaseError(DatabaseErrorKind::ClosedConnection, _)
| Error::BrokenTransactionManager
) {
log::warn!("Connection to database closed, dropping handle!");
POSTGRES_CONNECTION.with(|i| *i.borrow_mut() = None)
}
log::error!("Database query error! {:?}", e);
Err(e.into())
}
}
}