SharedStorage/utils/io/VersionManager.cpp
2025-04-20 18:24:28 +03:00

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";
}
}
}