s3 provider fixes
Some checks failed
BlockStorage/repertory_osx_builds/pipeline/head This commit looks good
BlockStorage/repertory_linux_builds/pipeline/head There was a failure building this commit

This commit is contained in:
Scott E. Graves 2023-11-11 20:21:12 -06:00
parent 93011cee9c
commit 1e8ba13f66
7 changed files with 73 additions and 10 deletions

View File

@ -207,7 +207,7 @@ public:
}
[[nodiscard]] auto start(api_item_added_callback api_item_added,
i_file_manager *fm) -> bool override;
i_file_manager *mgr) -> bool override;
void stop() override;

View File

@ -143,7 +143,7 @@ public:
-> api_error = 0;
[[nodiscard]] virtual auto start(api_item_added_callback api_item_added,
i_file_manager *fm) -> bool = 0;
i_file_manager *mgr) -> bool = 0;
virtual void stop() = 0;

View File

@ -194,7 +194,7 @@ public:
-> api_error override;
[[nodiscard]] auto start(api_item_added_callback api_item_added,
i_file_manager *fm) -> bool override;
i_file_manager *mgr) -> bool override;
void stop() override;

View File

@ -185,7 +185,7 @@ public:
-> api_error override;
[[nodiscard]] auto start(api_item_added_callback api_item_added,
i_file_manager *fm) -> bool override;
i_file_manager *mgr) -> bool override;
void stop() override;

View File

@ -763,7 +763,7 @@ void encrypt_provider::remove_deleted_files() {
}
auto encrypt_provider::start(api_item_added_callback /*api_item_added*/,
i_file_manager * /*fm*/) -> bool {
i_file_manager * /*mgr*/) -> bool {
if (not is_online()) {
return false;
}

View File

@ -31,6 +31,7 @@
#include "types/s3.hpp"
#include "types/startup_exception.hpp"
#include "utils/encryption.hpp"
#include "utils/encrypting_reader.hpp"
#include "utils/error_utils.hpp"
#include "utils/file_utils.hpp"
#include "utils/path_utils.hpp"
@ -398,7 +399,60 @@ auto s3_provider::get_api_path_from_source(const std::string &source_path,
auto s3_provider::get_directory_item_count(const std::string &api_path) const
-> std::uint64_t {
// TODO implement this
try {
const auto cfg = config_.get_s3_config();
const auto is_encrypted = not cfg.encryption_token.empty();
std::string key;
if (is_encrypted) {
auto res = get_item_meta(api_path, META_KEY, key);
if (res != api_error::success) {
return 0U;
}
}
const auto object_name =
api_path == "/"
? ""
: utils::path::create_api_path(is_encrypted ? key : api_path);
std::string response_data{};
long response_code{};
auto prefix = object_name.empty() ? object_name : object_name + "/";
if (not get_object_list(comm_, config_.get_s3_config(), response_data,
response_code, "/", prefix)) {
return 0U;
}
if (response_code == http_error_codes::not_found) {
return 0U;
}
if (response_code != http_error_codes::ok) {
return 0U;
}
pugi::xml_document doc;
auto res = doc.load_string(response_data.c_str());
if (res.status != pugi::xml_parse_status::status_ok) {
return 0U;
}
auto node_list =
doc.select_nodes("/ListBucketResult/CommonPrefixes/Prefix");
std::uint64_t ret = node_list.size();
node_list = doc.select_nodes("/ListBucketResult/Contents");
ret += node_list.size();
if (not prefix.empty()) {
--ret;
}
return ret;
} catch (const std::exception &e) {
utils::error::raise_error(__FUNCTION__, e, "exception occurred");
}
return 0U;
}
@ -469,16 +523,25 @@ auto s3_provider::get_directory_items(const std::string &api_path,
if (res == api_error::item_not_found) {
if (directory) {
res = create_path_directories(child_api_path, child_object_name);
if (res != api_error::success) {
return res;
}
} else {
auto file =
create_api_file(child_api_path, child_object_name, dir_item.size);
res = add_if_not_found(file, child_object_name);
if (res != api_error::success) {
return res;
}
}
res = get_item_meta(child_api_path, dir_item.meta);
}
if (res != api_error::success) {
return res;
}
list.push_back(std::move(dir_item));
return api_error::success;
};
@ -1309,12 +1372,12 @@ auto s3_provider::set_item_meta(const std::string &api_path,
}
auto s3_provider::start(api_item_added_callback api_item_added,
i_file_manager *fm) -> bool {
i_file_manager *mgr) -> bool {
event_system::instance().raise<service_started>("s3_provider");
utils::db::create_rocksdb(config_, DB_NAME, db_);
api_item_added_ = api_item_added;
fm_ = fm;
fm_ = mgr;
api_meta_map meta{};
if (get_item_meta("/", meta) == api_error::item_not_found) {

View File

@ -1242,12 +1242,12 @@ auto sia_provider::set_item_meta(const std::string &api_path,
}
auto sia_provider::start(api_item_added_callback api_item_added,
i_file_manager *fm) -> bool {
i_file_manager *mgr) -> bool {
event_system::instance().raise<service_started>("sia_provider");
utils::db::create_rocksdb(config_, DB_NAME, db_);
api_item_added_ = api_item_added;
fm_ = fm;
fm_ = mgr;
api_meta_map meta{};
if (get_item_meta("/", meta) == api_error::item_not_found) {