forked from Green-Sky/tomato
backend fs read
This commit is contained in:
parent
3cede91aa0
commit
8a580e2fbb
@ -287,9 +287,58 @@ bool FilesystemStorage::write(Object o, std::function<write_to_storage_fetch_dat
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool FilesystemStorage::read(Object o, std::function<read_from_storage_put_data_cb>& data_cb) {
|
bool FilesystemStorage::read(Object o, std::function<read_from_storage_put_data_cb>& data_cb) {
|
||||||
|
auto& reg = _os.registry();
|
||||||
|
|
||||||
|
if (!reg.valid(o)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ObjectHandle oh {reg, o};
|
||||||
|
|
||||||
|
if (!oh.all_of<ObjComp::Ephemeral::FilePath>()) {
|
||||||
|
// not a file
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& obj_path = oh.get<ObjComp::Ephemeral::FilePath>().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<ObjComp::DataCompressionType>()) {
|
||||||
|
data_comp = oh.get<ObjComp::DataCompressionType>().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) {
|
void FilesystemStorage::scanAsync(void) {
|
||||||
scanPathAsync(_storage_path);
|
scanPathAsync(_storage_path);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user