Add missing read to new FileStore
This commit is contained in:
parent
2afef8a741
commit
381c739e46
8
deps/ox/src/ox/__buildinfo/defines.hpp
vendored
8
deps/ox/src/ox/__buildinfo/defines.hpp
vendored
@ -28,4 +28,12 @@ constexpr auto NDebug = true;
|
|||||||
constexpr auto NDebug = false;
|
constexpr auto NDebug = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__BIG_ENDIAN__)
|
||||||
|
constexpr auto BigEndian = true;
|
||||||
|
constexpr auto LittleEndian = false;
|
||||||
|
#else
|
||||||
|
constexpr auto BigEndian = false;
|
||||||
|
constexpr auto LittleEndian = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
2
deps/ox/src/ox/fs/filestore.hpp
vendored
2
deps/ox/src/ox/fs/filestore.hpp
vendored
@ -706,6 +706,8 @@ int FileStore<Header>::read(Inode *inode, typename Header::FsSize_t readStart,
|
|||||||
readSize /= sizeof(T);
|
readSize /= sizeof(T);
|
||||||
uint8_t *it = &(inode->getData()[readStart]);
|
uint8_t *it = &(inode->getData()[readStart]);
|
||||||
for (typename Header::FsSize_t i = 0; i < readSize; i++) {
|
for (typename Header::FsSize_t i = 0; i < readSize; i++) {
|
||||||
|
// do byte-by-byte copy to ensure alignment is right when copying to
|
||||||
|
// final destination
|
||||||
T val;
|
T val;
|
||||||
for (size_t i = 0; i < sizeof(T); i++) {
|
for (size_t i = 0; i < sizeof(T); i++) {
|
||||||
((uint8_t*) (&val))[i] = *(it++);
|
((uint8_t*) (&val))[i] = *(it++);
|
||||||
|
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:
|
public:
|
||||||
struct StatInfo {
|
struct StatInfo {
|
||||||
InodeId_t inodeId;
|
InodeId_t inodeId = 0;
|
||||||
InodeId_t links;
|
InodeId_t links = 0;
|
||||||
InodeId_t size;
|
InodeId_t size = 0;
|
||||||
uint8_t fileType;
|
uint8_t fileType = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual Error format() = 0;
|
virtual Error format() = 0;
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
namespace ox::fs {
|
namespace ox::fs {
|
||||||
|
|
||||||
|
template class FileStoreTemplate<uint16_t>;
|
||||||
template class FileStoreTemplate<uint32_t>;
|
template class FileStoreTemplate<uint32_t>;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -161,6 +161,7 @@ Error FileStoreTemplate<size_t>::decLinks(InodeId_t id) {
|
|||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSize, uint8_t fileType) {
|
Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSize, uint8_t fileType) {
|
||||||
auto existing = find(id);
|
auto existing = find(id);
|
||||||
|
// TODO: try compacting if unable to write
|
||||||
if (canWrite(existing, dataSize)) {
|
if (canWrite(existing, dataSize)) {
|
||||||
// delete the old node if it exists
|
// delete the old node if it exists
|
||||||
if (existing.valid()) {
|
if (existing.valid()) {
|
||||||
@ -203,10 +204,10 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
|
|||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
Error FileStoreTemplate<size_t>::read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size) {
|
Error FileStoreTemplate<size_t>::read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size) {
|
||||||
auto src = find(id);
|
auto src = find(id);
|
||||||
if (src.valid() && src.size() <= dataSize) {
|
if (src.valid()) {
|
||||||
auto srcData = src->data();
|
auto srcData = src->data();
|
||||||
if (srcData.valid()) {
|
if (srcData.valid() && srcData.size() <= dataSize) {
|
||||||
ox_memcpy(data, srcData, src.size());
|
ox_memcpy(data, srcData, srcData.size());
|
||||||
if (size) {
|
if (size) {
|
||||||
*size = src.size();
|
*size = src.size();
|
||||||
}
|
}
|
||||||
@ -217,11 +218,21 @@ Error FileStoreTemplate<size_t>::read(InodeId_t id, void *data, FsSize_t dataSiz
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
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);
|
auto src = find(id);
|
||||||
if (src.valid()) {
|
if (src.valid()) {
|
||||||
|
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 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return 1;
|
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();
|
return existing.size() >= size || m_buffer->spaceNeeded(size) <= m_buffer->available();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern template class FileStoreTemplate<uint16_t>;
|
||||||
extern template class FileStoreTemplate<uint32_t>;
|
extern template class FileStoreTemplate<uint32_t>;
|
||||||
|
|
||||||
using FileStore16 = FileStoreTemplate<uint16_t>;
|
using FileStore16 = FileStoreTemplate<uint16_t>;
|
||||||
using FileStore32 = FileStoreTemplate<uint32_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 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);
|
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>
|
template<typename T, typename size_t, size_t minOffset>
|
||||||
inline T *Ptr<T, size_t, minOffset>::get() const {
|
inline T *Ptr<T, size_t, minOffset>::get() const {
|
||||||
ox_assert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::get())");
|
oxAssert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::get())");
|
||||||
ox_assert(valid(), "Invalid pointer access. (ox::fs::Ptr::get())");
|
oxAssert(valid(), "Invalid pointer access. (ox::fs::Ptr::get())");
|
||||||
return reinterpret_cast<T*>(m_dataStart + m_itemOffset);
|
return reinterpret_cast<T*>(m_dataStart + m_itemOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename size_t, size_t minOffset>
|
template<typename T, typename size_t, size_t minOffset>
|
||||||
inline T *Ptr<T, size_t, minOffset>::operator->() const {
|
inline T *Ptr<T, size_t, minOffset>::operator->() const {
|
||||||
ox_assert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::operator->())");
|
oxAssert(m_validated, "Unvalidated pointer access. (ox::fs::Ptr::operator->())");
|
||||||
ox_assert(valid(), "Invalid pointer access. (ox::fs::Ptr::operator->())");
|
oxAssert(valid(), "Invalid pointer access. (ox::fs::Ptr::operator->())");
|
||||||
return reinterpret_cast<T*>(m_dataStart + m_itemOffset);
|
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>
|
template<typename T, typename size_t, size_t minOffset>
|
||||||
inline T &Ptr<T, size_t, minOffset>::operator*() const {
|
inline T &Ptr<T, size_t, minOffset>::operator*() const {
|
||||||
ox_assert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())");
|
oxAssert(m_validated, "Unvalidated pointer dereference. (ox::fs::Ptr::operator*())");
|
||||||
ox_assert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())");
|
oxAssert(valid(), "Invalid pointer dereference. (ox::fs::Ptr::operator*())");
|
||||||
return *static_cast<T>(this);
|
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>
|
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) {
|
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
|
// do some sanity checks before assuming this is valid
|
||||||
|
12
deps/ox/src/ox/fs/test/tests.cpp
vendored
12
deps/ox/src/ox/fs/test/tests.cpp
vendored
@ -341,8 +341,8 @@ map<string, int(*)(string)> tests = {
|
|||||||
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
||||||
err |= !(list->malloc(50).valid());
|
err |= !(list->malloc(50).valid());
|
||||||
auto first = list->firstItem();
|
auto first = list->firstItem();
|
||||||
ox_assert(first.valid(), "NodeBuffer::insert: Could not access first item");
|
oxAssert(first.valid(), "NodeBuffer::insert: Could not access first item");
|
||||||
ox_assert(first->size() == 50, "NodeBuffer::insert: First item size invalid");
|
oxAssert(first->size() == 50, "NodeBuffer::insert: First item size invalid");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -352,14 +352,14 @@ map<string, int(*)(string)> tests = {
|
|||||||
constexpr auto buffLen = 5000;
|
constexpr auto buffLen = 5000;
|
||||||
constexpr auto str1 = "Hello, World!";
|
constexpr auto str1 = "Hello, World!";
|
||||||
constexpr auto str1Len = ox_strlen(str1);
|
constexpr auto str1Len = ox_strlen(str1);
|
||||||
constexpr auto str2 = "Hello, World!";
|
constexpr auto str2 = "Hello, Moon!";
|
||||||
constexpr auto str2Len = ox_strlen(str2);
|
constexpr auto str2Len = ox_strlen(str2);
|
||||||
uint8_t buff[buffLen];
|
uint8_t buff[buffLen];
|
||||||
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
||||||
ox::fs::FileStore32 fileStore(list, buffLen);
|
ox::fs::FileStore32 fileStore(list, buffLen);
|
||||||
ox_assert(fileStore.format() == 0, "FileStore::format failed.");
|
oxAssert(fileStore.format() == 0, "FileStore::format failed.");
|
||||||
ox_assert(fileStore.write(4, (void*) str1, str1Len, 1) == 0, "FileStore::write 1 failed.");
|
oxAssert(fileStore.write(4, (void*) str1, str1Len, 1) == 0, "FileStore::write 1 failed.");
|
||||||
ox_assert(fileStore.write(5, (void*) str2, str2Len, 1) == 0, "FileStore::write 2 failed.");
|
oxAssert(fileStore.write(5, (void*) str2, str2Len, 1) == 0, "FileStore::write 2 failed.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user