// // 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/" + this->db_name + "/"), version_file(this->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(&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(&v), sizeof(v)); if (!f.good()) { std::cerr << "Error: cannot write version for " << this->db_name << "\n"; } } }