aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/basicfile.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-02-12 09:05:07 +0100
committerGitHub Enterprise <[email protected]>2025-02-12 09:05:07 +0100
commit800305f7f2afe01e9ca038a71a68e9318c52ee77 (patch)
treecded7dabccef9c1d47aa9680507d278026e65353 /src/zencore/basicfile.cpp
parentmoving and small refactor of chunk blocks to prepare for builds api (#282) (diff)
downloadzen-800305f7f2afe01e9ca038a71a68e9318c52ee77.tar.xz
zen-800305f7f2afe01e9ca038a71a68e9318c52ee77.zip
move WriteToTempFile to basicfile.h (#283)
add helper constructors to BasicFile
Diffstat (limited to 'src/zencore/basicfile.cpp')
-rw-r--r--src/zencore/basicfile.cpp64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/zencore/basicfile.cpp b/src/zencore/basicfile.cpp
index c2a21ae90..b3bffd34d 100644
--- a/src/zencore/basicfile.cpp
+++ b/src/zencore/basicfile.cpp
@@ -28,6 +28,20 @@ BasicFile::~BasicFile()
{
Close();
}
+BasicFile::BasicFile(const std::filesystem::path& FileName, Mode Mode)
+{
+ Open(FileName, Mode);
+}
+
+BasicFile::BasicFile(const std::filesystem::path& FileName, Mode Mode, std::error_code& Ec)
+{
+ Open(FileName, Mode, Ec);
+}
+
+BasicFile::BasicFile(const std::filesystem::path& FileName, Mode Mode, std::function<bool(std::error_code& Ec)>&& RetryCallback)
+{
+ Open(FileName, Mode, std::move(RetryCallback));
+}
void
BasicFile::Open(const std::filesystem::path& FileName, Mode Mode)
@@ -267,7 +281,7 @@ BasicFile::StreamByteRange(uint64_t FileOffset, uint64_t Size, std::function<voi
}
uint64_t
-BasicFile::Write(CompositeBuffer Data, uint64_t FileOffset, std::error_code& Ec)
+BasicFile::Write(const CompositeBuffer& Data, uint64_t FileOffset, std::error_code& Ec)
{
uint64_t WrittenBytes = 0;
for (const SharedBuffer& Buffer : Data.GetSegments())
@@ -575,7 +589,6 @@ TemporaryFile::MoveTemporaryIntoPlace(std::filesystem::path FinalFileName, std::
void
TemporaryFile::SafeWriteFile(const std::filesystem::path& Path, MemoryView Data)
{
- TemporaryFile TempFile;
std::error_code Ec;
SafeWriteFile(Path, Data, Ec);
if (Ec)
@@ -817,6 +830,53 @@ BasicFileWriter::Flush()
m_Base.Write(m_Buffer, BufferedBytes, WriteOffset);
}
+IoBuffer
+WriteToTempFile(CompositeBuffer&& Buffer, const std::filesystem::path& Path, std::function<bool(std::error_code& Ec)>&& RetryCallback)
+{
+ if (std::filesystem::is_regular_file(Path))
+ {
+ IoBuffer ExistingTempFile = IoBuffer(IoBufferBuilder::MakeFromFile(Path));
+ if (ExistingTempFile && ExistingTempFile.GetSize() == Buffer.GetSize())
+ {
+ ExistingTempFile.SetDeleteOnClose(true);
+ return ExistingTempFile;
+ }
+ }
+ BasicFile BlockFile;
+ BlockFile.Open(Path, BasicFile::Mode::kTruncateDelete, std::move(RetryCallback));
+ uint64_t Offset = 0;
+ {
+ static const uint64_t BufferingSize = 256u * 1024u;
+ BasicFileWriter BufferedOutput(BlockFile, BufferingSize / 2);
+ for (const SharedBuffer& Segment : Buffer.GetSegments())
+ {
+ size_t SegmentSize = Segment.GetSize();
+
+ IoBufferFileReference FileRef;
+ if (SegmentSize >= (BufferingSize + BufferingSize / 2) && Segment.GetFileReference(FileRef))
+ {
+ ScanFile(FileRef.FileHandle,
+ FileRef.FileChunkOffset,
+ FileRef.FileChunkSize,
+ BufferingSize,
+ [&BufferedOutput, &Offset](const void* Data, size_t Size) {
+ BufferedOutput.Write(Data, Size, Offset);
+ Offset += Size;
+ });
+ }
+ else
+ {
+ BufferedOutput.Write(Segment.GetData(), SegmentSize, Offset);
+ Offset += SegmentSize;
+ }
+ }
+ }
+ void* FileHandle = BlockFile.Detach();
+ IoBuffer BlockBuffer = IoBuffer(IoBuffer::File, FileHandle, 0, Offset, /*IsWholeFile*/ true);
+ BlockBuffer.SetDeleteOnClose(true);
+ return BlockBuffer;
+}
+
//////////////////////////////////////////////////////////////////////////
/*