#include "data/cassandra/SettingsProvider.hpp" #include "data/cassandra/Types.hpp" #include "data/cassandra/impl/Cluster.hpp" #include "util/Constants.hpp" #include "util/config/ObjectView.hpp" #include #include #include #include #include #include #include #include #include #include #include #include namespace data::cassandra { SettingsProvider::SettingsProvider(util::config::ObjectView const& cfg) : config_{cfg} , keyspace_{cfg.get("keyspace")} , tablePrefix_{cfg.maybeValue("table_prefix")} , replicationFactor_{cfg.get("replication_factor")} , settings_{parseSettings()} { } Settings SettingsProvider::getSettings() const { return settings_; } std::optional SettingsProvider::parseOptionalCertificate() const { if (auto const certPath = config_.getValueView("certfile"); certPath.hasValue()) { auto const path = std::filesystem::path(certPath.asString()); std::ifstream fileStream(path.string(), std::ios::in); if (!fileStream) { throw std::system_error( errno, std::generic_category(), "Opening certificate " + path.string() ); } std::string contents( std::istreambuf_iterator{fileStream}, std::istreambuf_iterator{} ); if (fileStream.bad()) { throw std::system_error( errno, std::generic_category(), "Reading certificate " + path.string() ); } return contents; } return std::nullopt; } Settings SettingsProvider::parseSettings() const { auto settings = Settings::defaultSettings(); // all config values used in settings is under "database.cassandra" prefix if (config_.getValueView("secure_connect_bundle").hasValue()) { auto const bundle = Settings::SecureConnectionBundle{(config_.get("secure_connect_bundle"))}; settings.connectionInfo = bundle; } else { Settings::ContactPoints out; out.contactPoints = config_.get("contact_points"); out.port = config_.maybeValue("port"); settings.connectionInfo = out; } settings.threads = config_.get("threads"); settings.maxWriteRequestsOutstanding = config_.get("max_write_requests_outstanding"); settings.maxReadRequestsOutstanding = config_.get("max_read_requests_outstanding"); settings.coreConnectionsPerHost = config_.get("core_connections_per_host"); settings.queueSizeIO = config_.maybeValue("queue_size_io"); settings.writeBatchSize = config_.get("write_batch_size"); settings.provider = impl::providerFromString(config_.get("provider")); if (config_.getValueView("connect_timeout").hasValue()) { auto const connectTimeoutSecond = config_.get("connect_timeout"); settings.connectionTimeout = std::chrono::milliseconds{connectTimeoutSecond * util::kMillisecondsPerSecond}; } if (config_.getValueView("request_timeout").hasValue()) { auto const requestTimeoutSecond = config_.get("request_timeout"); settings.requestTimeout = std::chrono::milliseconds{requestTimeoutSecond * util::kMillisecondsPerSecond}; } settings.certificate = parseOptionalCertificate(); settings.username = config_.maybeValue("username"); settings.password = config_.maybeValue("password"); return settings; } } // namespace data::cassandra