Add read by type to new FileStore
This commit is contained in:
parent
8378af7564
commit
e19e70e065
@ -68,6 +68,21 @@ class FileStoreTemplate: public FileStore {
|
|||||||
|
|
||||||
Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size);
|
Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads the "file" at the given id. You are responsible for freeing
|
||||||
|
* the data when done with it.
|
||||||
|
* @param id id of the "file"
|
||||||
|
* @param readStart where in the data to start reading
|
||||||
|
* @param readSize how much data to read
|
||||||
|
* @param data pointer to the pointer where the data is stored
|
||||||
|
* @param size pointer to a value that will be assigned the size of data
|
||||||
|
* @return 0 if read is a success
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
int read(InodeId_t id, FsSize_t readStart,
|
||||||
|
FsSize_t readSize, T *data,
|
||||||
|
FsSize_t *size);
|
||||||
|
|
||||||
StatInfo stat(InodeId_t id);
|
StatInfo stat(InodeId_t id);
|
||||||
|
|
||||||
InodeId_t spaceNeeded(FsSize_t size);
|
InodeId_t spaceNeeded(FsSize_t size);
|
||||||
@ -236,6 +251,35 @@ Error FileStoreTemplate<size_t>::read(InodeId_t id, FsSize_t readStart, FsSize_t
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename size_t>
|
||||||
|
template<typename T>
|
||||||
|
int FileStoreTemplate<size_t>::read(InodeId_t id, FsSize_t readStart,
|
||||||
|
FsSize_t readSize, T *data, FsSize_t *size) {
|
||||||
|
auto src = find(id);
|
||||||
|
if (src.valid()) {
|
||||||
|
auto srcData = src->data();
|
||||||
|
if (srcData.valid()) {
|
||||||
|
auto sub = srcData.subPtr(readStart, readSize);
|
||||||
|
if (sub.valid() && sub.size() % sizeof(T)) {
|
||||||
|
for (FsSize_t i = 0; i < sub.size() / sizeof(T); i++) {
|
||||||
|
// do byte-by-byte copy to ensure alignment is right when
|
||||||
|
// copying to final destination
|
||||||
|
T tmp;
|
||||||
|
for (size_t i = 0; i < sizeof(T); i++) {
|
||||||
|
*reinterpret_cast<uint8_t*>(&tmp)[i] = *(reinterpret_cast<uint8_t*>(sub.get()) + i);
|
||||||
|
}
|
||||||
|
*(data + i) = tmp;
|
||||||
|
}
|
||||||
|
if (size) {
|
||||||
|
*size = sub.size();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
typename FileStoreTemplate<size_t>::StatInfo FileStoreTemplate<size_t>::stat(InodeId_t id) {
|
typename FileStoreTemplate<size_t>::StatInfo FileStoreTemplate<size_t>::stat(InodeId_t id) {
|
||||||
auto inode = find(id);
|
auto inode = find(id);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user