From d114c763c370e769ac03159d9370ad7c47845d6c Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 29 Jul 2019 13:00:58 +0200 Subject: [PATCH] Config is no longer a singleton as such --- src/main/main.cpp | 44 +++++++++---------- .../features/AcousticBrainzUtils.cpp | 3 +- .../features/SimilarityFeaturesCache.cpp | 5 ++- src/ui/admin/UserView.cpp | 2 +- src/utils/Config.cpp | 23 +++------- src/utils/Config.hpp | 10 ++--- 6 files changed, 38 insertions(+), 49 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index e2aa0298..338206fa 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -41,28 +41,28 @@ std::vector generateWtConfig(std::string execPath) { std::vector args; - const boost::filesystem::path wtConfigPath {Config::instance().getPath("working-dir") / "wt_config.xml"}; - const boost::filesystem::path wtLogFilePath {Config::instance().getPath("working-dir") / "lms.log"}; - const boost::filesystem::path wtAccessLogFilePath {Config::instance().getPath("working-dir") / "lms.access.log"}; + const boost::filesystem::path wtConfigPath {getService()->getPath("working-dir") / "wt_config.xml"}; + const boost::filesystem::path wtLogFilePath {getService()->getPath("working-dir") / "lms.log"}; + const boost::filesystem::path wtAccessLogFilePath {getService()->getPath("working-dir") / "lms.access.log"}; args.push_back(execPath); args.push_back("--config=" + wtConfigPath.string()); - args.push_back("--docroot=" + Config::instance().getString("docroot")); - args.push_back("--approot=" + Config::instance().getString("approot")); - args.push_back("--resources-dir=" + Config::instance().getString("wt-resources")); + args.push_back("--docroot=" + getService()->getString("docroot")); + args.push_back("--approot=" + getService()->getString("approot")); + args.push_back("--resources-dir=" + getService()->getString("wt-resources")); - if (Config::instance().getBool("tls-enable", false)) + if (getService()->getBool("tls-enable", false)) { - args.push_back("--https-port=" + std::to_string( Config::instance().getULong("listen-port", 5082))); - args.push_back("--https-address=" + Config::instance().getString("listen-addr", "0.0.0.0")); - args.push_back("--ssl-certificate=" + Config::instance().getString("tls-cert")); - args.push_back("--ssl-private-key=" + Config::instance().getString("tls-key")); - args.push_back("--ssl-tmp-dh=" + Config::instance().getString("tls-dh")); + args.push_back("--https-port=" + std::to_string( getService()->getULong("listen-port", 5082))); + args.push_back("--https-address=" + getService()->getString("listen-addr", "0.0.0.0")); + args.push_back("--ssl-certificate=" + getService()->getString("tls-cert")); + args.push_back("--ssl-private-key=" + getService()->getString("tls-key")); + args.push_back("--ssl-tmp-dh=" + getService()->getString("tls-dh")); } else { - args.push_back("--http-port=" + std::to_string( Config::instance().getULong("listen-port", 5082))); - args.push_back("--http-address=" + Config::instance().getString("listen-addr", "0.0.0.0")); + args.push_back("--http-port=" + std::to_string( getService()->getULong("listen-port", 5082))); + args.push_back("--http-address=" + getService()->getString("listen-addr", "0.0.0.0")); } args.push_back("--accesslog=" + wtAccessLogFilePath.string()); @@ -72,8 +72,8 @@ std::vector generateWtConfig(std::string execPath) pt.put("server.application-settings..location", "*"); pt.put("server.application-settings.log-file", wtLogFilePath.string()); - pt.put("server.application-settings.log-config", Config::instance().getString("log-config", "* -debug -info:WebRequest")); - pt.put("server.application-settings.behind-reverse-proxy", Config::instance().getBool("behind-reverse-proxy", false)); + pt.put("server.application-settings.log-config", getService()->getString("log-config", "* -debug -info:WebRequest")); + pt.put("server.application-settings.behind-reverse-proxy", getService()->getBool("behind-reverse-proxy", false)); pt.put("server.application-settings.progressive-bootstrap", true); std::ofstream oss(wtConfigPath.string().c_str(), std::ios::out); @@ -99,11 +99,11 @@ int main(int argc, char* argv[]) // Make pstream work with ffmpeg close(STDIN_FILENO); - Config::instance().setFile(configFilePath); + ServiceProvider::create(configFilePath); // Make sure the working directory exists - boost::filesystem::create_directories(Config::instance().getPath("working-dir")); - boost::filesystem::create_directories(Config::instance().getPath("working-dir") / "cache"); + boost::filesystem::create_directories(getService()->getPath("working-dir")); + boost::filesystem::create_directories(getService()->getPath("working-dir") / "cache"); // Construct WT configuration and get the argc/argv back std::vector wtServerArgs = generateWtConfig(argv[0]); @@ -124,12 +124,12 @@ int main(int argc, char* argv[]) Av::Transcoder::init(); // Initializing a connection pool to the database that will be shared along services - Database::Database database {Config::instance().getPath("working-dir") / "lms.db"}; + Database::Database database {getService()->getPath("working-dir") / "lms.db"}; UserInterface::LmsApplicationGroupContainer appGroups; // Service initialization order is important - ServiceProvider::create(Config::instance().getULong("login-throttler-max-entriees", 10000)); + ServiceProvider::create(getService()->getULong("login-throttler-max-entriees", 10000)); Scanner::MediaScanner& mediaScanner {ServiceProvider::create(database.createSession())}; Similarity::FeaturesScannerAddon similarityFeaturesScannerAddon {database.createSession()}; @@ -144,7 +144,7 @@ int main(int argc, char* argv[]) API::Subsonic::SubsonicResource subsonicResource {database}; // bind API resources - if (Config::instance().getBool("api-subsonic", true)) + if (getService()->getBool("api-subsonic", true)) { for (const std::string& path : API::Subsonic::SubsonicResource::getPaths()) server.addResource(&subsonicResource, path); diff --git a/src/similarity/features/AcousticBrainzUtils.cpp b/src/similarity/features/AcousticBrainzUtils.cpp index 7dfa5eae..9a302da7 100644 --- a/src/similarity/features/AcousticBrainzUtils.cpp +++ b/src/similarity/features/AcousticBrainzUtils.cpp @@ -23,6 +23,7 @@ #include #include +#include "main/Service.hpp" #include "utils/Config.hpp" #include "utils/Logger.hpp" @@ -46,7 +47,7 @@ getJsonData(const std::string& mbid) static const std::string defaultAPIURL = "https://acousticbrainz.org/api/v1/"; std::string data; - std::string url = Config::instance().getString("acousticbrainz-api-url", defaultAPIURL) + mbid + "/low-level"; + std::string url = getService()->getString("acousticbrainz-api-url", defaultAPIURL) + mbid + "/low-level"; CURL *curl; CURLcode res; diff --git a/src/similarity/features/SimilarityFeaturesCache.cpp b/src/similarity/features/SimilarityFeaturesCache.cpp index 3dc191ee..735783af 100644 --- a/src/similarity/features/SimilarityFeaturesCache.cpp +++ b/src/similarity/features/SimilarityFeaturesCache.cpp @@ -22,6 +22,7 @@ #include #include +#include "main/Service.hpp" #include "utils/Config.hpp" #include "utils/Logger.hpp" #include "utils/Utils.hpp" @@ -32,7 +33,7 @@ namespace Similarity { static boost::filesystem::path getCacheDirectory() { - return Config::instance().getPath("working-dir") / "cache" / "features"; + return getService()->getPath("working-dir") / "cache" / "features"; } static boost::filesystem::path getCacheNetworkFilePath() @@ -239,7 +240,7 @@ FeaturesCache::read() void FeaturesCache::write() { - boost::filesystem::create_directories(Config::instance().getPath("working-dir") / "cache" / "features"); + boost::filesystem::create_directories(getService()->getPath("working-dir") / "cache" / "features"); if (!networkToCacheFile(_network, getCacheNetworkFilePath()) || !objectPositionToCacheFile(_trackPositions, getCacheTrackPositionsFilePath())) diff --git a/src/ui/admin/UserView.cpp b/src/ui/admin/UserView.cpp index 5a159921..3ee13943 100644 --- a/src/ui/admin/UserView.cpp +++ b/src/ui/admin/UserView.cpp @@ -267,7 +267,7 @@ UserView::refreshView() // Demo account t->setFormWidget(UserModel::DemoField, std::make_unique()); - if (!userId && Config::instance().getBool("demo", false)) + if (!userId && getService()->getBool("demo", false)) t->setCondition("if-demo", true); Wt::WPushButton* saveBtn = t->bindNew("save-btn", Wt::WString::tr(userId ? "Lms.save" : "Lms.create")); diff --git a/src/utils/Config.cpp b/src/utils/Config.cpp index 73566636..8394b11d 100644 --- a/src/utils/Config.cpp +++ b/src/utils/Config.cpp @@ -24,25 +24,16 @@ #include "utils/Logger.hpp" -Config& -Config::instance() +Config::Config(const boost::filesystem::path& p) { - static Config instance; - return instance; -} - -void -Config::setFile(const boost::filesystem::path& p) -{ - _config = std::make_unique(); - _config->readFile(p.string().c_str()); + _config.readFile(p.string().c_str()); } std::string Config::getString(const std::string& setting, const std::string& def, const std::set& allowedValues) { try { - std::string res {(const char*)_config->lookup(setting)}; + std::string res {(const char*)_config.lookup(setting)}; if (!allowedValues.empty() && allowedValues.find(res) == allowedValues.end()) { @@ -62,7 +53,7 @@ boost::filesystem::path Config::getPath(const std::string& setting, const boost::filesystem::path& path) { try { - const char* res = _config->lookup(setting); + const char* res = _config.lookup(setting); return boost::filesystem::path(std::string(res)); } catch (std::exception &e) @@ -75,7 +66,7 @@ unsigned long Config::getULong(const std::string& setting, unsigned long def) { try { - return static_cast(_config->lookup(setting)); + return static_cast(_config.lookup(setting)); } catch (...) { @@ -87,7 +78,7 @@ long Config::getLong(const std::string& setting, long def) { try { - return _config->lookup(setting); + return _config.lookup(setting); } catch (...) { @@ -99,7 +90,7 @@ bool Config::getBool(const std::string& setting, bool def) { try { - return _config->lookup(setting); + return _config.lookup(setting); } catch (...) { diff --git a/src/utils/Config.hpp b/src/utils/Config.hpp index 13473e11..ebd9f70d 100644 --- a/src/utils/Config.hpp +++ b/src/utils/Config.hpp @@ -27,16 +27,14 @@ class Config final { public: + Config(const boost::filesystem::path& p); + ~Config() = default; Config(const Config&) = delete; Config& operator=(const Config&) = delete; Config(Config&&) = delete; Config& operator=(Config&&) = delete; - static Config& instance(); - - void setFile(const boost::filesystem::path& p); - // Default values are returned in case of setting not found std::string getString(const std::string& setting, const std::string& def = "", const std::set& allowedValues = {}); boost::filesystem::path getPath(const std::string& setting, const boost::filesystem::path& def = boost::filesystem::path()); @@ -46,8 +44,6 @@ class Config final private: - Config() = default; - - std::unique_ptr _config; + libconfig::Config _config; };