diff --git a/src/config.rs b/src/config.rs index 9589078f..43dd487f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -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, diff --git a/src/database.rs b/src/database.rs index 8f6836db..0e495475 100644 --- a/src/database.rs +++ b/src/database.rs @@ -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 = match &*config + let builder: Arc = match config .database .backend { #[cfg(feature = "sqlite")] - "sqlite" => { + DatabaseBackend::Sqlite => { Arc::new(Arc::::open(&config)?) } #[cfg(feature = "rocksdb")] - "rocksdb" => { + DatabaseBackend::Rocksdb => { Arc::new(Arc::::open(&config)?) } - _ => { - return Err(Error::BadConfig("Database backend not found.")); - } }; if config.registration_token == Some(String::new()) { diff --git a/src/main.rs b/src/main.rs index 657a7a36..7d7f2448 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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,