From 8a580e2fbbf9f348ce37aded3d88372ab179e81d Mon Sep 17 00:00:00 2001 From: Green Sky Date: Tue, 9 Apr 2024 20:58:47 +0200 Subject: [PATCH] backend fs read --- .../backends/filesystem_storage.cpp | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/fragment_store/backends/filesystem_storage.cpp b/src/fragment_store/backends/filesystem_storage.cpp index 8b8685bb..64049bf6 100644 --- a/src/fragment_store/backends/filesystem_storage.cpp +++ b/src/fragment_store/backends/filesystem_storage.cpp @@ -287,7 +287,56 @@ bool FilesystemStorage::write(Object o, std::function& data_cb) { - return false; + auto& reg = _os.registry(); + + if (!reg.valid(o)) { + return false; + } + + ObjectHandle oh {reg, o}; + + if (!oh.all_of()) { + // not a file + return false; + } + + const auto& obj_path = oh.get().path; + + // TODO: check if metadata dirty? + // TODO: what if file changed on disk? + + std::cout << "FS: loading fragment '" << obj_path << "'\n"; + + Compression data_comp = Compression::NONE; + if (oh.all_of()) { + data_comp = oh.get().comp; + } + + auto data_file_stack = buildFileStackRead(std::string_view{obj_path}, Encryption::NONE, data_comp); + if (data_file_stack.empty()) { + return false; + } + + // TODO: make it read in a single chunk instead? + static constexpr int64_t chunk_size {1024 * 1024}; // 1MiB should be good for read + do { + auto data_var = data_file_stack.top()->read(chunk_size); + ByteSpan data = spanFromRead(data_var); + + if (data.empty()) { + // error or probably eof + break; + } + + data_cb(data); + + if (data.size < chunk_size) { + // eof + break; + } + } while (data_file_stack.top()->isGood()); + + return true; } void FilesystemStorage::scanAsync(void) {