#ifndef CRUDMODEL_H #define CRUDMODEL_H #include "BaseTableModel.h" #include "ASyncDBConnection.h" #include "PgClass.h" #include "Pgsql_Connection.h" #include #include #include class PgConstraint; class OpenDatase; /** * @brief The CrudModel class * * Features * - order by one or more user selectable columns * - user filter condition * - user limit and offset * - hide columns (will not be retrieved can greatly speed up things when you disable wide columns) * - can use foreign keys to display dropdown * * How to load data? * - 2D array of QVariants won't be efficient * - 2D array of strings * - We do know the type of a single column is fixed * - Keep data in Result and only load data in replacement rows * std::string has short string optimization so this probably means * that a two dimensional array of std::string objects could actually be quite efficient! */ class CrudModel: public BaseTableModel { Q_OBJECT public: CrudModel(); ~CrudModel(); QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; void setData(std::shared_ptr db, const PgClass &table); // Basic functionality: int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; protected: virtual Oid getType(int column) const override; virtual QVariant getData(const QModelIndex &index) const override; private: std::shared_ptr m_database; PgClass m_table; boost::optional m_primaryKey; ASyncDBConnection m_dbConn; using RowData = std::vector; using RowDataPtr = std::unique_ptr; /** Choosen for a vector of pointers while vector is relatively slow with insertion and removal in the middle * I hope the small size of the elements will make this not much of an issue while the simple linear and sequential * nature of a vector will keep memory allocation fairly efficient. using RowList = std::vector; }; #endif // CRUDMODEL_H