2023-10-07 00:51:21 +03:00
|
|
|
// TODO: think a lot more about this
|
|
|
|
|
2023-10-03 23:46:27 +03:00
|
|
|
use crate::{app::Web3ProxyApp, errors::Web3ProxyError, relational_db::DatabaseReplica};
|
2023-07-15 04:30:01 +03:00
|
|
|
use derivative::Derivative;
|
|
|
|
use migration::{
|
|
|
|
sea_orm::{DatabaseConnection, DatabaseTransaction, TransactionTrait},
|
|
|
|
DbErr,
|
|
|
|
};
|
2023-10-03 23:46:27 +03:00
|
|
|
use parking_lot::RwLock;
|
|
|
|
use std::sync::{Arc, LazyLock, OnceLock};
|
2023-07-15 04:30:01 +03:00
|
|
|
|
2023-10-03 23:46:27 +03:00
|
|
|
pub static APP: OnceLock<Arc<Web3ProxyApp>> = OnceLock::new();
|
2023-07-15 04:30:01 +03:00
|
|
|
|
2023-10-03 23:46:27 +03:00
|
|
|
pub static DB_CONN: LazyLock<RwLock<Result<DatabaseConnection, DatabaseError>>> =
|
|
|
|
LazyLock::new(|| RwLock::new(Err(DatabaseError::NotConfigured)));
|
|
|
|
|
|
|
|
pub static DB_REPLICA: LazyLock<RwLock<Result<DatabaseReplica, DatabaseError>>> =
|
|
|
|
LazyLock::new(|| RwLock::new(Err(DatabaseError::NotConfigured)));
|
2023-07-15 04:30:01 +03:00
|
|
|
|
|
|
|
#[derive(Clone, Debug, Derivative)]
|
|
|
|
pub enum DatabaseError {
|
|
|
|
/// no database configured. depending on what you need, this may or may not be a problem
|
|
|
|
NotConfigured,
|
|
|
|
/// an error that happened when creating the connection pool
|
|
|
|
Connect(Arc<DbErr>),
|
|
|
|
/// an error that just happened
|
|
|
|
Begin(Arc<DbErr>),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<DatabaseError> for Web3ProxyError {
|
|
|
|
fn from(value: DatabaseError) -> Self {
|
|
|
|
match value {
|
|
|
|
DatabaseError::NotConfigured => Self::NoDatabaseConfigured,
|
|
|
|
DatabaseError::Connect(err) | DatabaseError::Begin(err) => Self::DatabaseArc(err),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-03 23:46:27 +03:00
|
|
|
/// TODO: do we need this clone? should we just do DB_CONN.read() whenever we need a Connection?
|
2023-07-15 04:30:01 +03:00
|
|
|
#[inline]
|
2023-10-03 23:46:27 +03:00
|
|
|
pub fn global_db_conn() -> Result<DatabaseConnection, DatabaseError> {
|
|
|
|
DB_CONN.read().clone()
|
2023-07-15 04:30:01 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
pub async fn global_db_transaction() -> Result<DatabaseTransaction, DatabaseError> {
|
2023-10-03 23:46:27 +03:00
|
|
|
let x = global_db_conn()?;
|
2023-07-15 04:30:01 +03:00
|
|
|
|
|
|
|
let x = x
|
|
|
|
.begin()
|
|
|
|
.await
|
|
|
|
.map_err(|x| DatabaseError::Begin(Arc::new(x)))?;
|
|
|
|
|
|
|
|
Ok(x)
|
|
|
|
}
|
|
|
|
|
2023-10-03 23:46:27 +03:00
|
|
|
/// TODO: do we need this clone?
|
2023-07-15 04:30:01 +03:00
|
|
|
#[inline]
|
2023-10-03 23:46:27 +03:00
|
|
|
pub fn global_db_replica_conn() -> Result<DatabaseReplica, DatabaseError> {
|
|
|
|
DB_REPLICA.read().clone()
|
2023-07-15 04:30:01 +03:00
|
|
|
}
|