[ox/fs] Remove abstract FileStore class

This commit is contained in:
2018-09-01 21:53:50 -05:00
parent 6648d941c9
commit 1770c8a1e2
7 changed files with 193 additions and 221 deletions

View File

@@ -1,74 +0,0 @@
/*
* Copyright 2015 - 2018 gtalent2@gmail.com
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <ox/ptrarith/nodebuffer.hpp>
namespace ox::fs {
using InodeId_t = uint64_t;
using FsSize_t = std::size_t;
class FileStore {
public:
struct StatInfo {
InodeId_t inode = 0;
InodeId_t links = 0;
FsSize_t size = 0;
uint8_t fileType = 0;
};
virtual Error format() = 0;
virtual Error setSize(InodeId_t size) = 0;
virtual Error incLinks(InodeId_t id) = 0;
virtual Error decLinks(InodeId_t id) = 0;
virtual Error write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0) = 0;
/**
* @return error if the inode could not be removed or did not exist
*/
virtual Error remove(InodeId_t id) = 0;
virtual Error read(InodeId_t id, void *data, FsSize_t dataSize, std::size_t *size = nullptr) = 0;
virtual Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size = nullptr) = 0;
/**
* @return data section of the requested file
*/
virtual const ptrarith::Ptr<uint8_t, std::size_t> read(InodeId_t id) = 0;
virtual ValErr<StatInfo> stat(InodeId_t id) = 0;
virtual Error resize(std::size_t size, void *newBuff = nullptr) = 0;
virtual InodeId_t spaceNeeded(FsSize_t size) = 0;
virtual InodeId_t size() = 0;
virtual InodeId_t available() = 0;
/**
* @return a pointer to the buffer of the file system, or null if not
* applicable
*/
virtual uint8_t *buff() = 0;
virtual Error walk(Error(*cb)(uint8_t, uint64_t, uint64_t)) = 0;
virtual ValErr<InodeId_t> generateInodeId() = 0;
};
}

View File

@@ -10,10 +10,18 @@
#include <ox/ptrarith/nodebuffer.hpp>
#include "filestore.hpp"
namespace ox::fs {
using InodeId_t = uint64_t;
using FsSize_t = std::size_t;
struct StatInfo {
InodeId_t inode = 0;
InodeId_t links = 0;
FsSize_t size = 0;
uint8_t fileType = 0;
};
template<typename size_t>
struct __attribute__((packed)) FileStoreItem: public ptrarith::Item<size_t> {
ox::LittleEndian<size_t> id = 0;
@@ -43,7 +51,10 @@ struct __attribute__((packed)) FileStoreItem: public ptrarith::Item<size_t> {
template<typename size_t>
class FileStoreTemplate: public FileStore {
class FileStoreTemplate {
public:
using InodeId_t = size_t;
private:
using Item = FileStoreItem<size_t>;
@@ -51,6 +62,7 @@ class FileStoreTemplate: public FileStore {
using Buffer = ptrarith::NodeBuffer<size_t, FileStoreItem<size_t>>;
static constexpr InodeId_t ReservedInodeEnd = 100;
static constexpr auto MaxInode = MaxValue<size_t> / 2;
struct __attribute__((packed)) FileStoreData {
ox::LittleEndian<size_t> rootNode = 0;
@@ -63,23 +75,23 @@ class FileStoreTemplate: public FileStore {
public:
FileStoreTemplate(void *buff, size_t buffSize);
Error format() override;
Error format();
Error setSize(InodeId_t buffSize) override;
Error setSize(InodeId_t buffSize);
Error incLinks(InodeId_t id) override;
Error incLinks(InodeId_t id);
Error decLinks(InodeId_t id) override;
Error decLinks(InodeId_t id);
Error write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0) override;
Error write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0);
Error remove(InodeId_t id) override;
Error remove(InodeId_t id);
Error read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size) override;
Error read(InodeId_t id, void *data, FsSize_t dataSize, FsSize_t *size = nullptr);
Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size) override;
Error read(InodeId_t id, FsSize_t readStart, FsSize_t readSize, void *data, FsSize_t *size = nullptr);
const ptrarith::Ptr<uint8_t, std::size_t> read(InodeId_t id) override;
const ptrarith::Ptr<uint8_t, std::size_t> read(InodeId_t id);
/**
* Reads the "file" at the given id. You are responsible for freeing
@@ -93,24 +105,26 @@ class FileStoreTemplate: public FileStore {
*/
template<typename T>
Error read(InodeId_t id, FsSize_t readStart,
FsSize_t readSize, T *data,
FsSize_t *size);
FsSize_t readSize, T *data,
FsSize_t *size);
ValErr<StatInfo> stat(InodeId_t id) override;
ValErr<StatInfo> stat(InodeId_t id);
Error resize(std::size_t size, void *newBuff = nullptr) override;
Error resize(std::size_t size, void *newBuff = nullptr);
InodeId_t spaceNeeded(FsSize_t size) override;
InodeId_t spaceNeeded(FsSize_t size);
InodeId_t size() override;
InodeId_t size();
InodeId_t available() override;
InodeId_t available();
uint8_t *buff() override;
uint8_t *buff();
Error walk(Error(*cb)(uint8_t, uint64_t, uint64_t)) override;
Error walk(Error(*cb)(uint8_t, uint64_t, uint64_t));
ValErr<InodeId_t> generateInodeId() override;
ValErr<InodeId_t> generateInodeId();
bool valid() const;
private:
void compact();
@@ -165,8 +179,6 @@ class FileStoreTemplate: public FileStore {
bool canWrite(ItemPtr existing, size_t size);
bool valid() const;
};
template<typename size_t>
@@ -388,7 +400,7 @@ Error FileStoreTemplate<size_t>::resize(std::size_t size, void *newBuff) {
}
template<typename size_t>
ValErr<typename FileStoreTemplate<size_t>::StatInfo> FileStoreTemplate<size_t>::stat(InodeId_t id) {
ValErr<StatInfo> FileStoreTemplate<size_t>::stat(InodeId_t id) {
auto inode = find(id);
if (inode.valid()) {
return ValErr<StatInfo>({
@@ -402,17 +414,17 @@ ValErr<typename FileStoreTemplate<size_t>::StatInfo> FileStoreTemplate<size_t>::
}
template<typename size_t>
InodeId_t FileStoreTemplate<size_t>::spaceNeeded(FsSize_t size) {
typename FileStoreTemplate<size_t>::InodeId_t FileStoreTemplate<size_t>::spaceNeeded(FsSize_t size) {
return m_buffer->spaceNeeded(size);
}
template<typename size_t>
InodeId_t FileStoreTemplate<size_t>::size() {
typename FileStoreTemplate<size_t>::InodeId_t FileStoreTemplate<size_t>::size() {
return m_buffer->size();
}
template<typename size_t>
InodeId_t FileStoreTemplate<size_t>::available() {
typename FileStoreTemplate<size_t>::InodeId_t FileStoreTemplate<size_t>::available() {
return m_buffer->available();
}
@@ -430,7 +442,7 @@ Error FileStoreTemplate<size_t>::walk(Error(*cb)(uint8_t, uint64_t, uint64_t)) {
}
template<typename size_t>
ValErr<InodeId_t> FileStoreTemplate<size_t>::generateInodeId() {
ValErr<typename FileStoreTemplate<size_t>::InodeId_t> FileStoreTemplate<size_t>::generateInodeId() {
auto fsData = fileStoreData();
if (fsData) {
for (auto i = 0; i < 100; i++) {