36 static const string& staticName();
42 std::unique_ptr<FileHandler> makeNew()
const override;
44 const string& getFileHandlerName()
const override;
47 int openSpec(
const FileSpec& fileSpec)
override;
50 bool isOpened()
const override;
53 int create(
const string& newFilePath,
const FileSpec::Extras& options = {})
override;
55 void forgetFurtherChunks(int64_t fileSize)
override;
57 int64_t getTotalSize()
const override;
59 vector<std::pair<string, int64_t>> getFileChunks()
const override;
64 int skipForward(int64_t offset)
override;
66 int setPos(int64_t offset)
override;
69 int read(
void* buffer,
size_t length)
override;
71 template <typename T, std::enable_if_t<std::is_trivially_copyable<T>::value,
int> = 0>
73 return read(&
object,
sizeof(
object));
76 template <typename T, std::enable_if_t<std::is_trivially_copyable<T>::value,
int> = 0>
78 return read(vec.data(), vec.size() *
sizeof(T));
81 size_t getLastRWSize()
const override;
84 bool reopenForUpdatesSupported()
const override;
86 int reopenForUpdates()
override;
88 bool isReadOnly()
const override;
90 int write(
const void* buffer,
size_t length)
override;
92 template <typename T, std::enable_if_t<std::is_trivially_copyable<T>::value,
int> = 0>
94 return write(&
object,
sizeof(
object));
98 int overwrite(
const void* buffer,
size_t length)
override;
100 template <typename T, std::enable_if_t<std::is_trivially_copyable<T>::value,
int> = 0>
102 return overwrite(&
object,
sizeof(
object));
105 int addChunk()
override;
107 int truncate()
override;
110 int getLastError()
const override;
112 bool isEof()
const override;
114 int64_t getPos()
const override;
116 int64_t getChunkPos()
const override;
118 int getChunkRange(int64_t& outChunkOffset, int64_t& outChunkSize)
const override;
120 bool getCurrentChunk(
string& outChunkPath,
size_t& outChunkIndex)
const override;
122 bool isRemoteFileSystem()
const override;
126 static int writeZstdFile(
const string& path,
const void* data,
size_t dataSize);
127 static int writeZstdFile(
const string& path,
const string&
string);
128 template <typename T, std::enable_if_t<std::is_trivially_copyable<T>::value,
int> = 0>
129 int writeZstdFile(
const string& path,
const T&
object) {
130 return writeZstdFile(path, &
object,
sizeof(T));
132 template <typename T, std::enable_if_t<std::is_trivially_copyable<T>::value,
int> = 0>
133 int writeZstdFile(
const string& path,
const vector<T>& v) {
134 return writeZstdFile(path, v.data(), v.size() *
sizeof(T));
137 static int readZstdFile(
const string& path, vector<char>& outContent);
138 static int readZstdFile(
const string& path,
string& outString);
139 template <typename T, std::enable_if_t<std::is_trivially_copyable<T>::value,
int> = 0>
140 int readZstdFile(
const string& path, T&
object) {
141 return readZstdFile(path, &
object,
sizeof(T));
144 static int readZstdFile(
const string& path,
void* data,
size_t dataSize);
151 static string readTextFile(
const string& path);
156 static int writeTextFile(
const string& path,
const string& text);
158 int parseUri(FileSpec& inOutFileSpec,
size_t colonIndex)
const override;
161 int checkChunks(
const vector<string>& chunks);
162 int openChunk(FileChunk* chunk);
163 int closeChunk(FileChunk* chunk);
164 int addChunk(
const string& chunkFilePath);
165 bool isLastChunk()
const;
166 bool trySetPosInCurrentChunk(int64_t offset);
168 FileSpec::Extras options_;
169 std::unique_ptr<vector<FileChunk>> chunks_;
170 FileChunk* currentChunk_{};
171 int filesOpenCount_{};
173 size_t lastRWSize_{};
175 bool readOnly_{
true};