From 4887f3789817f87bf1272af0b52684e3364270c2 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 8 Mar 2023 11:35:54 +1100 Subject: add leveldb --- src/database/include/table_reader.hpp | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/database/include/table_reader.hpp (limited to 'src/database/include/table_reader.hpp') diff --git a/src/database/include/table_reader.hpp b/src/database/include/table_reader.hpp new file mode 100644 index 00000000..9f7cc4ee --- /dev/null +++ b/src/database/include/table_reader.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include + +#include "result.hpp" +#include "span.hpp" + +#include "table.hpp" + +namespace database { + +class TableReader { + public: + enum ReadError { + OUT_OF_RANGE, + IO_ERROR, + PARSE_ERROR, + }; + + auto ReadEntryAtIndex(Index_t index) -> cpp::result; + + template + auto ReadColumnOffsetAtIndex(Column col, Index_t index) + -> cpp::result; + + template + auto ParseColumnAtIndex(Column col, Index_t index) + -> cpp::result { + return ReadColumnOffsetAtIndex(col, index).map([&](IndexOffset_t offset) { + return ReadColumnAtOffset(col, offset); + }); + } + + template + auto ParseColumnAtOffset(Column col, IndexOffset_t offset) + -> cpp::result { + return ReadDataAtOffset(col.Filename(), offset) + .flat_map([&](cpp::span data) { + auto res = = col.ParseValue(data); + if (res) { + return *res; + } else { + return cpp::fail(PARSE_ERROR); + } + }); + } + + private: + auto ReadDataAtOffset(std::string filename, IndexOffset_t offset) + -> cpp::span; +}; + +} // namespace database -- cgit v1.2.3