aca2348a20
- .claude/CLAUDE.md - .claude/agents/fn-recopilador/SKILL.md - .claude/rules/INDEX.md - .claude/rules/cpp_apps.md - bash/functions/infra/build_cpp_windows.sh - cpp/CMakeLists.txt - cpp/PATTERNS.md - cpp/framework/app_base.cpp - cpp/framework/app_base.h - dev/issues/README.md - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
#include "job_cache_sha256.h"
|
|
|
|
#include <cstdio>
|
|
#include <filesystem>
|
|
#include <fstream>
|
|
#include <sstream>
|
|
|
|
namespace fs = std::filesystem;
|
|
|
|
namespace fn::cache_sha256 {
|
|
|
|
namespace {
|
|
|
|
std::string subdir_for(const std::string& key) {
|
|
return key.size() >= 2 ? key.substr(0, 2) : key;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
std::string path_for(const std::string& root,
|
|
const std::string& key,
|
|
const std::string& suffix) {
|
|
fs::path p = fs::path(root) / subdir_for(key) / (key + suffix);
|
|
return p.string();
|
|
}
|
|
|
|
bool ensure_dir(const std::string& root, const std::string& key) {
|
|
std::error_code ec;
|
|
fs::path dir = fs::path(root) / subdir_for(key);
|
|
fs::create_directories(dir, ec);
|
|
return !ec;
|
|
}
|
|
|
|
bool read(const std::string& root,
|
|
const std::string& key,
|
|
const std::string& suffix,
|
|
std::string* out) {
|
|
if (!out) return false;
|
|
std::ifstream f(path_for(root, key, suffix), std::ios::binary);
|
|
if (!f.is_open()) return false;
|
|
std::ostringstream ss;
|
|
ss << f.rdbuf();
|
|
*out = ss.str();
|
|
return f.good() || f.eof();
|
|
}
|
|
|
|
bool write(const std::string& root,
|
|
const std::string& key,
|
|
const std::string& suffix,
|
|
const std::string& bytes) {
|
|
if (!ensure_dir(root, key)) return false;
|
|
std::ofstream f(path_for(root, key, suffix),
|
|
std::ios::binary | std::ios::trunc);
|
|
if (!f.is_open()) return false;
|
|
f.write(bytes.data(), (std::streamsize)bytes.size());
|
|
return f.good();
|
|
}
|
|
|
|
bool exists(const std::string& root,
|
|
const std::string& key,
|
|
const std::string& suffix) {
|
|
std::error_code ec;
|
|
return fs::exists(path_for(root, key, suffix), ec) && !ec;
|
|
}
|
|
|
|
} // namespace fn::cache_sha256
|