#pragma once
#include <whiteout/common_types.h>
#include <whiteout/compatibility.h>
#include <whiteout/database/schema.h>
#include <whiteout/database/types.h>
#include <whiteout/database/value.h>
#include <memory>
#include <span>
#include <string>
#include <string_view>
#include <vector>
namespace whiteout::database {
class Table;
class TableData;
class Row {
public:
Row() = default;
bool valid() const noexcept {
return data_ != nullptr;
}
explicit operator bool() const noexcept {
return valid();
}
u32 id() const;
u32 index() const {
return index_;
}
u32 section() const;
bool isCopy() const;
bool isSparse() const;
bool isEncrypted() const;
std::optional<u32> relationId() const;
std::span<const u8> raw() const;
u64 getUInt(u32 field, u32 arrayIndex = 0) const;
i64 getInt(u32 field, u32 arrayIndex = 0) const;
f32 getFloat(u32 field, u32 arrayIndex = 0) const;
std::string_view getString(u32 field, u32 arrayIndex = 0) const;
Value value(u32 column, u32 arrayIndex = 0) const;
Value value(std::string_view column, u32 arrayIndex = 0) const;
std::string_view locString(std::string_view column, Locale locale = Locale::enUS) const;
private:
friend class Table;
Row(const TableData* data, u32 index) : data_(data), index_(index) {}
const TableData* data_ = nullptr;
u32 index_ = 0;
};
class Table {
public:
Table();
~Table();
Table(const Table&) = delete;
Table& operator=(const Table&) = delete;
Table(Table&&) noexcept;
Table& operator=(Table&&) noexcept;
explicit operator bool() const noexcept {
return data_ != nullptr;
}
const TableInfo& info() const;
const std::vector<FieldInfo>& fields() const;
const std::vector<SectionInfo>& sections() const;
size_t rowCount() const;
Row row(size_t index) const;
std::optional<Row> findById(u32 id) const;
const std::vector<u32>& ids() const;
bool bind(const Schema& schema, std::vector<std::string>* issues = nullptr);
const Schema* schema() const;
private:
friend class Parser;
std::unique_ptr<TableData> data_;
};
}