From 0d979459a49dcb1b00fe65a82cf7622a77966560 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 10 Dec 2024 12:39:35 -0600 Subject: [PATCH] make database type configurable --- repertory/librepertory/include/app_config.hpp | 49 ++++++++++++------- repertory/librepertory/src/app_config.cpp | 35 +++++++++++++ repertory/librepertory/src/db/file_mgr_db.cpp | 8 ++- repertory/librepertory/src/db/meta_db.cpp | 8 ++- repertory/repertory_test/src/config_test.cpp | 16 ++++++ 5 files changed, 97 insertions(+), 19 deletions(-) diff --git a/repertory/librepertory/include/app_config.hpp b/repertory/librepertory/include/app_config.hpp index d6c09016..48dd8a87 100644 --- a/repertory/librepertory/include/app_config.hpp +++ b/repertory/librepertory/include/app_config.hpp @@ -30,26 +30,26 @@ namespace repertory { class app_config final { public: - [[nodiscard]] static auto - default_agent_name(const provider_type &prov) -> std::string; + [[nodiscard]] static auto default_agent_name(const provider_type &prov) + -> std::string; - [[nodiscard]] static auto - default_api_port(const provider_type &prov) -> std::uint16_t; + [[nodiscard]] static auto default_api_port(const provider_type &prov) + -> std::uint16_t; - [[nodiscard]] static auto - default_data_directory(const provider_type &prov) -> std::string; + [[nodiscard]] static auto default_data_directory(const provider_type &prov) + -> std::string; - [[nodiscard]] static auto - default_remote_port(const provider_type &prov) -> std::uint16_t; + [[nodiscard]] static auto default_remote_port(const provider_type &prov) + -> std::uint16_t; - [[nodiscard]] static auto - default_rpc_port(const provider_type &prov) -> std::uint16_t; + [[nodiscard]] static auto default_rpc_port(const provider_type &prov) + -> std::uint16_t; - [[nodiscard]] static auto - get_provider_display_name(const provider_type &prov) -> std::string; + [[nodiscard]] static auto get_provider_display_name(const provider_type &prov) + -> std::string; - [[nodiscard]] static auto - get_provider_name(const provider_type &prov) -> std::string; + [[nodiscard]] static auto get_provider_name(const provider_type &prov) + -> std::string; public: app_config(const provider_type &prov, std::string_view data_directory = ""); @@ -63,6 +63,7 @@ private: std::string api_user_; bool config_changed_; std::string data_directory_; + database_type db_type_{database_type::rocksdb}; std::uint8_t download_timeout_secs_; bool enable_chunk_downloader_timeout_; bool enable_comm_duration_events_; @@ -109,11 +110,15 @@ private: mutable std::recursive_mutex remote_mount_mutex_; private: - [[nodiscard]] auto load() -> bool; + [[nodiscard]] auto get_database_value(const json &json_document, + const std::string &name, + database_type &dst, bool &success_flag) + -> bool; template - auto get_value(const json &json_document, const std::string &name, dest &dst, - bool &success_flag) -> bool { + [[nodiscard]] auto get_value(const json &json_document, + const std::string &name, dest &dst, + bool &success_flag) -> bool { REPERTORY_USES_FUNCTION_NAME(); auto ret{false}; @@ -133,6 +138,8 @@ private: return ret; } + [[nodiscard]] auto load() -> bool; + template auto set_value(dest &dst, const source &src) -> bool { auto ret{false}; @@ -164,6 +171,10 @@ public: [[nodiscard]] auto get_config_file_path() const -> std::string; + [[nodiscard]] auto get_database_type() const -> database_type { + return db_type_; + } + [[nodiscard]] auto get_data_directory() const -> std::string { return data_directory_; } @@ -332,6 +343,10 @@ public: set_value(download_timeout_secs_, chunk_downloader_timeout_secs); } + void set_database_type(const database_type &type) { + set_value(db_type_, type); + } + void set_enable_chunk_downloader_timeout(bool enable_chunk_downloader_timeout) { set_value(enable_chunk_downloader_timeout_, diff --git a/repertory/librepertory/src/app_config.cpp b/repertory/librepertory/src/app_config.cpp index 9034ba5d..44c262f0 100644 --- a/repertory/librepertory/src/app_config.cpp +++ b/repertory/librepertory/src/app_config.cpp @@ -127,6 +127,29 @@ auto app_config::get_config_file_path() const -> std::string { return utils::path::combine(data_directory_, {"config.json"}); } +auto app_config::get_database_value(const json &json_document, + const std::string &name, database_type &dst, + bool &success_flag) -> bool { + REPERTORY_USES_FUNCTION_NAME(); + + auto ret{false}; + try { + if (json_document.find(name) != json_document.end()) { + dst = database_type_from_string(json_document[name].get(), + database_type::rocksdb); + ret = true; + } else { + success_flag = false; + } + } catch (const json::exception &ex) { + utils::error::raise_error(function_name, ex, "exception occurred"); + success_flag = false; + ret = false; + } + + return ret; +} + auto app_config::default_agent_name(const provider_type &prov) -> std::string { static const std::array(provider_type::unknown)> @@ -212,6 +235,7 @@ auto app_config::get_json() const -> json { {"ApiPort", api_port_}, {"ApiUser", api_user_}, {"ChunkDownloaderTimeoutSeconds", download_timeout_secs_}, + {"DatabaseType", database_type_to_string(db_type_)}, {"EnableChunkDownloaderTimeout", enable_chunk_downloader_timeout_}, {"EnableCommDurationEvents", enable_comm_duration_events_}, {"EnableDriveEvents", enable_drive_events_}, @@ -281,6 +305,7 @@ auto app_config::get_json() const -> json { if (prov_ == provider_type::encrypt) { ret.erase("ChunkDownloaderTimeoutSeconds"); + ret.erase("DatabaseType"); ret.erase("EnableChunkDownloaderTimeout"); ret.erase("EnableMaxCacheSize"); ret.erase("EvictionDelayMinutes"); @@ -305,6 +330,7 @@ auto app_config::get_json() const -> json { ret.erase("S3Config"); } else if (prov_ == provider_type::remote) { ret.erase("ChunkDownloaderTimeoutSeconds"); + ret.erase("DatabaseType"); ret.erase("EnableChunkDownloaderTimeout"); ret.erase("EnableChunkDownloaderTimeout"); ret.erase("EnableMaxCacheSize"); @@ -376,6 +402,9 @@ auto app_config::get_value_by_name(const std::string &name) -> std::string { if (name == "ApiUser") { return api_user_; } + if (name == "DatabaseType") { + return database_type_to_string(get_database_type()); + } if (name == "ChunkDownloaderTimeoutSeconds") { return std::to_string(get_chunk_downloader_timeout_secs()); } @@ -550,6 +579,7 @@ auto app_config::load() -> bool { get_value(json_document, "ApiUser", api_user_, ret); get_value(json_document, "ChunkDownloaderTimeoutSeconds", download_timeout_secs_, ret); + get_database_value(json_document, "DatabaseType", db_type_, ret); get_value(json_document, "EvictionDelayMinutes", eviction_delay_mins_, ret); get_value(json_document, "EvictionUsesAccessedTime", @@ -762,6 +792,11 @@ auto app_config::set_value_by_name(const std::string &name, set_chunk_downloader_timeout_secs(utils::string::to_uint8(value)); return std::to_string(get_chunk_downloader_timeout_secs()); } + if (name == "DatabaseType") { + set_database_type( + database_type_from_string(value, database_type::rocksdb)); + return database_type_to_string(db_type_); + } if (name == "EnableChunkDownloaderTimeout") { set_enable_chunk_downloader_timeout(utils::string::to_bool(value)); return utils::string::from_bool(get_enable_chunk_download_timeout()); diff --git a/repertory/librepertory/src/db/file_mgr_db.cpp b/repertory/librepertory/src/db/file_mgr_db.cpp index 65a23e9b..dfdf3c73 100644 --- a/repertory/librepertory/src/db/file_mgr_db.cpp +++ b/repertory/librepertory/src/db/file_mgr_db.cpp @@ -29,6 +29,12 @@ namespace repertory { auto create_file_mgr_db(const app_config &cfg) -> std::unique_ptr { - return std::make_unique(cfg); + switch (cfg.get_database_type()) { + case database_type::sqlite: + return std::make_unique(cfg); + + default: + return std::make_unique(cfg); + } } } // namespace repertory diff --git a/repertory/librepertory/src/db/meta_db.cpp b/repertory/librepertory/src/db/meta_db.cpp index 9f5898bb..8db99bac 100644 --- a/repertory/librepertory/src/db/meta_db.cpp +++ b/repertory/librepertory/src/db/meta_db.cpp @@ -27,6 +27,12 @@ namespace repertory { auto create_meta_db(const app_config &cfg) -> std::unique_ptr { - return std::make_unique(cfg); + switch (cfg.get_database_type()) { + case database_type::sqlite: + return std::make_unique(cfg); + + default: + return std::make_unique(cfg); + } } } // namespace repertory diff --git a/repertory/repertory_test/src/config_test.cpp b/repertory/repertory_test/src/config_test.cpp index ba495367..0aae9bb1 100644 --- a/repertory/repertory_test/src/config_test.cpp +++ b/repertory/repertory_test/src/config_test.cpp @@ -60,6 +60,7 @@ const auto DEFAULT_SIA_CONFIG = "{\n" " \"ApiPort\": 10000,\n" " \"ApiUser\": \"repertory\",\n" " \"ChunkDownloaderTimeoutSeconds\": 30,\n" + " \"DatabaseType\": \"rocksdb\",\n" " \"EnableChunkDownloaderTimeout\": true,\n" " \"EnableCommDurationEvents\": false,\n" " \"EnableDriveEvents\": false,\n" @@ -113,6 +114,7 @@ const auto DEFAULT_S3_CONFIG = "{\n" " \"ApiPort\": 10100,\n" " \"ApiUser\": \"repertory\",\n" " \"ChunkDownloaderTimeoutSeconds\": 30,\n" + " \"DatabaseType\": \"rocksdb\",\n" " \"EnableChunkDownloaderTimeout\": true,\n" " \"EnableCommDurationEvents\": false,\n" " \"EnableDriveEvents\": false,\n" @@ -857,4 +859,18 @@ TEST_F(config_test, task_wait_ms_minimum_value) { EXPECT_EQ(50U, config.get_task_wait_ms()); } } + +TEST_F(config_test, can_set_database_type) { + { + app_config config(provider_type::sia, sia_directory); + config.set_database_type(database_type::rocksdb); + EXPECT_EQ(database_type::rocksdb, config.get_database_type()); + + config.set_database_type(database_type::sqlite); + EXPECT_EQ(database_type::sqlite, config.get_database_type()); + + config.set_database_type(database_type::rocksdb); + EXPECT_EQ(database_type::rocksdb, config.get_database_type()); + } +} } // namespace repertory