diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-03-08 11:35:54 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-03-08 11:35:54 +1100 |
| commit | 4887f3789817f87bf1272af0b52684e3364270c2 (patch) | |
| tree | 945eb707ab4a0f6f0a6632dbb732dcc2ee2b39a8 /src/database/include/table_reader.hpp | |
| parent | d01f1bee1082840fdf50aa7ddd36dbcbff286d7e (diff) | |
| download | tangara-fw-4887f3789817f87bf1272af0b52684e3364270c2.tar.gz | |
add leveldb
Diffstat (limited to 'src/database/include/table_reader.hpp')
| -rw-r--r-- | src/database/include/table_reader.hpp | 53 |
1 files changed, 53 insertions, 0 deletions
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 <string> + +#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<DatabaseEntry, ReadError>; + + template <typename T> + auto ReadColumnOffsetAtIndex(Column<T> col, Index_t index) + -> cpp::result<IndexOffset_t, ReadError>; + + template <typename T> + auto ParseColumnAtIndex(Column<T> col, Index_t index) + -> cpp::result<T, ReadError> { + return ReadColumnOffsetAtIndex(col, index).map([&](IndexOffset_t offset) { + return ReadColumnAtOffset(col, offset); + }); + } + + template <typename T> + auto ParseColumnAtOffset(Column<T> col, IndexOffset_t offset) + -> cpp::result<T, ReadError> { + return ReadDataAtOffset(col.Filename(), offset) + .flat_map([&](cpp::span<std::byte> 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<std::byte>; +}; + +} // namespace database |
