From 3e280faa674a1d6231edf2bf37a810cc6ca0add3 Mon Sep 17 00:00:00 2001 From: Adrian Heine Date: Sat, 17 Oct 2020 23:32:53 +0200 Subject: [PATCH] Add postgresql database --- src/builder.rs | 24 ++++++++++++++++++++++++ src/locator.rs | 20 ++++++++++++++++++++ src/resources/mod.rs | 7 +++++++ 3 files changed, 51 insertions(+) diff --git a/src/builder.rs b/src/builder.rs index 48ebca6..5e68038 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -5,7 +5,9 @@ use crate::resources::{ LoadedDirectory, MariaDbDatabase, MariaDbUser, NpmInstall, Owner, PhpFpmPool, Resource, ServeCustom, ServePhp, ServeRedir, ServeService, ServeStatic, StoredDirectory, SystemdSocketService, User, UserForDomain, WordpressPlugin, WordpressTranslation, + PostgresqlDatabase, }; +use crate::storage::Storage; use crate::static_files::LETS_ENCRYPT_X3_CROSS_SIGNED; use crate::storage::SimpleStorage; use crate::symbols::acme::Cert as CertSymbol; @@ -19,6 +21,7 @@ use crate::symbols::mariadb::{ }; use crate::symbols::npm::Install as NpmInstallSymbol; use crate::symbols::owner::Owner as OwnerSymbol; +use crate::symbols::postgresql::PostgreSQLDatabase as PostgreSQLDatabaseSymbol; use crate::symbols::saved_directory::{SavedDirectory as SavedDirectorySymbol, StorageDirection}; use crate::symbols::systemd::{ ReloadService as ReloadServiceSymbol, UserService as UserServiceSymbol, @@ -715,6 +718,27 @@ impl ImplementationBuilder> for DefaultBuilder { } } +impl ImplementationBuilder> for DefaultBuilder { + type Prerequisites = (); + fn prerequisites(resource: &PostgresqlDatabase) -> Self::Prerequisites { + () + } + + type Implementation = ( + PostgreSQLDatabaseSymbol<'static, String, String, StdCommandRunner>, + ); + fn create( + _resource: &PostgresqlDatabase, + (db_name, data_path): & as Resource>::Artifact, + _: ::Artifact, + ) -> Self::Implementation { + let db_dump = SimpleStorage::new(data_path.clone().into()); + ( + PostgreSQLDatabaseSymbol::new(db_name.0.clone(), db_dump.read_filename().unwrap().to_str().unwrap().into(), &StdCommandRunner), + ) + } +} + impl> ImplementationBuilder> for DefaultBuilder { type Prerequisites = Dir; fn prerequisites(resource: &WordpressPlugin

) -> Self::Prerequisites { diff --git a/src/locator.rs b/src/locator.rs index d1f5251..5fab5e9 100644 --- a/src/locator.rs +++ b/src/locator.rs @@ -8,6 +8,7 @@ use crate::resources::{ LoadedDirectory, MariaDbDatabase, MariaDbUser, NpmInstall, Owner, PhpFpmPool, Resource, ServeCustom, ServePhp, ServeRedir, ServeService, ServeStatic, StoredDirectory, SystemdSocketService, User, UserForDomain, WordpressPlugin, WordpressTranslation, + PostgresqlDatabase, }; use crate::to_artifact::ToArtifact; use std::fmt::Display; @@ -422,6 +423,25 @@ impl, P: Policy> ResourceLocator> for DefaultLocato } } +impl, P: Policy> ResourceLocator> for DefaultLocator

{ + type Prerequisites = (); + fn locate( + resource: &PostgresqlDatabase, + ) -> ( + as Resource>::Artifact, + Self::Prerequisites, + ) { + let ((user_name, _), ()) = Self::locate(&UserForDomain(&resource.0)); + ( + ( + DatabaseNameArtifact(user_name.0.clone()), + PathArtifact::from(P::path_for_data(format!("{}.sql", user_name.0))), + ), + (), + ) + } +} + impl ResourceLocator> for DefaultLocator { type Prerequisites = (); fn locate( diff --git a/src/resources/mod.rs b/src/resources/mod.rs index a590c47..75f6d3e 100644 --- a/src/resources/mod.rs +++ b/src/resources/mod.rs @@ -200,6 +200,12 @@ impl Resource for MariaDbUser { type Artifact = UserNameArtifact; } +#[derive(Debug, Hash, PartialEq, Eq)] +pub struct PostgresqlDatabase(pub D); +impl Resource for PostgresqlDatabase { + type Artifact = (DatabaseNameArtifact, PathArtifact); +} + #[derive(Debug, Hash, PartialEq, Eq)] pub struct WordpressPlugin

(pub P, pub &'static str); impl

Resource for WordpressPlugin

{ @@ -288,6 +294,7 @@ default_resources!( LoadedDirectory: LoadedDirectory, MariaDbDatabase: MariaDbDatabase, MariaDbUser: MariaDbUser, + PostgresqlDatabase: PostgresqlDatabase, SystemdSocketService: SystemdSocketService, NpmInstall: NpmInstall, Owner: Owner,