From b3193cf1c6a491f231de033ff71d83569efac721 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Tue, 18 Jun 2019 20:41:14 +0430 Subject: [PATCH 1/2] some shared pointer [skip ci] --- include/Nut | 2 + include/SqlModel | 1 + include/TableModel | 1 + include/header_copier | 4 +- include/nut.h | 3 +- include/sqlmodel.h | 1 + include/tablemodel.h | 1 + src/defines.h | 169 +++++++++++++++++++++++++----------------- src/query.h | 76 ++++++++++++++++--- src/sqlmodel.cpp | 67 ++++++++++++++++- src/sqlmodel.h | 34 ++++++++- 11 files changed, 276 insertions(+), 83 deletions(-) create mode 100644 include/SqlModel create mode 100644 include/TableModel mode change 100644 => 100755 include/header_copier create mode 100644 include/sqlmodel.h create mode 100644 include/tablemodel.h diff --git a/include/Nut b/include/Nut index 5b89c95..c5cf95c 100644 --- a/include/Nut +++ b/include/Nut @@ -1,5 +1,7 @@ #include "../src/table.h" #include "../src/database.h" +#include "../src/sqlmodel.h" #include "../src/tableset.h" +#include "../src/tablemodel.h" #include "../src/query.h" diff --git a/include/SqlModel b/include/SqlModel new file mode 100644 index 0000000..c15f192 --- /dev/null +++ b/include/SqlModel @@ -0,0 +1 @@ +#include "../src/sqlmodel.h" diff --git a/include/TableModel b/include/TableModel new file mode 100644 index 0000000..3bc108b --- /dev/null +++ b/include/TableModel @@ -0,0 +1 @@ +#include "../src/tablemodel.h" diff --git a/include/header_copier b/include/header_copier old mode 100644 new mode 100755 index e228c19..e2ef200 --- a/include/header_copier +++ b/include/header_copier @@ -6,8 +6,7 @@ namespace_name="nut" ns=$(echo $namespace_name|awk '{print tolower($0)}') Ns="Nut" NS=$(echo $namespace_name|awk '{print toupper($0)}') -echo $NS -exit + create_sub_folder=true @@ -38,5 +37,6 @@ while read line; do echo "#include \"../$src_dir/$header.h\"" >> "$Ns" echo "#include \"../$src_dir/$header.h\"" >> "$ns.h" fi + echo $Ns done <&3 exec 3<&- diff --git a/include/nut.h b/include/nut.h index 2dfb0b9..c5cf95c 100644 --- a/include/nut.h +++ b/include/nut.h @@ -1,6 +1,7 @@ #include "../src/table.h" #include "../src/database.h" +#include "../src/sqlmodel.h" #include "../src/tableset.h" -#include "../src/dbgeography.h" +#include "../src/tablemodel.h" #include "../src/query.h" diff --git a/include/sqlmodel.h b/include/sqlmodel.h new file mode 100644 index 0000000..c15f192 --- /dev/null +++ b/include/sqlmodel.h @@ -0,0 +1 @@ +#include "../src/sqlmodel.h" diff --git a/include/tablemodel.h b/include/tablemodel.h new file mode 100644 index 0000000..3bc108b --- /dev/null +++ b/include/tablemodel.h @@ -0,0 +1 @@ +#include "../src/tablemodel.h" diff --git a/src/defines.h b/src/defines.h index cd9bf42..86a96a3 100644 --- a/src/defines.h +++ b/src/defines.h @@ -45,6 +45,83 @@ Q_CLASSINFO(__nut_NAME_PERFIX type #name #value, \ type "\n" #name "\n" value) +#define NUT_FIELD_PERFIX +#define NUT_FIELD_POSTFIX Field + +// Database +#define NUT_DB_VERSION(version) \ + NUT_INFO(__nut_DB_VERSION, version, 0) + +#define NUT_DECLARE_TABLE(type, name) \ + NUT_INFO(__nut_TABLE, type, name) \ + Q_PROPERTY(NUT_WRAP_NAMESPACE(TableSet) name READ name) \ + NUT_WRAP_NAMESPACE(TableSet) *m_##name; \ + public: \ + static const type *_##name; \ + NUT_WRAP_NAMESPACE(TableSet) *name() const \ + { return m_##name; } \ + private: + +//Table +#define NUT_DECLARE_FIELD(type, name, read, write) \ + Q_PROPERTY(type name READ read WRITE write) \ + NUT_INFO(__nut_FIELD, name, 0) \ + type m_##name; \ +public: \ + static NUT_WRAP_NAMESPACE(FieldPhrase)& name ## Field(){ \ + static NUT_WRAP_NAMESPACE(FieldPhrase) f = \ + NUT_WRAP_NAMESPACE(FieldPhrase) \ + (staticMetaObject.className(), #name); \ + return f; \ + } \ + type read() const{ \ + return m_##name; \ + } \ + void write(type name){ \ + m_##name = name; \ + propertyChanged(#name); \ + } + +#define NUT_FOREGION_KEY(type, keytype, name, read, write) \ + Q_PROPERTY(Nut::Row name READ read WRITE write) \ + NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id) \ + NUT_INFO(__nut_FOREGION_KEY, name, type) \ + Nut::Row m_##name; \ +public: \ + Nut::Row read() const { return m_##name ; } \ + void write(Nut::Row name){ \ + m_##name = name; \ + } + +#define NUT_DECLARE_CHILD_TABLE(type, n) \ + private: \ + NUT_WRAP_NAMESPACE(TableSet) *m_##n; \ + public: \ + static type *n##Table(); \ + NUT_WRAP_NAMESPACE(TableSet) *n(); + +#define NUT_IMPLEMENT_CHILD_TABLE(class, type, n) \ + type *class::n##Table(){ \ + static auto f = new type(); \ + return f; \ + } \ + NUT_WRAP_NAMESPACE(TableSet) *class::n(){ \ + return m_##n; \ + } + +#define NUT_FIELD(name) NUT_INFO(__nut_FIELD, name, 0) +#define NUT_PRIMARY_KEY(x) NUT_INFO(__nut_PRIMARY_KEY, x, 0) +#define NUT_AUTO_INCREMENT(x) NUT_INFO(__nut_AUTO_INCREMENT, x, 0) +#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_INFO(__nut_PRIMARY_KEY_AI, x, 0) +#define NUT_DISPLAY_NAME(field, name) NUT_INFO(__nut_DISPLAY, field, name) +#define NUT_UNIQUE(x) NUT_INFO(__nut_UNIQUE, x, 0) +#define NUT_LEN(field, len) NUT_INFO(__nut_LEN, field, len) +#define NUT_DEFAULT_VALUE(x, n) NUT_INFO(__nut_DEFAULT_VALUE, x, n) +#define NUT_NOT_NULL(x) NUT_INFO(__nut_NOT_NULL, x, 1) +#define NUT_INDEX(name, field, order) + +NUT_BEGIN_NAMESPACE + inline bool nutClassInfo(const QMetaClassInfo &classInfo, QString &type, QString &name, QVariant &value) { @@ -117,79 +194,37 @@ inline bool nutClassInfoInt(const QMetaClassInfo &classInfo, } } -#define NUT_FIELD_PERFIX -#define NUT_FIELD_POSTFIX Field +#ifdef NUT_SHARED_POINTER +template +using RowList = QList>; -// Database -#define NUT_DB_VERSION(version) \ - NUT_INFO(__nut_DB_VERSION, version, 0) +template +using RowSet = QSet>; -#define NUT_DECLARE_TABLE(type, name) \ - NUT_INFO(__nut_TABLE, type, name) \ - Q_PROPERTY(NUT_WRAP_NAMESPACE(TableSet) name READ name) \ - NUT_WRAP_NAMESPACE(TableSet) *m_##name; \ - public: \ - static const type *_##name; \ - NUT_WRAP_NAMESPACE(TableSet) *name() const \ - { return m_##name; } \ - private: +template +using Row = QSharedPointer; -//Table -#define NUT_DECLARE_FIELD(type, name, read, write) \ - Q_PROPERTY(type name READ read WRITE write) \ - NUT_INFO(__nut_FIELD, name, 0) \ - type m_##name; \ -public: \ - static NUT_WRAP_NAMESPACE(FieldPhrase)& name ## Field(){ \ - static NUT_WRAP_NAMESPACE(FieldPhrase) f = \ - NUT_WRAP_NAMESPACE(FieldPhrase) \ - (staticMetaObject.className(), #name); \ - return f; \ - } \ - type read() const{ \ - return m_##name; \ - } \ - void write(type name){ \ - m_##name = name; \ - propertyChanged(#name); \ - } +template +inline Row create() { + return QSharedPointer(new T); +} -#define NUT_FOREGION_KEY(type, keytype, name, read, write) \ - Q_PROPERTY(type* name READ read WRITE write) \ - NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id) \ - NUT_INFO(__nut_FOREGION_KEY, name, type) \ - type *m_##name; \ -public: \ - type *read() const { return m_##name ; } \ - void write(type *name){ \ - m_##name = name; \ - } +#else +template +using RowList = QList; -#define NUT_DECLARE_CHILD_TABLE(type, n) \ - private: \ - NUT_WRAP_NAMESPACE(TableSet) *m_##n; \ - public: \ - static type *n##Table(); \ - NUT_WRAP_NAMESPACE(TableSet) *n(); +template +using RowSet = QSet; -#define NUT_IMPLEMENT_CHILD_TABLE(class, type, n) \ - type *class::n##Table(){ \ - static auto f = new type(); \ - return f; \ - } \ - NUT_WRAP_NAMESPACE(TableSet) *class::n(){ \ - return m_##n; \ - } +template +using Row = T*; -#define NUT_FIELD(name) NUT_INFO(__nut_FIELD, name, 0) -#define NUT_PRIMARY_KEY(x) NUT_INFO(__nut_PRIMARY_KEY, x, 0) -#define NUT_AUTO_INCREMENT(x) NUT_INFO(__nut_AUTO_INCREMENT, x, 0) -#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_INFO(__nut_PRIMARY_KEY_AI, x, 0) -#define NUT_DISPLAY_NAME(field, name) NUT_INFO(__nut_DISPLAY, field, name) -#define NUT_UNIQUE(x) NUT_INFO(__nut_UNIQUE, x, 0) -#define NUT_LEN(field, len) NUT_INFO(__nut_LEN, field, len) -#define NUT_DEFAULT_VALUE(x, n) NUT_INFO(__nut_DEFAULT_VALUE, x, n) -#define NUT_NOT_NULL(x) NUT_INFO(__nut_NOT_NULL, x, 1) -#define NUT_INDEX(name, field, order) +template +inline Row create() { + return new T; +} +#endif + +NUT_END_NAMESPACE #endif // SYNTAX_DEFINES_H diff --git a/src/query.h b/src/query.h index 4a31cd9..e4c0c9a 100644 --- a/src/query.h +++ b/src/query.h @@ -29,7 +29,11 @@ #include #include #include -#include +#include + +#ifdef NUT_SHARED_POINTER +#include +#endif #include "table.h" #include "query_p.h" @@ -40,6 +44,7 @@ #include "querybase_p.h" #include "phrase.h" #include "tablemodel.h" +#include "sqlmodel.h" NUT_BEGIN_NAMESPACE @@ -52,6 +57,14 @@ template bool m_autoDelete; public: +//#ifdef NUT_SHARED_POINTER +// typedef QList> RowList; +// typedef QSharedPointer Row; +//#else +// typedef QList RowList; +// typedef T* Row; +//#endif + explicit Query(Database *database, TableSetBase *tableSet, bool autoDelete); ~Query(); @@ -76,8 +89,8 @@ public: Query *setWhere(const ConditionalPhrase &ph); //data selecting - T *first(); - QList toList(int count = -1); + Row first(); + RowList toList(int count = -1); template QList select(const FieldPhrase f); @@ -98,6 +111,7 @@ public: QSqlQueryModel *toModel(); void toModel(QSqlQueryModel *model); + void toModel(SqlModel *model); //debug purpose QString sqlCommand() const; @@ -161,11 +175,11 @@ Q_OUTOFLINE_TEMPLATE Query::~Query() } template -Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) +Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) { Q_UNUSED(count); Q_D(Query); - QList returnList; + RowList returnList; d->select = "*"; d->sql = d->database->sqlGenertor()->selectCommand( @@ -285,13 +299,17 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) Table *table; if (data.table->className() == d->className) { table = new T(); - table->setParentTableSet(d->tableSet); +#ifdef NUT_SHARED_POINTER + auto shp = QSharedPointer(qobject_cast(table)); + returnList.append(shp); +#else returnList.append(dynamic_cast(table)); +#endif + table->setParentTableSet(d->tableSet); } else { const QMetaObject *childMetaObject = QMetaType::metaObjectForType(data.table->typeId()); table = qobject_cast(childMetaObject->newInstance()); - if (!table) qFatal("Could not create instance of %s", qPrintable(data.table->name())); @@ -323,8 +341,11 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) data.lastRow = table; } //while } // while + +#ifndef NUT_SHARED_POINTER if (m_autoDelete) deleteLater(); +#endif return returnList; } @@ -357,11 +378,11 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) } template -Q_OUTOFLINE_TEMPLATE T *Query::first() +Q_OUTOFLINE_TEMPLATE Row Query::first() { skip(0); take(1); - QList list = toList(1); + RowList list = toList(1); if (list.count()) return list.first(); @@ -617,6 +638,43 @@ Q_OUTOFLINE_TEMPLATE void Query::toModel(QSqlQueryModel *model) } } +template +Q_OUTOFLINE_TEMPLATE void Query::toModel(SqlModel *model) +{ + Q_D(Query); + + d->sql = d->database->sqlGenertor()->selectCommand( + d->tableName, + d->fieldPhrase, + d->wherePhrase, d->orderPhrase, d->relations, + d->skip, d->take); + + model->setTable(toList()); + /* + DatabaseModel dbModel = d->database->model(); + model->setQuery(d->sql, d->database->database()); + + int fieldIndex = 0; + + if (d->fieldPhrase.data.count()) { + foreach (const PhraseData *pd, d->fieldPhrase.data) { + QString displayName = dbModel.tableByClassName(pd->className) + ->field(pd->fieldName)->displayName; + + model->setHeaderData(fieldIndex++, + Qt::Horizontal, + displayName); + } + } else { + TableModel *tbl = d->database->model().tableByName(d->tableName); + foreach (FieldModel *f, tbl->fields()) { + model->setHeaderData(fieldIndex++, + Qt::Horizontal, + f->displayName); + } + }*/ +} + template Q_OUTOFLINE_TEMPLATE QString Query::sqlCommand() const { diff --git a/src/sqlmodel.cpp b/src/sqlmodel.cpp index ea2b27e..7ee2dbd 100644 --- a/src/sqlmodel.cpp +++ b/src/sqlmodel.cpp @@ -25,17 +25,29 @@ #include "table.h" #include "sqlmodel_p.h" #include "sqlmodel.h" +#include "query.h" NUT_BEGIN_NAMESPACE +//SqlModel::SqlModel(Query *q) : QAbstractItemModel(q.) +//{ + +//} + +void SqlModel::setRenderer(const std::function &renderer) +{ + _renderer = renderer; +} + SqlModel::SqlModel(Database *database, TableSetBase *tableSet, QObject *parent) : - QAbstractTableModel(parent) + QAbstractTableModel(parent), d_ptr(new SqlModelPrivate(this)), _renderer(nullptr) { Q_D(SqlModel); d->model = database->model() .tableByClassName(tableSet->childClassName()); d->tableName = d->model->name(); + // setQuery("SELECT * FROM " + d->tableName, database->databaseName()); } @@ -63,8 +75,12 @@ QVariant SqlModel::data(const QModelIndex &index, int role) const return QVariant("-"); if (role == Qt::DisplayRole) { - Table *t = d->rows.at(index.row()); - return t->property(d->model->field(index.column())->name.toLocal8Bit().data()); + Row
t = d->rows.at(index.row()); + QVariant v = t->property(d->model->field(index.column())->name.toLocal8Bit().data()); +// emit beforeShowText(index.column(), v); + if (_renderer != nullptr) + v = _renderer(index.column(), v); + return v; // LogData *d = dataList.at(index.row()); // switch (index.column()) { @@ -86,4 +102,49 @@ QVariant SqlModel::data(const QModelIndex &index, int role) const return QVariant(); } +void SqlModel::setRows(RowList
rows) +{ + Q_D(SqlModel); + beginRemoveRows(QModelIndex(), 0, d->rows.count()); + d->rows.clear(); + endRemoveRows(); + beginInsertRows(QModelIndex(), 0, rows.count()); + d->rows = rows; + endInsertRows(); +} + +void SqlModel::append(Row
table) +{ + Q_D(SqlModel); + beginInsertRows(QModelIndex(), d->rows.count(), d->rows.count()); + d->rows.append(table); + endInsertRows(); +} + +//void SqlModel::append(Table *table) +//{ +// append(TableType
::Row(table)); +//} + +QVariant SqlModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + Q_D(const SqlModel); + return d->model->field(section)->displayName; + } + return QAbstractItemModel::headerData(section, orientation, role); +} + +Table *SqlModel::at(const int &i) const +{ + Q_D(const SqlModel); + return d->rows.at(i).data(); +} + +SqlModelPrivate::SqlModelPrivate(SqlModel *parent) : q_ptr(parent) +{ + +} + + NUT_END_NAMESPACE diff --git a/src/sqlmodel.h b/src/sqlmodel.h index e8c2590..cc51b82 100644 --- a/src/sqlmodel.h +++ b/src/sqlmodel.h @@ -23,6 +23,8 @@ #include #include "defines.h" +#include +#include NUT_BEGIN_NAMESPACE @@ -31,22 +33,52 @@ class TableSetBase; class SqlModelPrivate; class Table; class TableModel; -class SqlModel : public QAbstractTableModel + +class NUT_EXPORT SqlModel : public QAbstractTableModel { Q_OBJECT + std::function _renderer; + public: +// explicit SqlModel(Query *q); explicit SqlModel(Database *database, TableSetBase *tableSet, QObject *parent = Q_NULLPTR); int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; + template + void setTable(RowList rows); + + void setRows(RowList
rows); + void append(Row
table); +// void append(Table *table); + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + Table *at(const int &i) const; + + void setRenderer(const std::function &renderer); + private: SqlModelPrivate *d_ptr; Q_DECLARE_PRIVATE(SqlModel) + +signals: + void beforeShowText(int col, QVariant &value); }; +template +Q_OUTOFLINE_TEMPLATE void SqlModel::setTable(RowList rows) +{ + Q_D(SqlModel); + + RowList
tab; + foreach (auto t, rows) + tab.append(t); + setRows(tab); +} + + NUT_END_NAMESPACE #endif // SQLMODEL_H From 251fc50d533a042b2153017adfb8babed96ec942 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 19 Jun 2019 09:47:10 +0430 Subject: [PATCH 2/2] recover sql model invalid line [skip ci] --- src/sqlmodel.cpp | 4 ++-- src/sqlmodel.h | 2 +- src/sqlmodel_p.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sqlmodel.cpp b/src/sqlmodel.cpp index 7ee2dbd..153b892 100644 --- a/src/sqlmodel.cpp +++ b/src/sqlmodel.cpp @@ -135,10 +135,10 @@ QVariant SqlModel::headerData(int section, Qt::Orientation orientation, int role return QAbstractItemModel::headerData(section, orientation, role); } -Table *SqlModel::at(const int &i) const +Row
SqlModel::at(const int &i) const { Q_D(const SqlModel); - return d->rows.at(i).data(); + return d->rows.at(i); } SqlModelPrivate::SqlModelPrivate(SqlModel *parent) : q_ptr(parent) diff --git a/src/sqlmodel.h b/src/sqlmodel.h index cc51b82..3539576 100644 --- a/src/sqlmodel.h +++ b/src/sqlmodel.h @@ -55,7 +55,7 @@ public: void append(Row
table); // void append(Table *table); QVariant headerData(int section, Qt::Orientation orientation, int role) const; - Table *at(const int &i) const; + Row at(const int &i) const; void setRenderer(const std::function &renderer); diff --git a/src/sqlmodel_p.h b/src/sqlmodel_p.h index f359445..f3ec5c4 100644 --- a/src/sqlmodel_p.h +++ b/src/sqlmodel_p.h @@ -13,7 +13,7 @@ class SqlModelPrivate { SqlModel *q_ptr; Q_DECLARE_PUBLIC(SqlModel) public: - explicit SqlModelPrivate() = default; + explicit SqlModelPrivate(SqlModel *parent); QString tableName;