76 lines
2.0 KiB
C++
76 lines
2.0 KiB
C++
//
|
|
// Created by Kirill Zhukov on 20.04.2025.
|
|
//
|
|
|
|
#include "VersionManager.h"
|
|
|
|
namespace usub::utils
|
|
{
|
|
VersionManager::VersionManager(const std::string& dbname)
|
|
: db_name(dbname),
|
|
metadata_dir("metadata/" + db_name + "/"),
|
|
version_file(metadata_dir + "version.meta")
|
|
{
|
|
ensure_metadata_dir();
|
|
load_version();
|
|
}
|
|
|
|
uint64_t VersionManager::next_version()
|
|
{
|
|
return this->version.fetch_add(1, std::memory_order_relaxed);
|
|
}
|
|
|
|
void VersionManager::ensure_metadata_dir()
|
|
{
|
|
try
|
|
{
|
|
if (!std::filesystem::exists(this->metadata_dir))
|
|
{
|
|
std::filesystem::create_directories(this->metadata_dir);
|
|
}
|
|
}
|
|
catch (const std::exception& e)
|
|
{
|
|
std::cerr << "Failed to create metadata dir: " << e.what() << std::endl;
|
|
}
|
|
}
|
|
|
|
void VersionManager::load_version()
|
|
{
|
|
std::ifstream f(this->version_file, std::ios::binary);
|
|
if (f.is_open())
|
|
{
|
|
uint64_t v = 0;
|
|
f.read(reinterpret_cast<char*>(&v), sizeof(v));
|
|
if (f.good() && v > 0)
|
|
{
|
|
this->version.store(v, std::memory_order_relaxed);
|
|
}
|
|
else
|
|
{
|
|
std::cerr << "Warning: empty or corrupted version file for " << this->db_name << "\n";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
std::cerr << "Warning: no version file for " << this->db_name << ", starting fresh\n";
|
|
}
|
|
}
|
|
|
|
void VersionManager::save_version()
|
|
{
|
|
std::ofstream f(this->version_file, std::ios::binary | std::ios::trunc);
|
|
if (!f.is_open())
|
|
{
|
|
std::cerr << "Error: cannot save version for " << this->db_name << "\n";
|
|
return;
|
|
}
|
|
uint64_t v = this->version.load(std::memory_order_relaxed);
|
|
f.write(reinterpret_cast<const char*>(&v), sizeof(v));
|
|
if (!f.good())
|
|
{
|
|
std::cerr << "Error: cannot write version for " << this->db_name << "\n";
|
|
}
|
|
}
|
|
}
|