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;
|
||||
#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);
|
||||
uint8_t *it = &(inode->getData()[readStart]);
|
||||
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;
|
||||
for (size_t i = 0; i < sizeof(T); i++) {
|
||||
((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:
|
||||
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
|
||||
|
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);
|
||||
err |= !(list->malloc(50).valid());
|
||||
auto first = list->firstItem();
|
||||
ox_assert(first.valid(), "NodeBuffer::insert: Could not access first item");
|
||||
ox_assert(first->size() == 50, "NodeBuffer::insert: First item size invalid");
|
||||
oxAssert(first.valid(), "NodeBuffer::insert: Could not access first item");
|
||||
oxAssert(first->size() == 50, "NodeBuffer::insert: First item size invalid");
|
||||
return err;
|
||||
}
|
||||
},
|
||||
@ -352,14 +352,14 @@ map<string, int(*)(string)> tests = {
|
||||
constexpr auto buffLen = 5000;
|
||||
constexpr auto str1 = "Hello, World!";
|
||||
constexpr auto str1Len = ox_strlen(str1);
|
||||
constexpr auto str2 = "Hello, World!";
|
||||
constexpr auto str2 = "Hello, Moon!";
|
||||
constexpr auto str2Len = ox_strlen(str2);
|
||||
uint8_t buff[buffLen];
|
||||
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
||||
ox::fs::FileStore32 fileStore(list, buffLen);
|
||||
ox_assert(fileStore.format() == 0, "FileStore::format failed.");
|
||||
ox_assert(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.format() == 0, "FileStore::format failed.");
|
||||
oxAssert(fileStore.write(4, (void*) str1, str1Len, 1) == 0, "FileStore::write 1 failed.");
|
||||
oxAssert(fileStore.write(5, (void*) str2, str2Len, 1) == 0, "FileStore::write 2 failed.");
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user