file mgr db unit tests and fixes
This commit is contained in:
parent
7567e3289c
commit
9eb6a377fd
34
repertory/librepertory/include/db/file_mgr_db.hpp
Normal file
34
repertory/librepertory/include/db/file_mgr_db.hpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
#ifndef REPERTORY_INCLUDE_DB_FILE_MGR_DB_HPP_
|
||||||
|
#define REPERTORY_INCLUDE_DB_FILE_MGR_DB_HPP_
|
||||||
|
|
||||||
|
#include "db/i_file_mgr_db.hpp"
|
||||||
|
|
||||||
|
namespace repertory {
|
||||||
|
class app_config;
|
||||||
|
|
||||||
|
[[nodiscard]] auto
|
||||||
|
create_file_mgr_db(const app_config &cfg) -> std::unique_ptr<i_file_mgr_db>;
|
||||||
|
} // namespace repertory
|
||||||
|
|
||||||
|
#endif // REPERTORY_INCLUDE_DB_FILE_MGR_DB_HPP_
|
@ -50,6 +50,13 @@ private:
|
|||||||
private:
|
private:
|
||||||
void create_or_open(bool clear);
|
void create_or_open(bool clear);
|
||||||
|
|
||||||
|
[[nodiscard]] auto create_iterator(rocksdb::ColumnFamilyHandle *family) const
|
||||||
|
-> std::shared_ptr<rocksdb::Iterator>;
|
||||||
|
|
||||||
|
[[nodiscard]] static auto
|
||||||
|
perform_action(std::string_view function_name,
|
||||||
|
std::function<rocksdb::Status()> action) -> bool;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
[[nodiscard]] auto add_resume(resume_entry entry) -> bool override;
|
[[nodiscard]] auto add_resume(resume_entry entry) -> bool override;
|
||||||
|
|
||||||
|
34
repertory/librepertory/src/db/file_mgr_db.cpp
Normal file
34
repertory/librepertory/src/db/file_mgr_db.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
#include "db/file_mgr_db.hpp"
|
||||||
|
|
||||||
|
#include "app_config.hpp"
|
||||||
|
#include "db/i_file_mgr_db.hpp"
|
||||||
|
#include "db/rdb_file_mgr_db.hpp"
|
||||||
|
#include "db/sqlite_file_mgr_db.hpp"
|
||||||
|
|
||||||
|
namespace repertory {
|
||||||
|
auto create_file_mgr_db(const app_config &cfg)
|
||||||
|
-> std::unique_ptr<i_file_mgr_db> {
|
||||||
|
return std::make_unique<sqlite_file_mgr_db>(cfg);
|
||||||
|
}
|
||||||
|
} // namespace repertory
|
@ -28,6 +28,7 @@
|
|||||||
#include "utils/file.hpp"
|
#include "utils/file.hpp"
|
||||||
#include "utils/path.hpp"
|
#include "utils/path.hpp"
|
||||||
#include "utils/string.hpp"
|
#include "utils/string.hpp"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
[[nodiscard]] auto
|
[[nodiscard]] auto
|
||||||
@ -86,17 +87,53 @@ void rdb_file_mgr_db::create_or_open(bool clear) {
|
|||||||
upload_family_ = handles[idx++];
|
upload_family_ = handles[idx++];
|
||||||
}
|
}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::add_resume(resume_entry entry) -> bool {}
|
auto rdb_file_mgr_db::add_resume(resume_entry entry) -> bool {
|
||||||
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
|
return perform_action(function_name, [this, &entry]() -> rocksdb::Status {
|
||||||
|
auto data = json({
|
||||||
|
{"chunk_size", entry.chunk_size},
|
||||||
|
{"read_state", utils::string::from_dynamic_bitset(entry.read_state)},
|
||||||
|
{"source_path", entry.source_path},
|
||||||
|
});
|
||||||
|
return db_->Put(rocksdb::WriteOptions{}, resume_family_, entry.api_path,
|
||||||
|
data.dump());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::add_upload(upload_entry entry) -> bool {}
|
auto rdb_file_mgr_db::add_upload(upload_entry entry) -> bool {}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::add_upload_active(upload_active_entry entry) -> bool {}
|
auto rdb_file_mgr_db::add_upload_active(upload_active_entry entry) -> bool {}
|
||||||
|
|
||||||
void rdb_file_mgr_db::clear() {}
|
void rdb_file_mgr_db::clear() { create_or_open(true); }
|
||||||
|
|
||||||
|
auto rdb_file_mgr_db::create_iterator(rocksdb::ColumnFamilyHandle *family) const
|
||||||
|
-> std::shared_ptr<rocksdb::Iterator> {
|
||||||
|
return std::shared_ptr<rocksdb::Iterator>(
|
||||||
|
db_->NewIterator(rocksdb::ReadOptions(), family));
|
||||||
|
}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::get_next_upload() const -> std::optional<upload_entry> {}
|
auto rdb_file_mgr_db::get_next_upload() const -> std::optional<upload_entry> {}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::get_resume_list() const -> std::vector<resume_entry> {}
|
auto rdb_file_mgr_db::get_resume_list() const -> std::vector<resume_entry> {
|
||||||
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
|
std::vector<resume_entry> ret;
|
||||||
|
|
||||||
|
auto iter = create_iterator(resume_family_);
|
||||||
|
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
|
||||||
|
auto data = json::parse(iter->value().ToString());
|
||||||
|
ret.emplace_back(resume_entry{
|
||||||
|
iter->key().ToString(),
|
||||||
|
data.at("chunk_size").get<std::uint64_t>(),
|
||||||
|
utils::string::to_dynamic_bitset(
|
||||||
|
data.at("read_state").get<std::string>()),
|
||||||
|
data.at("source_path").get<std::string>(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::get_upload(const std::string &api_path) const
|
auto rdb_file_mgr_db::get_upload(const std::string &api_path) const
|
||||||
-> std::optional<upload_entry> {}
|
-> std::optional<upload_entry> {}
|
||||||
@ -104,7 +141,24 @@ auto rdb_file_mgr_db::get_upload(const std::string &api_path) const
|
|||||||
auto rdb_file_mgr_db::get_upload_active_list() const
|
auto rdb_file_mgr_db::get_upload_active_list() const
|
||||||
-> std::vector<upload_active_entry> {}
|
-> std::vector<upload_active_entry> {}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::remove_resume(const std::string &api_path) -> bool {}
|
auto rdb_file_mgr_db::perform_action(std::string_view function_name,
|
||||||
|
std::function<rocksdb::Status()> action)
|
||||||
|
-> bool {
|
||||||
|
auto res = action();
|
||||||
|
if (not res.ok()) {
|
||||||
|
utils::error::raise_error(function_name, res.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto rdb_file_mgr_db::remove_resume(const std::string &api_path) -> bool {
|
||||||
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
|
return perform_action(function_name, [this, &api_path]() -> rocksdb::Status {
|
||||||
|
return db_->Delete(rocksdb::WriteOptions{}, api_path);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::remove_upload(const std::string &api_path) -> bool {}
|
auto rdb_file_mgr_db::remove_upload(const std::string &api_path) -> bool {}
|
||||||
|
|
||||||
@ -112,5 +166,35 @@ auto rdb_file_mgr_db::remove_upload_active(const std::string &api_path)
|
|||||||
-> bool {}
|
-> bool {}
|
||||||
|
|
||||||
auto rdb_file_mgr_db::rename_resume(const std::string &from_api_path,
|
auto rdb_file_mgr_db::rename_resume(const std::string &from_api_path,
|
||||||
const std::string &to_api_path) -> bool {}
|
const std::string &to_api_path) -> bool {
|
||||||
|
REPERTORY_USES_FUNCTION_NAME();
|
||||||
|
|
||||||
|
std::string value;
|
||||||
|
auto res = perform_action(
|
||||||
|
function_name, [this, &from_api_path, &value]() -> rocksdb::Status {
|
||||||
|
return db_->Get(rocksdb::ReadOptions{}, from_api_path, &value);
|
||||||
|
});
|
||||||
|
if (not res) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.empty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto data = json::parse(value);
|
||||||
|
resume_entry entry{
|
||||||
|
to_api_path,
|
||||||
|
data.at("chunk_size").get<std::uint64_t>(),
|
||||||
|
utils::string::to_dynamic_bitset(
|
||||||
|
data.at("read_state").get<std::string>()),
|
||||||
|
data.at("source_path").get<std::string>(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (not remove_resume(from_api_path)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return add_resume(entry);
|
||||||
|
}
|
||||||
} // namespace repertory
|
} // namespace repertory
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include "file_manager/file_manager.hpp"
|
#include "file_manager/file_manager.hpp"
|
||||||
|
|
||||||
#include "app_config.hpp"
|
#include "app_config.hpp"
|
||||||
#include "db/sqlite_file_mgr_db.hpp"
|
#include "db/file_mgr_db.hpp"
|
||||||
#include "file_manager/events.hpp"
|
#include "file_manager/events.hpp"
|
||||||
#include "file_manager/open_file.hpp"
|
#include "file_manager/open_file.hpp"
|
||||||
#include "file_manager/open_file_base.hpp"
|
#include "file_manager/open_file_base.hpp"
|
||||||
@ -42,7 +42,7 @@
|
|||||||
namespace repertory {
|
namespace repertory {
|
||||||
file_manager::file_manager(app_config &config, i_provider &provider)
|
file_manager::file_manager(app_config &config, i_provider &provider)
|
||||||
: config_(config), provider_(provider) {
|
: config_(config), provider_(provider) {
|
||||||
mgr_db_ = std::make_unique<sqlite_file_mgr_db>(config_);
|
mgr_db_ = create_file_mgr_db(config);
|
||||||
|
|
||||||
if (provider_.is_read_only()) {
|
if (provider_.is_read_only()) {
|
||||||
return;
|
return;
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include "test_common.hpp"
|
#include "test_common.hpp"
|
||||||
|
|
||||||
#include "app_config.hpp"
|
#include "app_config.hpp"
|
||||||
// #include "db/rdb_meta_db.hpp"
|
#include "db/rdb_file_mgr_db.hpp"
|
||||||
#include "db/sqlite_file_mgr_db.hpp"
|
#include "db/sqlite_file_mgr_db.hpp"
|
||||||
#include "events/consumers/console_consumer.hpp"
|
#include "events/consumers/console_consumer.hpp"
|
||||||
#include "events/event_system.hpp"
|
#include "events/event_system.hpp"
|
||||||
@ -58,7 +58,7 @@ protected:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using file_mgr_db_types = ::testing::Types<sqlite_file_mgr_db>;
|
using file_mgr_db_types = ::testing::Types<sqlite_file_mgr_db, rdb_file_mgr_db>;
|
||||||
|
|
||||||
template <typename db_t>
|
template <typename db_t>
|
||||||
std::unique_ptr<app_config> file_mgr_db_test<db_t>::config;
|
std::unique_ptr<app_config> file_mgr_db_test<db_t>::config;
|
||||||
|
@ -93,4 +93,24 @@ TYPED_TEST(file_mgr_db_test, can_replace_resume) {
|
|||||||
|
|
||||||
EXPECT_TRUE(this->file_mgr_db->remove_resume("/test0"));
|
EXPECT_TRUE(this->file_mgr_db->remove_resume("/test0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(file_mgr_db_test, can_rename_resume) {
|
||||||
|
this->file_mgr_db->clear();
|
||||||
|
|
||||||
|
EXPECT_TRUE(this->file_mgr_db->add_resume({
|
||||||
|
"/test0",
|
||||||
|
2ULL,
|
||||||
|
{},
|
||||||
|
"/src/test0",
|
||||||
|
}));
|
||||||
|
EXPECT_TRUE(this->file_mgr_db->rename_resume("/test0", "/test1"));
|
||||||
|
|
||||||
|
auto list = this->file_mgr_db->get_resume_list();
|
||||||
|
EXPECT_EQ(1U, list.size());
|
||||||
|
EXPECT_STREQ("/test1", list.at(0U).api_path.c_str());
|
||||||
|
EXPECT_EQ(2ULL, list.at(0U).chunk_size);
|
||||||
|
EXPECT_STREQ("/src/test0", list.at(0U).source_path.c_str());
|
||||||
|
|
||||||
|
EXPECT_TRUE(this->file_mgr_db->remove_resume("/test0"));
|
||||||
|
}
|
||||||
} // namespace repertory
|
} // namespace repertory
|
||||||
|
Loading…
x
Reference in New Issue
Block a user