Add missing read to new FileStore
This commit is contained in:
8
deps/ox/src/ox/fs/filestore/filestore.hpp
vendored
8
deps/ox/src/ox/fs/filestore/filestore.hpp
vendored
@@ -19,10 +19,10 @@ class FileStore {
|
||||
|
||||
public:
|
||||
struct StatInfo {
|
||||
InodeId_t inodeId;
|
||||
InodeId_t links;
|
||||
InodeId_t size;
|
||||
uint8_t fileType;
|
||||
InodeId_t inodeId = 0;
|
||||
InodeId_t links = 0;
|
||||
InodeId_t size = 0;
|
||||
uint8_t fileType = 0;
|
||||
};
|
||||
|
||||
virtual Error format() = 0;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
namespace ox::fs {
|
||||
|
||||
template class FileStoreTemplate<uint16_t>;
|
||||
template class FileStoreTemplate<uint32_t>;
|
||||
|
||||
}
|
||||
|
||||
@@ -161,6 +161,7 @@ Error FileStoreTemplate<size_t>::decLinks(InodeId_t id) {
|
||||
template<typename size_t>
|
||||
Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSize, uint8_t fileType) {
|
||||
auto existing = find(id);
|
||||
// TODO: try compacting if unable to write
|
||||
if (canWrite(existing, dataSize)) {
|
||||
// delete the old node if it exists
|
||||
if (existing.valid()) {
|
||||
@@ -203,10 +204,10 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
|
||||
template<typename size_t>
|
||||
Error FileStoreTemplate<size_t>::read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size) {
|
||||
auto src = find(id);
|
||||
if (src.valid() && src.size() <= dataSize) {
|
||||
if (src.valid()) {
|
||||
auto srcData = src->data();
|
||||
if (srcData.valid()) {
|
||||
ox_memcpy(data, srcData, src.size());
|
||||
if (srcData.valid() && srcData.size() <= dataSize) {
|
||||
ox_memcpy(data, srcData, srcData.size());
|
||||
if (size) {
|
||||
*size = src.size();
|
||||
}
|
||||
@@ -217,10 +218,20 @@ Error FileStoreTemplate<size_t>::read(InodeId_t id, void *data, FsSize_t dataSiz
|
||||
}
|
||||
|
||||
template<typename size_t>
|
||||
Error FileStoreTemplate<size_t>::read(InodeId_t id, FsSize_t /* readStart */, FsSize_t /* readSize */, void * /* data */, FsSize_t * /* size */) {
|
||||
Error FileStoreTemplate<size_t>::read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size) {
|
||||
auto src = find(id);
|
||||
if (src.valid()) {
|
||||
return 0;
|
||||
auto srcData = src->data();
|
||||
if (srcData.valid()) {
|
||||
auto sub = srcData.subPtr(readStart, readSize);
|
||||
if (sub.valid()) {
|
||||
ox_memcpy(data, sub, sub.size());
|
||||
if (size) {
|
||||
*size = sub.size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -369,10 +380,10 @@ bool FileStoreTemplate<size_t>::canWrite(ItemPtr existing, size_t size) {
|
||||
return existing.size() >= size || m_buffer->spaceNeeded(size) <= m_buffer->available();
|
||||
}
|
||||
|
||||
extern template class FileStoreTemplate<uint16_t>;
|
||||
extern template class FileStoreTemplate<uint32_t>;
|
||||
|
||||
using FileStore16 = FileStoreTemplate<uint16_t>;
|
||||
using FileStore32 = FileStoreTemplate<uint32_t>;
|
||||
using FileStore64 = FileStoreTemplate<uint64_t>;
|
||||
|
||||
}
|
||||
|
||||
27
deps/ox/src/ox/fs/filestore/ptr.hpp
vendored
27
deps/ox/src/ox/fs/filestore/ptr.hpp
vendored
@@ -49,6 +49,10 @@ class Ptr {
|
||||
|
||||
inline T &operator*() const;
|
||||
|
||||
inline Ptr subPtr(size_t offset, size_t size);
|
||||
|
||||
inline Ptr subPtr(size_t offset);
|
||||
|
||||
inline void init(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize);
|
||||
|
||||
};
|
||||
@@ -85,15 +89,15 @@ inline size_t Ptr<T, size_t, minOffset>::end() {
|
||||
|
||||
template<typename T, typename size_t, size_t minOffset>
|
||||
inline T *Ptr<T, size_t, minOffset>::get() const {
|
||||
ox_assert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::get())");
|
||||
ox_assert(valid(), "Invalid pointer access. (ox::fs::Ptr::get())");
|
||||
oxAssert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::get())");
|
||||
oxAssert(valid(), "Invalid pointer access. (ox::fs::Ptr::get())");
|
||||
return reinterpret_cast<T*>(m_dataStart + m_itemOffset);
|
||||
}
|
||||
|
||||
template<typename T, typename size_t, size_t minOffset>
|
||||
inline T *Ptr<T, size_t, minOffset>::operator->() const {
|
||||
ox_assert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::operator->())");
|
||||
ox_assert(valid(), "Invalid pointer access. (ox::fs::Ptr::operator->())");
|
||||
oxAssert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::operator->())");
|
||||
oxAssert(valid(), "Invalid pointer access. (ox::fs::Ptr::operator->())");
|
||||
return reinterpret_cast<T*>(m_dataStart + m_itemOffset);
|
||||
}
|
||||
|
||||
@@ -112,11 +116,22 @@ inline Ptr<T, size_t, minOffset>::operator size_t() const {
|
||||
|
||||
template<typename T, typename size_t, size_t minOffset>
|
||||
inline T &Ptr<T, size_t, minOffset>::operator*() const {
|
||||
ox_assert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())");
|
||||
ox_assert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())");
|
||||
oxAssert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())");
|
||||
oxAssert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())");
|
||||
return *static_cast<T>(this);
|
||||
}
|
||||
|
||||
template<typename T, typename size_t, size_t minOffset>
|
||||
inline Ptr<T, size_t, minOffset> Ptr<T, size_t, minOffset>::subPtr(size_t offset, size_t size) {
|
||||
auto dataSize = ((m_dataStart + offset) - m_dataStart) + m_itemSize;
|
||||
return Ptr<T, size_t, minOffset>(m_dataStart, dataSize, offset, size);
|
||||
}
|
||||
|
||||
template<typename T, typename size_t, size_t minOffset>
|
||||
inline Ptr<T, size_t, minOffset> Ptr<T, size_t, minOffset>::subPtr(size_t offset) {
|
||||
return subPtr(offset, m_itemSize - offset);
|
||||
}
|
||||
|
||||
template<typename T, typename size_t, size_t minOffset>
|
||||
inline void Ptr<T, size_t, minOffset>::init(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize) {
|
||||
// do some sanity checks before assuming this is valid
|
||||
|
||||
Reference in New Issue
Block a user