Add missing read to new FileStore

This commit is contained in:
Gary Talent 2018-03-15 19:32:40 -05:00
parent 2afef8a741
commit 381c739e46
7 changed files with 59 additions and 22 deletions

View File

@ -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
}

View File

@ -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++);

View File

@ -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;

View File

@ -10,6 +10,7 @@
namespace ox::fs {
template class FileStoreTemplate<uint16_t>;
template class FileStoreTemplate<uint32_t>;
}

View File

@ -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>;
}

View File

@ -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

View File

@ -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;
}
},