Skip to content

Commit

Permalink
allow specifying db uri in config file
Browse files Browse the repository at this point in the history
  • Loading branch information
CobaltCause committed Jun 8, 2023
1 parent 15c84e2 commit 0ccafbd
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 35 deletions.
41 changes: 31 additions & 10 deletions config/defaults.hjson
Original file line number Diff line number Diff line change
@@ -1,16 +1,37 @@
{
# settings related to the postgresql database
database: {
# Username to connect to postgres
user: "lemmy"
# Password to connect to postgres
password: "password"
# Host where postgres is running
host: "localhost"
# Port where postgres can be accessed
port: 5432
# Name of the postgres database for lemmy
database: "lemmy"

# Configure the database by specifying a URI
#
# This is the preferred method to specify database connection details since
# it is the most flexible.
# 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
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
pool_size: 5
}
Expand Down
30 changes: 21 additions & 9 deletions crates/utils/src/settings/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ use std::{env, fs, io::Error};

pub mod structs;

use structs::DatabaseConnection;

static DEFAULT_CONFIG_FILE: &str = "config/config.hjson";

pub static SETTINGS: Lazy<Settings> = Lazy::new(|| {
Expand Down Expand Up @@ -43,15 +45,25 @@ impl Settings {
}

pub fn get_database_url(&self) -> String {
let conf = &self.database;
format!(
"postgres://{}:{}@{}:{}/{}",
utf8_percent_encode(&conf.user, NON_ALPHANUMERIC),
utf8_percent_encode(&conf.password, NON_ALPHANUMERIC),
conf.host,
conf.port,
utf8_percent_encode(&conf.database, NON_ALPHANUMERIC),
)
match &self.database.connection {
DatabaseConnection::Uri { uri } => uri.clone(),
DatabaseConnection::Parts {
user,
password,
host,
port,
database,
} => {
format!(
"postgres://{}:{}@{}:{}/{}",
utf8_percent_encode(user, NON_ALPHANUMERIC),
utf8_percent_encode(password, NON_ALPHANUMERIC),
host,
port,
utf8_percent_encode(database, NON_ALPHANUMERIC),
)
}
}
}

fn get_config_location() -> String {
Expand Down
66 changes: 50 additions & 16 deletions crates/utils/src/settings/structs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,28 +55,62 @@ pub struct PictrsConfig {
}

#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
#[serde(default, deny_unknown_fields)]
#[serde(default)]
pub struct DatabaseConfig {
/// Username to connect to postgres
#[default("lemmy")]
pub(super) user: String,
/// Password to connect to postgres
#[default("password")]
pub password: String,
#[default("localhost")]
/// Host where postgres is running
pub host: String,
/// Port where postgres can be accessed
#[default(5432)]
pub(super) port: i32,
/// Name of the postgres database for lemmy
#[default("lemmy")]
pub(super) database: String,
#[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 {
/// Username to connect to postgres
#[default("lemmy")]
user: String,
/// Password to connect to postgres
#[default("password")]
password: String,
#[default("localhost")]
/// Host where postgres is running
host: String,
/// Port where postgres can be accessed
#[default(5432)]
port: i32,
/// Name of the postgres database for lemmy
#[default("lemmy")]
database: String,
},
}

#[derive(Debug, Deserialize, Serialize, Clone, Document, SmartDefault)]
#[serde(deny_unknown_fields)]
pub struct EmailConfig {
Expand Down

0 comments on commit 0ccafbd

Please sign in to comment.