From 5f1d65f1f222f0f6ac991707fd7279b6aab39495 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 17 Dec 2024 11:16:00 -0600 Subject: [PATCH] refactor encryption provider db --- .../librepertory/include/db/i_file_db.hpp | 9 ++ .../include/db/impl/sqlite_file_db.hpp | 3 + .../src/db/impl/sqlite_file_db.cpp | 23 +++- .../providers/encrypt/encrypt_provider.cpp | 119 ++++-------------- 4 files changed, 56 insertions(+), 98 deletions(-) diff --git a/repertory/librepertory/include/db/i_file_db.hpp b/repertory/librepertory/include/db/i_file_db.hpp index 48825fd6..66007b13 100644 --- a/repertory/librepertory/include/db/i_file_db.hpp +++ b/repertory/librepertory/include/db/i_file_db.hpp @@ -29,6 +29,12 @@ class i_file_db { INTERFACE_SETUP(i_file_db); public: + struct file_info final { + std::string api_path; + bool directory; + std::string source_path; + }; + struct file_data final { std::string api_path; std::uint64_t file_size{}; @@ -74,6 +80,9 @@ public: get_file_source_path(const std::string &api_path, std::string &source_path) const -> api_error = 0; + [[nodiscard]] virtual auto get_item_list() const + -> std::vector = 0; + [[nodiscard]] virtual auto get_source_path(const std::string &api_path, std::string &source_path) const -> api_error = 0; diff --git a/repertory/librepertory/include/db/impl/sqlite_file_db.hpp b/repertory/librepertory/include/db/impl/sqlite_file_db.hpp index 147cfee7..dacb95d8 100644 --- a/repertory/librepertory/include/db/impl/sqlite_file_db.hpp +++ b/repertory/librepertory/include/db/impl/sqlite_file_db.hpp @@ -77,6 +77,9 @@ public: std::string &source_path) const -> api_error override; + [[nodiscard]] auto get_item_list() const + -> std::vector override; + [[nodiscard]] auto get_source_path(const std::string &api_path, std::string &source_path) const -> api_error override; diff --git a/repertory/librepertory/src/db/impl/sqlite_file_db.cpp b/repertory/librepertory/src/db/impl/sqlite_file_db.cpp index 8187eb37..9f69baa6 100644 --- a/repertory/librepertory/src/db/impl/sqlite_file_db.cpp +++ b/repertory/librepertory/src/db/impl/sqlite_file_db.cpp @@ -52,7 +52,7 @@ const std::map sql_create_tables = { namespace repertory { sqlite_file_db::sqlite_file_db(const app_config &cfg) { db_ = utils::db::sqlite::create_db( - utils::path::combine(cfg.get_data_directory(), {"file.db"}), + utils::path::combine(cfg.get_data_directory(), {"provider_file.db"}), sql_create_tables); } @@ -275,6 +275,27 @@ auto sqlite_file_db::get_file_source_path(const std::string &api_path, return api_error::item_not_found; } +auto sqlite_file_db::get_item_list() const + -> std::vector { + std::vector ret; + + auto result = utils::db::sqlite::db_select{*db_, file_table}.go(); + while (result.has_value()) { + std::optional row; + if (result.get_row(row) && row.has_value()) { + ret.emplace_back(i_file_db::file_info{ + row->get_column("api_path").get_value(), + row->get_column("directory").get_value() == 1, + row->get_column("source_path").get_value(), + }); + } + + result.next_row(); + } + + return ret; +} + auto sqlite_file_db::get_source_path(const std::string &api_path, std::string &source_path) const -> api_error { diff --git a/repertory/librepertory/src/providers/encrypt/encrypt_provider.cpp b/repertory/librepertory/src/providers/encrypt/encrypt_provider.cpp index f5c80715..7d131409 100644 --- a/repertory/librepertory/src/providers/encrypt/encrypt_provider.cpp +++ b/repertory/librepertory/src/providers/encrypt/encrypt_provider.cpp @@ -27,10 +27,6 @@ #include "types/repertory.hpp" #include "types/startup_exception.hpp" #include "utils/collection.hpp" -#include "utils/db/sqlite/db_common.hpp" -#include "utils/db/sqlite/db_delete.hpp" -#include "utils/db/sqlite/db_insert.hpp" -#include "utils/db/sqlite/db_select.hpp" #include "utils/encrypting_reader.hpp" #include "utils/encryption.hpp" #include "utils/file_utils.hpp" @@ -794,47 +790,15 @@ auto encrypt_provider::read_file_bytes(const std::string &api_path, } void encrypt_provider::remove_deleted_files(const stop_type &stop_requested) { - struct removed_item { - std::string api_path; - bool directory{}; - std::string source_path; - }; + std::vector removed_list{}; - std::vector removed_list{}; - std::vector row_list{}; - - auto result = utils::db::sqlite::db_select{*db_, file_table}.go(); - while (result.has_row()) { + for (const auto &item : db_->get_item_list()) { if (stop_requested) { return; } - std::optional row; - if (result.get_row(row) && row.has_value()) { - row_list.push_back(row.value()); - } - } - - for (const auto &row : row_list) { - if (stop_requested) { - return; - } - - auto source_path = row.get_column("source_path").get_value(); - if (not utils::path::exists(source_path)) { - auto api_path = row.get_column("api_path").get_value(); - result = utils::db::sqlite::db_select{*db_, file_table} - .column("source_path") - .where("source_path") - .equals(source_path) - .op() - .limit(1) - .go(); - removed_list.emplace_back(removed_item{ - api_path, - row.get_column("directory").get_value() == 1, - source_path, - }); + if (not utils::path::exists(item.source_path)) { + removed_list.emplace_back(item); } } @@ -843,46 +807,17 @@ void encrypt_provider::remove_deleted_files(const stop_type &stop_requested) { return; } + // TODO handle error + auto del_res = db_->remove_item(item); if (item.directory) { + event_system::instance().raise( + item.api_path, item.source_path); continue; } - // TODO handle error - auto del_res = utils::db::sqlite::db_delete{*db_, file_table} - .where("source_path") - .equals(item.source_path) - .and_() - .where("directory") - .equals(0) - .op() - .limit(1) - .go(); event_system::instance().raise(item.api_path, item.source_path); } - - for (const auto &item : removed_list) { - if (stop_requested) { - return; - } - - if (not item.directory) { - continue; - } - - // TODO handle error - auto del_res = utils::db::sqlite::db_delete{*db_, file_table} - .where("source_path") - .equals(item.source_path) - .and_() - .where("directory") - .equals(1) - .op() - .limit(1) - .go(); - event_system::instance().raise( - item.api_path, item.source_path); - } } auto encrypt_provider::start(api_item_added_callback /*api_item_added*/, @@ -898,20 +833,16 @@ auto encrypt_provider::start(api_item_added_callback /*api_item_added*/, auto cfg = config_.get_encrypt_config(); auto cfg_path = utils::path::absolute(cfg.path); - auto result = utils::db::sqlite::db_select{*db_, file_table} - .column("source_path") - .where("source_path") - .equals(cfg_path) - .and_() - .where("directory") - .equals(1) - .op() - .limit(1) - .go(); - std::optional row; - if (result.get_row(row) && row.has_value()) { - auto cur_path = utils::path::absolute( - row->get_column("source_path").get_value()); + std::string source_path; + auto result = db_->get_directory_source_path("/", source_path); + if (result != api_error::success && + result != api_error::directory_not_found) { + throw startup_exception( + fmt::format("failed to get root|{}", api_error_to_string(result))); + } + + if (result == api_error::success) { + auto cur_path = utils::path::absolute(source_path); #if defined(_WIN32) if (utils::string::to_lower(cur_path) != utils::string::to_lower(cfg_path)) { @@ -922,16 +853,10 @@ auto encrypt_provider::start(api_item_added_callback /*api_item_added*/, "source path has changed|cur|{}|cfg|{}", cur_path, cfg.path)); } } else { - auto ins_res = utils::db::sqlite::db_insert{*db_, file_table} - .column_value("api_path", "/") - .column_value("data", "") - .column_value("directory", 1) - .column_value("source_path", cfg_path) - .go(); - if (not ins_res.ok()) { - throw startup_exception(fmt::format("failed to create root|{}|{}", - ins_res.get_error(), - ins_res.get_error_str())); + result = db_->add_directory("/", utils::path::absolute(source_path)); + if (result != api_error::success) { + throw startup_exception( + fmt::format("failed to create root|{}", api_error_to_string(result))); } }