diff --git a/.vscode/ipch/38f51fe5930ec860/mmap_address.bin b/.vscode/ipch/38f51fe5930ec860/mmap_address.bin deleted file mode 100644 index f015e03..0000000 Binary files a/.vscode/ipch/38f51fe5930ec860/mmap_address.bin and /dev/null differ diff --git a/src/defines.h b/src/defines.h index 17d1032..9299611 100644 --- a/src/defines.h +++ b/src/defines.h @@ -102,14 +102,15 @@ public slots: Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \ public: \ Nut::Row read() const; \ - void write(Nut::Row name); \ + keytype read##Id() const; \ static NUT_WRAP_NAMESPACE(FieldPhrase)& name##Id ## Field(){ \ static NUT_WRAP_NAMESPACE(FieldPhrase) f = \ NUT_WRAP_NAMESPACE(FieldPhrase) \ (staticMetaObject.className(), #name); \ return f; \ } \ - keytype read##Id() const; \ +public slots: \ + void write(Nut::Row name); \ void write##Id(keytype name##Id); #define NUT_FOREIGN_KEY_IMPLEMENT(class, type, keytype, name, read, write) \ @@ -177,73 +178,69 @@ NUT_BEGIN_NAMESPACE inline bool nutClassInfo(const QMetaClassInfo &classInfo, QString &type, QString &name, QVariant &value) { - if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) return false; - } else { - QStringList parts = QString(classInfo.value()).split("\n"); - if (parts.count() != 3) - return false; - type = parts[0]; - name = parts[1]; - value = qVariantFromValue(parts[2]); - return true; - } + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; + + type = parts[0]; + name = parts[1]; + value = qVariantFromValue(parts[2]); + return true; } inline bool nutClassInfoString(const QMetaClassInfo &classInfo, QString &type, QString &name, QString &value) { - if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) return false; - } else { - QStringList parts = QString(classInfo.value()).split("\n"); - if (parts.count() != 3) - return false; - type = parts[0]; - name = parts[1]; - value = parts[2]; - return true; - } + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; + + type = parts[0]; + name = parts[1]; + value = parts[2]; + return true; } inline bool nutClassInfoBool(const QMetaClassInfo &classInfo, QString &type, QString &name, bool &value) { - if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) return false; - } else { - QStringList parts = QString(classInfo.value()).split("\n"); - if (parts.count() != 3) - return false; - QString buffer = parts[2].toLower(); - if (buffer != "true" && buffer != "false") - return false; + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; - type = parts[0]; - name = parts[1]; - value = (buffer == "true"); - return true; - } + QString buffer = parts[2].toLower(); + if (buffer != "true" && buffer != "false") + return false; + + type = parts[0]; + name = parts[1]; + value = (buffer == "true"); + return true; } inline bool nutClassInfoInt(const QMetaClassInfo &classInfo, QString &type, QString &name, bool &value) { - if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) return false; - } else { - QStringList parts = QString(classInfo.value()).split("\n"); - if (parts.count() != 3) - return false; - bool ok; - type = parts[0]; - name = parts[1]; - value = parts[2].toInt(&ok); - return ok; - } + + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; + bool ok; + type = parts[0]; + name = parts[1]; + value = parts[2].toInt(&ok); + return ok; } #ifdef NUT_SHARED_POINTER @@ -267,12 +264,12 @@ inline Row create(QObject *parent) { } template -inline T *get(T *row) { - return row; +inline Row createFrom(T *row) { + return QSharedPointer(row); } template -inline T *get(const QSharedPointer row) { - return row.data(); +inline Row createFrom(const QSharedPointer row) { + return row; } #else @@ -302,32 +299,6 @@ inline T *get(const QSharedPointer row) { #endif -//template -//struct ForeignKeyData { -// Nut::Row _table; -// T _id; - -// ForeignKeyData() : _table(nullptr) -// {} - -// void setTable(Nut::Row t) { -// _table = t; -// _id = t->primaryValue().value(); -// } -// Nut::Row table() const { -// return _table; -// } -// void setValue(const T& val) { -// _table = nullptr; -// _id = val; -// } -// T value() const { -// if (_table) -// return _table->primaryValue().value(); -// return _id; -// } -//}; - NUT_END_NAMESPACE #endif // SYNTAX_DEFINES_H diff --git a/src/generators/mysqlgenerator.cpp b/src/generators/mysqlgenerator.cpp index ea50b15..b46518f 100644 --- a/src/generators/mysqlgenerator.cpp +++ b/src/generators/mysqlgenerator.cpp @@ -178,7 +178,7 @@ QString MySqlGenerator::escapeValue(const QVariant &v) const // } // default: - return SqlGeneratorBase::escapeValue(v); + return SqlGeneratorBase::escapeValue(v); // } } @@ -306,19 +306,19 @@ QString MySqlGenerator::createConditionalPhrase(const PhraseData *d) const if (op == PhraseData::AddYears) return QString("DATE_ADD(%2, INTERVAL %1 YEAR)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMonths) + if (op == PhraseData::AddMonths) return QString("DATE_ADD(%2, INTERVAL %1 MONTH)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddDays) + if (op == PhraseData::AddDays) return QString("DATE_ADD(%2, INTERVAL %1 DAY)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddHours) + if (op == PhraseData::AddHours) return QString("DATE_ADD(%2, INTERVAL %1 HOUR)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMinutes) + if (op == PhraseData::AddMinutes) return QString("DATE_ADD(%2, INTERVAL %1 MINUTE)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddSeconds) + if (op == PhraseData::AddSeconds) return QString("DATE_ADD(%2, INTERVAL %1 SECOND)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); diff --git a/src/generators/mysqlgenerator.h b/src/generators/mysqlgenerator.h index 1609c81..95a0e98 100644 --- a/src/generators/mysqlgenerator.h +++ b/src/generators/mysqlgenerator.h @@ -29,7 +29,7 @@ NUT_BEGIN_NAMESPACE class MySqlGenerator : public SqlGeneratorBase { public: - explicit MySqlGenerator(Database *parent = 0); + explicit MySqlGenerator(Database *parent = nullptr); QString fieldType(FieldModel *field) override; QString escapeValue(const QVariant &v) const override; diff --git a/src/generators/postgresqlgenerator.cpp b/src/generators/postgresqlgenerator.cpp index 83bc2c9..3a468ac 100644 --- a/src/generators/postgresqlgenerator.cpp +++ b/src/generators/postgresqlgenerator.cpp @@ -344,22 +344,21 @@ QString PostgreSqlGenerator::createConditionalPhrase(const PhraseData *d) const if (op == PhraseData::AddYears) return QString("DATEADD(year, %1, %2)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMonths) + if (op == PhraseData::AddMonths) return QString("DATEADD(month, %1, %2)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddDays) + if (op == PhraseData::AddDays) return QString("DATEADD(day, %1, %2)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddHours) + if (op == PhraseData::AddHours) return QString("DATEADD(hour, %1, %2)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMinutes) + if (op == PhraseData::AddMinutes) return QString("DATEADD(minute, %1, %2)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddSeconds) + if (op == PhraseData::AddSeconds) return QString("DATEADD(second, %1, %2)") .arg(d->operand.toString(), createConditionalPhrase(d->left)); - } return SqlGeneratorBase::createConditionalPhrase(d); diff --git a/src/generators/postgresqlgenerator.h b/src/generators/postgresqlgenerator.h index bf637f1..3c1188c 100644 --- a/src/generators/postgresqlgenerator.h +++ b/src/generators/postgresqlgenerator.h @@ -29,7 +29,7 @@ NUT_BEGIN_NAMESPACE class PostgreSqlGenerator : public SqlGeneratorBase { private: - bool readInsideParentese(QString &ref, QString &out); + bool readInsideParentese(QString &text, QString &out); bool isPostGisType(const QVariant::Type &t) const; public: explicit PostgreSqlGenerator(Database *parent = nullptr); diff --git a/src/generators/sqlgeneratorbase_p.h b/src/generators/sqlgeneratorbase_p.h index a25d3ee..70aca87 100644 --- a/src/generators/sqlgeneratorbase_p.h +++ b/src/generators/sqlgeneratorbase_p.h @@ -160,7 +160,7 @@ protected: QString fromTableText(const QString &tableName, QString &joinClassName, QString &orderBy) const; // QString createWhere(QList &wheres); - void replaceTableNames(QString &command); + virtual void replaceTableNames(QString &command); void removeTableNames(QString &command); QString dateTimePartName(const PhraseData::Condition &op) const; }; diff --git a/src/generators/sqlservergenerator.cpp b/src/generators/sqlservergenerator.cpp index 0731b59..7558a03 100644 --- a/src/generators/sqlservergenerator.cpp +++ b/src/generators/sqlservergenerator.cpp @@ -167,11 +167,12 @@ QString SqlServerGenerator::escapeValue(const QVariant &v) const if (mid == QMetaType::QString || mid == QMetaType::QChar) return "N'" + v.toString() + "'"; - else if (mid == QMetaType::QPoint) { + if (mid == QMetaType::QPoint) { QPoint pt = v.toPoint(); return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( pt.y()); - } else if (mid == QMetaType::QPointF) { + } + if (mid == QMetaType::QPointF) { QPointF pt = v.toPointF(); return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( pt.y()); diff --git a/src/generators/sqlservergenerator.h b/src/generators/sqlservergenerator.h index 0935e21..dff5901 100644 --- a/src/generators/sqlservergenerator.h +++ b/src/generators/sqlservergenerator.h @@ -31,15 +31,15 @@ class SqlServerGenerator : public SqlGeneratorBase public: explicit SqlServerGenerator(Database *parent = nullptr); - QString masterDatabaseName(QString databaseName); + QString masterDatabaseName(QString databaseName) override; - QString fieldType(FieldModel *field); - QString diff(FieldModel *oldField, FieldModel *newField); + QString fieldType(FieldModel *field) override; + QString diff(FieldModel *oldField, FieldModel *newField) override; - QString escapeValue(const QVariant &v) const; - void appendSkipTake(QString &sql, int skip, int take); + QString escapeValue(const QVariant &v) const override; + void appendSkipTake(QString &sql, int skip, int take) override; - void replaceTableNames(QString &command); +// void replaceTableNames(QString &command) override; }; diff --git a/src/query.cpp b/src/query.cpp index 4ba466c..84c94e3 100644 --- a/src/query.cpp +++ b/src/query.cpp @@ -28,15 +28,20 @@ QueryPrivate::QueryPrivate(QueryBase *parent) : q_ptr(parent), } +QueryPrivate::~QueryPrivate() +{ + +} + /*! * \class Query * \brief This class hold a query. A query can be used for getting database rows, editing or deleting without row fetching. * A query can be used for getting data from database. * \code - * auto q = db.posts()->createQuery(); + * auto q = db.posts()->query(); * q->join(Post::commentsTable()); * q->orderBy(!Post::saveDateField() & Post::bodyField()); - * q->setWhere(Post::idField() > 5); + * q->where(Post::idField() > 5); * * auto posts = q->toList(); * \endcode @@ -54,7 +59,7 @@ QueryPrivate::QueryPrivate(QueryBase *parent) : q_ptr(parent), */ /*! - * \fn Query *Query::setWhere(WherePhrase where) + * \fn Query *Query::where(WherePhrase where) * Where phrase is a phrase using table's static field methods. * \code * q->setWhere(Post::idField() == 4 || Post::titleField().isNull()); diff --git a/src/query.h b/src/query.h index ca1a7f5..5088773 100644 --- a/src/query.h +++ b/src/query.h @@ -272,14 +272,14 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) // check if key value is changed if (data.lastKeyValue == q.value(data.keyFiledname)) { --p; - qDebug() << "key os not changed for" << data.keyFiledname; +// qDebug() << "key os not changed for" << data.keyFiledname; continue; } // check if master if current table has processed foreach (int m, data.masters) if (!checked[m]) { - qDebug() << "row is checked"; +// qDebug() << "row is checked"; continue; } @@ -288,66 +288,48 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) data.lastKeyValue = q.value(data.keyFiledname); //create table row - Table *table; - Row shp; + Row row; if (data.table->className() == d->className) { - table = new T(); + row = Nut::create(); #ifdef NUT_SHARED_POINTER - shp = QSharedPointer(qobject_cast(table)); - returnList.append(shp); - d->tableSet->add(shp); + returnList.append(row.objectCast()); #else returnList.append(dynamic_cast(table)); #endif - table->setParentTableSet(d->tableSet); + d->tableSet->add(row); + } else { + Table *table; const QMetaObject *childMetaObject = QMetaType::metaObjectForType(data.table->typeId()); table = qobject_cast
(childMetaObject->newInstance()); +// table = dynamic_cast
(QMetaType::create(data.table->typeId())); if (!table) qFatal("Could not create instance of %s", qPrintable(data.table->name())); - + row = createFrom(table); } QList childFields = data.table->fields(); foreach (FieldModel *field, childFields) - table->setProperty(field->name.toLatin1().data(), + row->setProperty(field->name.toLatin1().data(), d->database->sqlGenertor()->unescapeValue( field->type, q.value(data.table->name() + "." + field->name))); for (int i = 0; i < data.masters.count(); ++i) { int master = data.masters[i]; -#ifdef NUT_SHARED_POINTER - QString mName = QString("set%1").arg(levels[master].lastRow->metaObject()->className()); - QString type = QString("Nut::Row<%1>").arg(levels[master].lastRow->metaObject()->className()); - bool ok = table->metaObject()->invokeMethod(table, - mName.toLocal8Bit().data(), - QGenericArgument(type.toLatin1().data(), levels[master].lastRow)); -#else - bool ok = table->setProperty(data.masterFields[i].toLocal8Bit().data(), - QVariant::fromValue(levels[master].lastRow)); -#endif - - if (!ok) - qWarning("Unable to set property %s::%s", - table->metaObject()->className(), data.masterFields[i].toLocal8Bit().data()); - auto tableset = levels[master].lastRow->childTableSet( data.table->className()); - table->setParentTableSet(tableset); -#ifdef NUT_SHARED_POINTER - tableset->add(qSharedPointerCast
(shp)); -#endif + tableset->add(row); } - table->setStatus(Table::FeatchedFromDB); - table->setParent(this); - table->clear(); + row->setStatus(Table::FeatchedFromDB); + row->setParent(this); + row->clear(); //set last created row - data.lastRow = /*QSharedPointer
*/(table); + data.lastRow = row.data(); } //while } // while @@ -356,6 +338,7 @@ Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) deleteLater(); #endif return returnList; + } template diff --git a/src/query_p.h b/src/query_p.h index b0b3c4a..2b65dfb 100644 --- a/src/query_p.h +++ b/src/query_p.h @@ -39,7 +39,7 @@ class QueryPrivate : public QSharedData { public: explicit QueryPrivate(QueryBase *parent); - ~QueryPrivate() = default; + ~QueryPrivate(); QString sql; QString className; @@ -53,11 +53,6 @@ public: int take; PhraseList orderPhrase, fieldPhrase; ConditionalPhrase wherePhrase; - -// QList wheres; -// QList orderPhrases; -// QList fields; -// QHash orders; }; NUT_END_NAMESPACE diff --git a/src/querybase_p.h b/src/querybase_p.h index 2ef0386..d1066b0 100644 --- a/src/querybase_p.h +++ b/src/querybase_p.h @@ -41,7 +41,7 @@ protected: QExplicitlySharedDataPointer d; public: - explicit QueryBase(QObject *parent = 0); + explicit QueryBase(QObject *parent = nullptr); protected: // void addTableToSet(TableSetBase *set, Table *table); diff --git a/src/table.cpp b/src/table.cpp index f987e7a..d27bb72 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -44,32 +44,32 @@ NUT_BEGIN_NAMESPACE */ Table::Table(QObject *parent) : QObject(parent), - d_ptr(new TablePrivate(this)) + d(new TablePrivate(this)) { } Table::~Table() { - Q_D(Table); + //Q_D(Table); - if (d->parentTableSet) - d->parentTableSet->remove(this); +// if (d->parentTableSet) +// d->parentTableSet->remove(this); } void Table::add(TableSetBase *t) { - Q_D(Table); + //Q_D(Table); d->childTableSets.insert(t); } //QString Table::primaryKey() const //{ -// Q_D(const Table); +// //Q_D(const Table); // return d->model->primaryKey(); //} //bool Table::isPrimaryKeyAutoIncrement() const //{ -// Q_D(const Table); +// //Q_D(const Table); // FieldModel *pk = d->model->field(d->model->primaryKey()); // if (!pk) // return false; @@ -84,7 +84,7 @@ void Table::add(TableSetBase *t) void Table::propertyChanged(const QString &propName) { - Q_D(Table); + //Q_D(Table); // if (!d->model) // d->model = TableModel::findByClassName(metaObject()->className()); @@ -95,6 +95,7 @@ void Table::propertyChanged(const QString &propName) // if(f->isPrimaryKey && propName == f->name && f->isAutoIncrement) // return; + d.detach(); d->changedProperties.insert(propName); if (d->status == FeatchedFromDB) d->status = Modified; @@ -105,25 +106,26 @@ void Table::propertyChanged(const QString &propName) void Table::setModel(TableModel *model) { - Q_D(Table); + //Q_D(Table); d->model = model; } void Table::clear() { - Q_D(Table); + //Q_D(Table); d->changedProperties.clear(); } QSet Table::changedProperties() const { - Q_D(const Table); + //Q_D(const Table); return d->changedProperties; } bool Table::setParentTable(Table *master, TableModel *masterModel, TableModel *model) { - Q_D(Table); + //Q_D(Table); + d.detach(); QString masterClassName = master->metaObject()->className(); d->refreshModel(); @@ -145,22 +147,22 @@ bool Table::setParentTable(Table *master, TableModel *masterModel, TableModel *m TableSetBase *Table::parentTableSet() const { - Q_D(const Table); + //Q_D(const Table); return d->parentTableSet; } void Table::setParentTableSet(TableSetBase *parent) { - Q_D(Table); + //Q_D(Table); d->parentTableSet = parent; - if (parent) - d->parentTableSet->add(this); +// if (parent) +// d->parentTableSet->add(this); } TableSetBase *Table::childTableSet(const QString &name) const { - Q_D(const Table); + //Q_D(const Table); foreach (TableSetBase *t, d->childTableSets) if (t->childClassName() == name) return t; @@ -169,7 +171,7 @@ TableSetBase *Table::childTableSet(const QString &name) const int Table::save(Database *db) { - Q_D(Table); + //Q_D(Table); QSqlQuery q = db->exec(db->sqlGenertor()->saveRecord(this, db->tableName(metaObject()->className()))); @@ -186,19 +188,19 @@ int Table::save(Database *db) Table::Status Table::status() const { - Q_D(const Table); + //Q_D(const Table); return static_cast(d->status); } void Table::setStatus(const Status &status) { - Q_D(Table); + //Q_D(Table); d->status = status; } -TablePrivate::TablePrivate(Table *parent) : q_ptr(parent), +TablePrivate::TablePrivate(Table *parent) : QSharedData(), model(nullptr), status(Table::NewCreated), parentTableSet(nullptr) { @@ -206,7 +208,7 @@ TablePrivate::TablePrivate(Table *parent) : q_ptr(parent), void TablePrivate::refreshModel() { - Q_Q(Table); +// Q_Q(Table); // if (!model) // model = TableModel::findByClassName(q->metaObject()->className()); } diff --git a/src/table.h b/src/table.h index 16dfbd3..957bd1d 100644 --- a/src/table.h +++ b/src/table.h @@ -38,8 +38,7 @@ class TablePrivate; class NUT_EXPORT Table : public QObject { Q_OBJECT - TablePrivate *d_ptr; - Q_DECLARE_PRIVATE(Table) + QExplicitlySharedDataPointer d; public: explicit Table(QObject *parentTableSet = nullptr); diff --git a/src/table_p.h b/src/table_p.h index 5f40ed3..41000d6 100644 --- a/src/table_p.h +++ b/src/table_p.h @@ -4,13 +4,14 @@ #include "defines.h" #include +#include NUT_BEGIN_NAMESPACE class TableModel; class Table; class TableSetBase; -class TablePrivate { +class TablePrivate : public QSharedData { Table *q_ptr; Q_DECLARE_PUBLIC(Table) diff --git a/src/tablemodel.h b/src/tablemodel.h index 9f90685..9e28534 100644 --- a/src/tablemodel.h +++ b/src/tablemodel.h @@ -31,8 +31,7 @@ NUT_BEGIN_NAMESPACE class TableModel; struct FieldModel{ - explicit FieldModel() : name(QString()), length(0), defaultValue(QString()), - notNull(false), isPrimaryKey(false), isAutoIncrement(false), isUnique(false) + explicit FieldModel() : name(QString()), defaultValue(QString()) { } @@ -42,12 +41,12 @@ struct FieldModel{ QString name; QMetaType::Type type; QString typeName; - int length; + int length{0}; QString defaultValue; - bool notNull; - bool isPrimaryKey; - bool isAutoIncrement; - bool isUnique; + bool notNull{false}; + bool isPrimaryKey{false}; + bool isAutoIncrement{false}; + bool isUnique{false}; QString displayName; bool operator ==(const FieldModel &f) const{ @@ -70,18 +69,17 @@ struct FieldModel{ struct RelationModel{ RelationModel() : localColumn(QString()), localProperty(QString()), - slaveTable(nullptr), foreignColumn(QString()), masterTable(nullptr), - masterClassName(QString()) + slaveTable(nullptr), foreignColumn(QString()), masterClassName(QString()) {} explicit RelationModel(const QJsonObject &obj); //slave QString localColumn; QString localProperty; - TableModel *slaveTable; + TableModel *slaveTable{nullptr}; //master QString foreignColumn; - TableModel *masterTable; + TableModel *masterTable{nullptr}; QString masterClassName; diff --git a/src/tableset.h b/src/tableset.h index 6b6f55d..073ed91 100644 --- a/src/tableset.h +++ b/src/tableset.h @@ -58,8 +58,8 @@ public: void remove(RowList t); int length() const; - T *at(int i) const; - const T &operator[](int i) const; + Row at(int i) const; + const Row operator[](int i) const; Query *query(bool autoDelete = true); BulkInserter *bulkInserter(); @@ -95,20 +95,27 @@ Q_OUTOFLINE_TEMPLATE BulkInserter *TableSet::bulkInserter() template Q_OUTOFLINE_TEMPLATE int TableSet::length() const { - return data->tables.count(); + return data->childs.count(); } template -Q_OUTOFLINE_TEMPLATE T *TableSet::at(int i) const +Q_OUTOFLINE_TEMPLATE Row TableSet::at(int i) const { - //TODO: check - return reinterpret_cast(data->childRows.at(i)); +#ifdef NUT_SHARED_POINTER + return data->childs.at(i).objectCast(); +#else + return reinterpret_cast(data->childs.at(i)); +#endif } template -Q_OUTOFLINE_TEMPLATE const T &TableSet::operator[](int i) const +Q_OUTOFLINE_TEMPLATE const Row TableSet::operator[](int i) const { - return data->childRows[i]; +#ifdef NUT_SHARED_POINTER + return data->childs.at(i).objectCast(); +#else + return reinterpret_cast(data->childs.at(i)); +#endif } template @@ -116,8 +123,8 @@ Q_OUTOFLINE_TEMPLATE void TableSet::append(Row t) { data.detach(); data->childs.append(t); - data->tables.insert(t.data()); - data->childRows.append(t.data()); +// data->tables.insert(t.data()); +// data->childRows.append(t.data()); // if (_database) // t->setModel(_database->model().tableByClassName(t->metaObject()->className())); @@ -138,8 +145,8 @@ template Q_OUTOFLINE_TEMPLATE void TableSet::remove(Row t) { data.detach(); - data->childs.removeOne(t.data()); - data->tables.remove(t.data()); +// data->childs.removeOne(t.data()); +// data->tables.remove(t.data()); data->childs.removeOne(t); t->setStatus(Table::Deleted); } diff --git a/src/tablesetbase.cpp b/src/tablesetbase.cpp index 8ee15a0..5eb9b67 100644 --- a/src/tablesetbase.cpp +++ b/src/tablesetbase.cpp @@ -40,11 +40,9 @@ TableSetBase::TableSetBase(Table *parent) : QObject(parent), TableSetBase::~TableSetBase() { - foreach (Table *t, data->tables) - t->setParentTableSet(nullptr); - foreach (Row
t, data->childs) - t->setParentTableSet(nullptr); + if (t) + t->setParentTableSet(nullptr); } int TableSetBase::save(Database *db, bool cleanUp) @@ -54,7 +52,7 @@ int TableSetBase::save(Database *db, bool cleanUp) if (data->table) masterModel = db->model().tableByClassName(data->table->metaObject()->className()); - foreach (Table *t, data->childRows) { + foreach (Row
t, data->childs) { if(data->table) t->setParentTable(data->table, masterModel, @@ -65,16 +63,16 @@ int TableSetBase::save(Database *db, bool cleanUp) || t->status() == Table::Deleted){ rowsAffected += t->save(db); if(cleanUp) -#ifndef NUT_SHARED_POINTER - t->deleteLater(); -#else +#ifdef NUT_SHARED_POINTER remove(t); +#else + t->deleteLater(); #endif } } if (cleanUp) - data->childRows.clear(); + data->childs.clear(); return rowsAffected; } @@ -82,38 +80,23 @@ int TableSetBase::save(Database *db, bool cleanUp) void TableSetBase::clearChilds() { #ifndef NUT_SHARED_POINTER - foreach (Table *t, data->childRows) + foreach (Table *t, data->childs) t->deleteLater(); #endif - data->childRows.clear(); -} - -void TableSetBase::add(Table *t) -{ - if(!data->tables.contains(get(t))){ - data.detach(); - data->tables.insert(get(t)); - data->childRows.append(get(t)); - } -} - -void TableSetBase::remove(Table *t) -{ - data.detach(); - data->tables.remove(get(t)); - data->childRows.removeOne(get(t)); + data->childs.clear(); } void TableSetBase::add(Row
t) { data.detach(); data->childs.append(t); + t->setParentTableSet(this); } void TableSetBase::remove(Row
t) { data.detach(); - data->childs.removeOne(t); + data->childs.removeAll(t); } QString TableSetBase::childClassName() const diff --git a/src/tablesetbase_p.h b/src/tablesetbase_p.h index 5911f42..f5805ba 100644 --- a/src/tablesetbase_p.h +++ b/src/tablesetbase_p.h @@ -49,17 +49,11 @@ public: void setDatabase(Database *database); protected: -// QSet _tables; -// RowList
_childRows; -// Database *_database; -// Table *_table; -//// QString _tableName; -// QString _childClassName; QExplicitlySharedDataPointer data; public://TODO: change this to private - void add(Table* t); - void remove(Table *t); +// void add(Table* t); +// void remove(Table *t); void add(Row
t); void remove(Row
t); diff --git a/src/tablesetbasedata.h b/src/tablesetbasedata.h index f0fe881..a63258e 100644 --- a/src/tablesetbasedata.h +++ b/src/tablesetbasedata.h @@ -39,8 +39,8 @@ public: database(nullptr), table(parent) { } - QSet tables; - QList childRows; +// QSet tables; +// QList childRows; RowList
childs; Database *database; diff --git a/test/common/consts.h b/test/common/consts.h index ca49e2e..581dca9 100644 --- a/test/common/consts.h +++ b/test/common/consts.h @@ -2,6 +2,7 @@ #define CONSTS_H #include +#include #define REGISTER(x) qDebug() << (#x) << "type id:" << qMetaTypeId() #define PRINT(x) @@ -27,6 +28,20 @@ # define OS "Unknown" #endif +#ifdef Q_CC_GNU +# ifdef Q_CC_MINGW +# define CC "MinGW" +# else +# define CC "GNU" +# endif +#elif defined (Q_CC_MSVC) +# define CC "msvc" +#elif defined (Q_CC_CLANG) +# define CC "clang" +#else +# define CC "Unknown" +#endif + #define PRINT_FORM(db) \ qDebug() << "\n\n****************************" \ << "\nAll tests passed," \ @@ -34,6 +49,7 @@ << "hamed.masafi@gmail.com" \ << "\n\tDriver:" << db.driver() \ << "\n\tOS: " OS " (version: ________)" \ + << "\n\tCompiler: " CC " (version: ________)" \ << "\n\tQt version: " QT_VERSION_STR \ << "\n\tTest:" << metaObject()->className() \ << "\n****************************\n";