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) {