4#include "include/column_data/column_data.h"
5#include "include/database/database_version.h"
6#include "include/tables/abstract_table.h"
17template<
class T_ColumnData>
18concept ColumnData = std::derived_from<T_ColumnData, ehm_dal::column_data::ColumnData>
19 || std::is_same_v<ehm_dal::column_data::ColumnData, T_ColumnData>;
21template<
class T_AbstractIdTableItem, ColumnData T_ColumnData = ehm_dal::column_data::ColumnData>
28 const qint16 minimum_supported_database_version = TableAttributes::NO_DATABASE_VERSION);
34 bool insertRows(qint32 row, qint32 count,
const QModelIndex &parent = QModelIndex())
override;
37 inline QString modelName()
const override {
return QStringLiteral(
"Game standard table"); }
38 inline constexpr AbstractBaseModel::AbstractTableModelType modelType()
const override
40 return AbstractBaseModel::AbstractTableModelType::GameTable;
44 inline virtual qsizetype junkDataPrefixSize()
const {
return junk_data_prefix_.size(); }
49 QByteArray junk_data_prefix_;
57template<
class T_AbstractIdTableItem, ColumnData T_ColumnData>
58GameTable<T_AbstractIdTableItem, T_ColumnData>::GameTable(
59 const QString &table_name,
62 const qint16 minimum_supported_database_version)
63 : AbstractTable(table_name,
67 minimum_supported_database_version)
74template<
class T_AbstractIdTableItem, ColumnData T_ColumnData>
79 if (table_attributes_.minimumSupportedDatabaseVersion() > database_version.
version()) {
80 qDebug().noquote() << QStringLiteral(
81 "Skipped table: %L1 (Min DB version %2 | Actual DB version %3)")
82 .arg(table_attributes_.name())
83 .arg(table_attributes_.minimumSupportedDatabaseVersion())
84 .arg(database_version.
version());
89 const auto junk_data_prefix_size{junkDataPrefixSize()};
90 if (junk_data_prefix_size > 0) {
91 junk_data_prefix_.resize(junk_data_prefix_size);
92 in.readRawData(junk_data_prefix_.data(), junk_data_prefix_size);
97 const auto record_count{table_attributes_.readTableHeader(in)};
99 qDebug().noquote() << QStringLiteral(
"Reading table: %L1 -> %L2 record(s)")
100 .arg(table_attributes_.name())
104 for (quint32 i = 0; i < record_count; ++i) {
105 auto item{std::make_unique<T_AbstractIdTableItem>()};
106 item->read(in, database_version);
108 data_.emplace_back(std::move(item));
112 qWarning().noquote() << QStringLiteral(
"%L1 error(s) encountered when reading %2")
114 .arg(table_attributes_.name());
116 return error_count == 0;
123template<
class T_AbstractIdTableItem, ColumnData T_ColumnData>
126 const QModelIndex &parent)
128 if (count <= 0 || row < 0 || row >
static_cast<qint32
>(this->data_.size()))
131 beginInsertRows(parent, row, row + count - 1);
133 for (
int i = 0; i < count; ++i) {
134 auto new_item{std::make_shared<T_AbstractIdTableItem>()};
135 new_item->alloc(
static_cast<qint32
>(this->data_.size()));
136 this->data_.insert(this->data_.begin() + row, std::move(new_item));
The DatabaseVersion class represents the database version number.
Definition: database_version.h:12
qint16 version() const
Returns the database version number.
Definition: database_version.h:27
The Table class represents a database table and provides access to rows of data.
Definition: abstract_table.h:29
Definition: game_table.h:23
bool readStream(QDataStream &in) override
Reads the table data from a QDataStream.
Definition: game_table.h:75
The GameTable class is a template sub-class of Table and is intended for use as a database table.
Definition: game_table.h:18
namespace ehm_dal::tables
Definition: column.h:4
TableType
The TableType enum denotes different types of database table.
Definition: table_type.h:12
TableIndex
The TableIndex enum represents the id number of each table within the database.
Definition: table_index.h:14