#include "zenstore/basicfile.h" #include #include #include #include namespace zen { using namespace fmt::literals; void CasBlobFile::Open(std::filesystem::path FileName, bool isCreate) { const DWORD dwCreationDisposition = isCreate ? CREATE_ALWAYS : OPEN_EXISTING; HRESULT hRes = m_File.Create(FileName.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, dwCreationDisposition); if (FAILED(hRes)) { throw std::system_error(GetLastError(), std::system_category(), "Failed to open bucket sobs file '{}'"_format(FileName)); } } void CasBlobFile::Read(void* Data, uint64_t Size, uint64_t Offset) { OVERLAPPED Ovl{}; Ovl.Offset = DWORD(Offset & 0xffff'ffffu); Ovl.OffsetHigh = DWORD(Offset >> 32); HRESULT hRes = m_File.Read(Data, gsl::narrow(Size), &Ovl); if (FAILED(hRes)) { throw std::system_error(GetLastError(), std::system_category(), "Failed to read from file '{}'"_format(zen::PathFromHandle(m_File))); } } IoBuffer CasBlobFile::ReadAll() { IoBuffer Buffer(FileSize()); Read((void*)Buffer.Data(), Buffer.Size(), 0); return Buffer; } void CasBlobFile::Write(const void* Data, uint64_t Size, uint64_t Offset) { OVERLAPPED Ovl{}; Ovl.Offset = DWORD(Offset & 0xffff'ffffu); Ovl.OffsetHigh = DWORD(Offset >> 32); HRESULT hRes = m_File.Write(Data, gsl::narrow(Size), &Ovl); if (FAILED(hRes)) { throw std::system_error(GetLastError(), std::system_category(), "Failed to write to file '{}'"_format(zen::PathFromHandle(m_File))); } } void CasBlobFile::Flush() { m_File.Flush(); } uint64_t CasBlobFile::FileSize() { ULONGLONG Sz; m_File.GetSize(Sz); return uint64_t(Sz); } }