allow specifying db uri in config file (#2956)

* allow specifying db uri in config file

* succumb to a bug in doku

See <https://github.com/anixe/doku/issues/33>.
This commit is contained in:
Charles Hall 2023-06-09 05:18:22 -07:00 committed by GitHub
parent 8cb5939f50
commit 14c18dbdae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 90 additions and 23 deletions

View file

@ -1,16 +1,39 @@
{ {
# settings related to the postgresql database # settings related to the postgresql database
database: { database: {
# Username to connect to postgres
user: "lemmy" # Configure the database by specifying a URI
# Password to connect to postgres #
password: "password" # This is the preferred method to specify database connection details since
# Host where postgres is running # it is the most flexible.
host: "localhost" # Connection URI pointing to a postgres instance
# Port where postgres can be accessed #
port: 5432 # This example uses peer authentication to obviate the need for creating,
# Name of the postgres database for lemmy # configuring, and managing passwords.
database: "lemmy" #
# For an explanation of how to use connection URIs, see [here][0] in
# PostgreSQL's documentation.
#
# [0]: https://www.postgresql.org/docs/current/libpq-connect.html#id-1.7.3.8.3.6
uri: "postgresql:///lemmy?user=lemmy&host=/var/run/postgresql"
// or
# Configure the database by specifying parts of a URI
#
# Note that specifying the `uri` field should be preferred since it provides
# greater control over how the connection is made. This merely exists for
# backwards-compatibility.
{
# Username to connect to postgres
user: "string"
# Password to connect to postgres
password: "string"
# Host where postgres is running
host: "string"
# Port where postgres can be accessed
port: 123
# Name of the postgres database for lemmy
database: "string"
}
# Maximum number of active sql connections # Maximum number of active sql connections
pool_size: 5 pool_size: 5
} }

View file

@ -12,6 +12,8 @@ use std::{env, fs, io::Error};
pub mod structs; pub mod structs;
use structs::DatabaseConnection;
static DEFAULT_CONFIG_FILE: &str = "config/config.hjson"; static DEFAULT_CONFIG_FILE: &str = "config/config.hjson";
pub static SETTINGS: Lazy<Settings> = Lazy::new(|| { pub static SETTINGS: Lazy<Settings> = Lazy::new(|| {
@ -43,15 +45,19 @@ impl Settings {
} }
pub fn get_database_url(&self) -> String { pub fn get_database_url(&self) -> String {
let conf = &self.database; match &self.database.connection {
format!( DatabaseConnection::Uri { uri } => uri.clone(),
"postgres://{}:{}@{}:{}/{}", DatabaseConnection::Parts(parts) => {
utf8_percent_encode(&conf.user, NON_ALPHANUMERIC), format!(
utf8_percent_encode(&conf.password, NON_ALPHANUMERIC), "postgres://{}:{}@{}:{}/{}",
conf.host, utf8_percent_encode(&parts.user, NON_ALPHANUMERIC),
conf.port, utf8_percent_encode(&parts.password, NON_ALPHANUMERIC),
utf8_percent_encode(&conf.database, NON_ALPHANUMERIC), parts.host,
) parts.port,
utf8_percent_encode(&parts.database, NON_ALPHANUMERIC),
)
}
}
} }
fn get_config_location() -> String { fn get_config_location() -> String {

View file

@ -55,8 +55,49 @@ pub struct PictrsConfig {
} }
#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)] #[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
#[serde(default, deny_unknown_fields)] #[serde(default)]
pub struct DatabaseConfig { pub struct DatabaseConfig {
#[serde(flatten, default)]
pub connection: DatabaseConnection,
/// Maximum number of active sql connections
#[default(5)]
pub pool_size: usize,
}
#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
#[serde(untagged)]
pub enum DatabaseConnection {
/// Configure the database by specifying a URI
///
/// This is the preferred method to specify database connection details since
/// it is the most flexible.
Uri {
/// Connection URI pointing to a postgres instance
///
/// This example uses peer authentication to obviate the need for creating,
/// configuring, and managing passwords.
///
/// For an explanation of how to use connection URIs, see [here][0] in
/// PostgreSQL's documentation.
///
/// [0]: https://www.postgresql.org/docs/current/libpq-connect.html#id-1.7.3.8.3.6
#[doku(example = "postgresql:///lemmy?user=lemmy&host=/var/run/postgresql")]
uri: String,
},
/// Configure the database by specifying parts of a URI
///
/// Note that specifying the `uri` field should be preferred since it provides
/// greater control over how the connection is made. This merely exists for
/// backwards-compatibility.
#[default]
Parts(DatabaseConnectionParts),
}
#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
#[serde(default)]
pub struct DatabaseConnectionParts {
/// Username to connect to postgres /// Username to connect to postgres
#[default("lemmy")] #[default("lemmy")]
pub(super) user: String, pub(super) user: String,
@ -72,9 +113,6 @@ pub struct DatabaseConfig {
/// Name of the postgres database for lemmy /// Name of the postgres database for lemmy
#[default("lemmy")] #[default("lemmy")]
pub(super) database: String, pub(super) database: String,
/// Maximum number of active sql connections
#[default(5)]
pub pool_size: usize,
} }
#[derive(Debug, Deserialize, Serialize, Clone, Document, SmartDefault)] #[derive(Debug, Deserialize, Serialize, Clone, Document, SmartDefault)]