config: convert database backend to enum

This reports a nice error when the config is loaded, rather than later
when the database is initialized.
This commit is contained in:
Lambda 2024-06-16 14:31:59 +00:00 committed by Charles Hall
parent d26b87a2f2
commit 8a30817930
No known key found for this signature in database
GPG key ID: 7B8E0645816E07CF
3 changed files with 40 additions and 11 deletions

View file

@ -153,9 +153,29 @@ impl Default for TurnConfig {
}
}
#[derive(Clone, Copy, Debug, Deserialize)]
#[serde(rename_all = "lowercase")]
pub(crate) enum DatabaseBackend {
#[cfg(feature = "rocksdb")]
Rocksdb,
#[cfg(feature = "sqlite")]
Sqlite,
}
impl Display for DatabaseBackend {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
#[cfg(feature = "rocksdb")]
DatabaseBackend::Rocksdb => write!(f, "RocksDB"),
#[cfg(feature = "sqlite")]
DatabaseBackend::Sqlite => write!(f, "SQLite"),
}
}
}
#[derive(Clone, Debug, Deserialize)]
pub(crate) struct DatabaseConfig {
pub(crate) backend: String,
pub(crate) backend: DatabaseBackend,
pub(crate) path: String,
#[serde(default = "default_db_cache_capacity_mb")]
pub(crate) cache_capacity_mb: f64,

View file

@ -25,8 +25,8 @@ use ruma::{
use tracing::{debug, error, info, info_span, warn, Instrument};
use crate::{
service::rooms::timeline::PduCount, services, utils, Config, Error,
PduEvent, Result, Services, SERVICES,
config::DatabaseBackend, service::rooms::timeline::PduCount, services,
utils, Config, Error, PduEvent, Result, Services, SERVICES,
};
pub(crate) struct KeyValueDatabase {
@ -279,14 +279,22 @@ impl KeyValueDatabase {
return Ok(());
}
if sqlite_exists && config.database.backend != "sqlite" {
let (backend_is_rocksdb, backend_is_sqlite): (bool, bool) =
match config.database.backend {
#[cfg(feature = "rocksdb")]
DatabaseBackend::Rocksdb => (true, false),
#[cfg(feature = "sqlite")]
DatabaseBackend::Sqlite => (false, true),
};
if sqlite_exists && !backend_is_sqlite {
return Err(Error::bad_config(
"Found sqlite at database_path, but is not specified in \
config.",
));
}
if rocksdb_exists && config.database.backend != "rocksdb" {
if rocksdb_exists && !backend_is_rocksdb {
return Err(Error::bad_config(
"Found rocksdb at database_path, but is not specified in \
config.",
@ -319,21 +327,18 @@ impl KeyValueDatabase {
not(any(feature = "rocksdb", feature = "sqlite")),
allow(unused_variables)
)]
let builder: Arc<dyn KeyValueDatabaseEngine> = match &*config
let builder: Arc<dyn KeyValueDatabaseEngine> = match config
.database
.backend
{
#[cfg(feature = "sqlite")]
"sqlite" => {
DatabaseBackend::Sqlite => {
Arc::new(Arc::<abstraction::sqlite::Engine>::open(&config)?)
}
#[cfg(feature = "rocksdb")]
"rocksdb" => {
DatabaseBackend::Rocksdb => {
Arc::new(Arc::<abstraction::rocksdb::Engine>::open(&config)?)
}
_ => {
return Err(Error::BadConfig("Database backend not found."));
}
};
if config.registration_token == Some(String::new()) {

View file

@ -1,3 +1,7 @@
// Avoid spurious warnings with --no-default-features, which isn't expected to
// work anyway
#![cfg_attr(not(any(feature = "sqlite", feature = "rocksdb")), allow(unused))]
use std::{
future::Future,
net::SocketAddr,