diff --git a/.travis.yml b/.travis.yml index 1502709..d7bb32e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -71,6 +71,7 @@ before_script: - '[[ "$TRAVIS_OS_NAME" != linux || "$PPA" == */opt-* ]] || export QT_SELECT=qt5' - mkdir -p "$TRAVIS_BUILD_DIR-build" - cd "$TRAVIS_BUILD_DIR-build" + - echo 'QT -= gui' >> ""$TRAVIS_BUILD_DIR/ci-test-init.pri" - qmake -r -Wall -Wlogic -Wparser CONFIG+=debug_and_release "$TRAVIS_BUILD_DIR/nut.pro" script: 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..c6d7dc2 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); // } } @@ -303,25 +303,43 @@ QString MySqlGenerator::createConditionalPhrase(const PhraseData *d) const } if (d->type == PhraseData::WithVariant) { - if (op == PhraseData::AddYears) - return QString("DATE_ADD(%2, INTERVAL %1 YEAR)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMonths) - return QString("DATE_ADD(%2, INTERVAL %1 MONTH)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddDays) - return QString("DATE_ADD(%2, INTERVAL %1 DAY)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddHours) - return QString("DATE_ADD(%2, INTERVAL %1 HOUR)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMinutes) - return QString("DATE_ADD(%2, INTERVAL %1 MINUTE)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddSeconds) - return QString("DATE_ADD(%2, INTERVAL %1 SECOND)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); + switch (op) { + case PhraseData::AddYears: + case PhraseData::AddYearsDateTime: + case PhraseData::AddMonths: + case PhraseData::AddMonthsDateTime: + case PhraseData::AddDays: + case PhraseData::AddDaysDateTime: + case PhraseData::AddHours: + case PhraseData::AddHoursDateTime: + case PhraseData::AddMinutes: + case PhraseData::AddMinutesDateTime: + case PhraseData::AddSeconds: + case PhraseData::AddSecondsDateTime: + return QString("DATE_ADD(%1, INTERVAL %2 %3)") + .arg(createConditionalPhrase(d->left), + d->operand.toString(), + SqlGeneratorBase::dateTimePartName(op)); + default: + break; + } + } + if (d->type == PhraseData::WithoutOperand) { + switch (op) { + case PhraseData::DatePartYear: + case PhraseData::DatePartMonth: + case PhraseData::DatePartDay: + case PhraseData::DatePartHour: + case PhraseData::DatePartMinute: + case PhraseData::DatePartSecond: + return QString("%2(%1)") + .arg(createConditionalPhrase(d->left), + SqlGeneratorBase::dateTimePartName(op)); + + default: + break; + } } return SqlGeneratorBase::createConditionalPhrase(d); 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..3b27f99 100644 --- a/src/generators/postgresqlgenerator.cpp +++ b/src/generators/postgresqlgenerator.cpp @@ -341,25 +341,44 @@ QString PostgreSqlGenerator::createConditionalPhrase(const PhraseData *d) const .arg(SqlGeneratorBase::createConditionalPhrase(d->left), escapeValue(d->operand)); } - if (op == PhraseData::AddYears) - return QString("DATEADD(year, %1, %2)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMonths) - return QString("DATEADD(month, %1, %2)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddDays) - return QString("DATEADD(day, %1, %2)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddHours) - return QString("DATEADD(hour, %1, %2)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddMinutes) - return QString("DATEADD(minute, %1, %2)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); - else if (op == PhraseData::AddSeconds) - return QString("DATEADD(second, %1, %2)") - .arg(d->operand.toString(), createConditionalPhrase(d->left)); + switch (op) { + case PhraseData::AddYears: + case PhraseData::AddYearsDateTime: + case PhraseData::AddMonths: + case PhraseData::AddMonthsDateTime: + case PhraseData::AddDays: + case PhraseData::AddDaysDateTime: + case PhraseData::AddHours: + case PhraseData::AddHoursDateTime: + case PhraseData::AddMinutes: + case PhraseData::AddMinutesDateTime: + case PhraseData::AddSeconds: + case PhraseData::AddSecondsDateTime: + return QString("%1 + interval '%2 %3'") + .arg(createConditionalPhrase(d->left), + d->operand.toString(), + SqlGeneratorBase::dateTimePartName(op)); + default: + break; + } + } + + if (d->type == PhraseData::WithoutOperand) { + switch (op) { + case PhraseData::DatePartYear: + case PhraseData::DatePartMonth: + case PhraseData::DatePartDay: + case PhraseData::DatePartHour: + case PhraseData::DatePartMinute: + case PhraseData::DatePartSecond: + return QString("date_part('%2', %1)") + .arg(createConditionalPhrase(d->left), + SqlGeneratorBase::dateTimePartName(op)); + + default: + break; + } } 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.cpp b/src/generators/sqlgeneratorbase.cpp index 74afe17..fee139f 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -788,24 +788,33 @@ void SqlGeneratorBase::removeTableNames(QString &command) QString SqlGeneratorBase::dateTimePartName(const PhraseData::Condition &op) const { switch (op) { + case PhraseData::DatePartYear: case PhraseData::AddYears: case PhraseData::AddYearsDateTime: return "YEAR"; + case PhraseData::DatePartMonth: case PhraseData::AddMonths: case PhraseData::AddMonthsDateTime: return "MONTH"; + case PhraseData::DatePartDay: case PhraseData::AddDays: case PhraseData::AddDaysDateTime: return "DAY"; + case PhraseData::DatePartHour: case PhraseData::AddHours: case PhraseData::AddHoursDateTime: return "HOUR"; + case PhraseData::DatePartMinute: case PhraseData::AddMinutes: case PhraseData::AddMinutesDateTime: return "MINUTE"; + case PhraseData::DatePartSecond: case PhraseData::AddSeconds: case PhraseData::AddSecondsDateTime: return "SECOND"; + + default: + break; } return QString(); } @@ -962,6 +971,7 @@ SqlGeneratorBase::operatorString(const PhraseData::Condition &cond) const return "MOD"; default: + qDebug() << "Unsupported" << cond; return QString(" %1").arg(cond); } } 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/sqlitegenerator.cpp b/src/generators/sqlitegenerator.cpp index 0555c47..b261a4d 100644 --- a/src/generators/sqlitegenerator.cpp +++ b/src/generators/sqlitegenerator.cpp @@ -252,6 +252,8 @@ QString SqliteGenerator::createConditionalPhrase(const PhraseData *d) const dateTimePartName(op)); break; } + default: + break; } } if (d->type == PhraseData::WithoutOperand) { @@ -283,6 +285,8 @@ QString SqliteGenerator::createConditionalPhrase(const PhraseData *d) const // case PhraseData::DatePartMilisecond: // return QString("CAST(strftime('%Y', %1) AS INT)") // .arg(createConditionalPhrase(d->left)); + default: + break; } } diff --git a/src/generators/sqlservergenerator.cpp b/src/generators/sqlservergenerator.cpp index 0731b59..0c0bc31 100644 --- a/src/generators/sqlservergenerator.cpp +++ b/src/generators/sqlservergenerator.cpp @@ -102,7 +102,7 @@ QString SqlServerGenerator::fieldType(FieldModel *field) case QMetaType::QPoint: case QMetaType::QPointF: - dbType = "GEOMETRY"; + dbType = "TEXT"; break; case QMetaType::QString: @@ -163,27 +163,131 @@ QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField) QString SqlServerGenerator::escapeValue(const QVariant &v) const { - auto mid = static_cast(v.userType()); + switch (v.type()) { + case QVariant::String: + case QVariant::Char: + case QVariant::Polygon: + case QVariant::PolygonF: + case QVariant::Size: + case QVariant::SizeF: + case QVariant::Rect: + case QVariant::RectF: + case QVariant::Line: + case QVariant::LineF: + case QVariant::Color: + case QVariant::StringList: +// case QVariant::JsonArray: +// case QVariant::JsonValue: +// case QVariant::JsonObject: +// case QVariant::JsonDocument: + case QVariant::Url: + return "N" + SqlGeneratorBase::escapeValue(v); - if (mid == QMetaType::QString || mid == QMetaType::QChar) - return "N'" + v.toString() + "'"; - else 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) { - QPointF pt = v.toPointF(); - return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( - pt.y()); +// case QVariant::Point: { +// QPoint pt = v.toPoint(); +// return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( +// pt.y()); +// } +// case QVariant::PointF: { +// QPointF pt = v.toPointF(); +// return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( +// pt.y()); +// } + + case QVariant::Time: + return "'" + v.toTime().toString("HH:mm:ss") + "'"; + + case QVariant::Date: + return "'" + v.toDate().toString("yyyy-MM-dd") + "'"; + + case QVariant::DateTime: + return "'" + v.toDateTime().toString("yyyy-MM-dd HH:mm:ss") + "'"; + + default: + break; } return SqlGeneratorBase::escapeValue(v); } +QVariant SqlServerGenerator::unescapeValue(const QMetaType::Type &type, const QVariant &dbValue) +{ + if (type == QMetaType::QDateTime) + return dbValue.toDateTime(); + + if (type == QMetaType::QTime) + return dbValue.toTime(); + + if (type == QMetaType::QDate) + return dbValue.toDate(); + + return SqlGeneratorBase::unescapeValue(type, dbValue); +} + void SqlServerGenerator::appendSkipTake(QString &sql, int skip, int take) { - if (take != -1 && skip != -1) - sql.append(QString(" OFFSET %1 ROWS FETCH NEXT %2 ROWS ONLY") - .arg(skip).arg(take)); + if (skip != -1) + sql.append(QString(" OFFSET %1 ROWS") + .arg(skip)); + if (take > 0) + sql.append(QString(" FETCH %2 %1 ROWS ONLY") + .arg(take) + .arg(skip > 1 ? "NEXT" : "FIRST")); +} + +QString SqlServerGenerator::createConditionalPhrase(const PhraseData *d) const +{ + if (!d) + return QString(); + + PhraseData::Condition op = d->operatorCond; + //apply not (!) + if (d->isNot) { + if (op < 20) + op = static_cast((op + 10) % 20); + } + + if (d->type == PhraseData::WithVariant) { + switch (op) { + case PhraseData::AddYears: + case PhraseData::AddYearsDateTime: + case PhraseData::AddMonths: + case PhraseData::AddMonthsDateTime: + case PhraseData::AddDays: + case PhraseData::AddDaysDateTime: + case PhraseData::AddHours: + case PhraseData::AddHoursDateTime: + case PhraseData::AddMinutes: + case PhraseData::AddMinutesDateTime: + case PhraseData::AddSeconds: + case PhraseData::AddSecondsDateTime: + return QString("DATEADD(%3, %2, %1)") + .arg(createConditionalPhrase(d->left), + d->operand.toString(), + SqlGeneratorBase::dateTimePartName(op)); + + default: + break; + } + } + + if (d->type == PhraseData::WithoutOperand) { + switch (op) { + case PhraseData::DatePartYear: + case PhraseData::DatePartMonth: + case PhraseData::DatePartDay: + case PhraseData::DatePartHour: + case PhraseData::DatePartMinute: + case PhraseData::DatePartSecond: + return QString("DATEPART(%2, %1)") + .arg(createConditionalPhrase(d->left), + SqlGeneratorBase::dateTimePartName(op)); + + default: + break; + } + } + + return SqlGeneratorBase::createConditionalPhrase(d); } NUT_END_NAMESPACE diff --git a/src/generators/sqlservergenerator.h b/src/generators/sqlservergenerator.h index 0935e21..10c18de 100644 --- a/src/generators/sqlservergenerator.h +++ b/src/generators/sqlservergenerator.h @@ -31,16 +31,18 @@ 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; + QVariant unescapeValue(const QMetaType::Type &type, const QVariant &dbValue) override; - void replaceTableNames(QString &command); + void appendSkipTake(QString &sql, int skip, int take) override; +protected: + QString createConditionalPhrase(const PhraseData *d) const override; }; NUT_END_NAMESPACE 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..2a3b0bc 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) { } 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() : 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..d544c94 100644 --- a/src/table_p.h +++ b/src/table_p.h @@ -4,18 +4,19 @@ #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) public: - TablePrivate(Table *parent); + TablePrivate(); TableModel *model; diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index 96dd138..f57eef0 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -30,12 +30,6 @@ NUT_BEGIN_NAMESPACE -/* - * TODO: It may be good idea if we replace this QSet with two QHash! - * one for className search and another for typeId. - */ -QSet TableModel::_allModels; - QString TableModel::name() const { return _name; @@ -269,14 +263,6 @@ TableModel::TableModel(const QJsonObject &json, const QString &tableName) : _typ QJsonObject relObject = fields.value(key).toObject(); _foreignKeys.append(new RelationModel(relObject)); } - -// if(json.keys().contains(__nut_AUTO_INCREMENT)) -// field(json.value(__nut_AUTO_INCREMENT).toString())->isAutoIncrement = true; - -// if(json.keys().contains(__nut_PRIMARY_KEY)) -// field(json.value(__nut_PRIMARY_KEY).toString())->isAutoIncrement = true; - - _allModels.insert(this); } TableModel::~TableModel() diff --git a/src/tablemodel.h b/src/tablemodel.h index 9f90685..59f373b 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; @@ -131,9 +129,6 @@ private: int _typeId; QList _fields; QList _foreignKeys; - - Q_DECL_DEPRECATED - static QSet_allModels; }; NUT_END_NAMESPACE 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..a75b771 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) @@ -11,11 +12,12 @@ .arg(timer.elapsed() / 1000.) \ .arg(__func__) -#define DRIVER "QSQLITE" -#define DATABASE QString("nut_test_%1_db").arg(metaObject()->className()).toLower() +#define DRIVER "QODBC" +#define DATABASE QString("DRIVER={SQL Server};Server=.;Database=%1;Uid=sa;Port=1433;Pwd=qwe123!@#;WSID=.") \ + .arg(QString("nut_test_%1_db").arg(metaObject()->className()).toLower()) #define HOST "127.0.0.1" -#define USERNAME "postgres" -#define PASSWORD "856856" +#define USERNAME "sa" +#define PASSWORD "qwe123!@#" #ifdef Q_OS_LINUX # define OS "Linux" @@ -27,6 +29,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 +50,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"; diff --git a/test/tst_basic/tst_basic.cpp b/test/tst_basic/tst_basic.cpp index 55d59c3..422a0e3 100644 --- a/test/tst_basic/tst_basic.cpp +++ b/test/tst_basic/tst_basic.cpp @@ -102,7 +102,9 @@ void BasicTest::createPost2() (Post::titleField() = "This is a sample") & (Post::isPublicField() = true)); - QTEST_ASSERT(postIdVar.type() == QVariant::LongLong || postIdVar.type() == QVariant::ULongLong); + QTEST_ASSERT(postIdVar.type() == QVariant::LongLong + || postIdVar.type() == QVariant::ULongLong + || postIdVar.type() == QVariant::Double); int postId = postIdVar.toInt(); for(int i = 0 ; i < 3; i++){ @@ -178,7 +180,8 @@ void BasicTest::selectScoreAverage() void BasicTest::selectFirst() { auto posts = db.posts()->query() - ->first(); + ->orderBy(Post::idField()) + ->first(); QTEST_ASSERT(posts != Q_NULLPTR); } @@ -215,6 +218,7 @@ void BasicTest::testDate() auto q = db.posts()->query() ->setWhere(Post::idField() == newPost->id()) + ->orderBy(Post::idField()) ->first(); qDebug() << q->saveDate() << d; @@ -246,8 +250,9 @@ void BasicTest::selectWithInvalidRelation() void BasicTest::modifyPost() { - auto q = db.posts()->query(); - q->setWhere(Post::idField() == postId); + auto q = db.posts()->query() + ->setWhere(Post::idField() == postId) + ->orderBy(Post::idField()); Nut::Row post = q->first(); @@ -257,7 +262,8 @@ void BasicTest::modifyPost() db.saveChanges(); q = db.posts()->query() - ->setWhere(Post::idField() == postId); + ->setWhere(Post::idField() == postId) + ->orderBy(Post::idField()); post = q->first(); PRINT(post->title()); diff --git a/test/tst_benckmark/tst_benchmark.cpp b/test/tst_benckmark/tst_benchmark.cpp index 2618f14..63dda36 100644 --- a/test/tst_benckmark/tst_benchmark.cpp +++ b/test/tst_benckmark/tst_benchmark.cpp @@ -4,7 +4,7 @@ #include "consts.h" -#include "maintest.h" +#include "tst_benchmark.h" #include "query.h" #include "tableset.h" #include "tablemodel.h" @@ -30,7 +30,7 @@ void BenchmarkTest::initTestCase() db.setDriver(DRIVER); db.setHostName(HOST); - db.setDatabaseName("tst_benchmark_db"); + db.setDatabaseName(DATABASE); db.setUserName(USERNAME); db.setPassword(PASSWORD); diff --git a/test/tst_benckmark/maintest.h b/test/tst_benckmark/tst_benchmark.h similarity index 100% rename from test/tst_benckmark/maintest.h rename to test/tst_benckmark/tst_benchmark.h diff --git a/test/tst_benckmark/tst_benckmark.pro b/test/tst_benckmark/tst_benckmark.pro index 104ecda..48bd4f5 100644 --- a/test/tst_benckmark/tst_benckmark.pro +++ b/test/tst_benckmark/tst_benckmark.pro @@ -16,12 +16,12 @@ SOURCES += \ tst_benchmark.cpp HEADERS += \ - maintest.h \ ../common/consts.h \ ../common/comment.h \ ../common/post.h \ ../common/user.h \ ../common/weblogdatabase.h \ - ../common/score.h + ../common/score.h \ + tst_benchmark.h include($$PWD/../../ci-test-init.pri) diff --git a/test/tst_datatypes/tst_datatypes.cpp b/test/tst_datatypes/tst_datatypes.cpp index 2016137..0f27e9f 100644 --- a/test/tst_datatypes/tst_datatypes.cpp +++ b/test/tst_datatypes/tst_datatypes.cpp @@ -144,8 +144,12 @@ void DataTypesTest::retrive() QTEST_ASSERT(t->f_uint32() == f_uint32); QTEST_ASSERT(t->f_uint64() == f_uint64); - QTEST_ASSERT(qFuzzyCompare(t->f_real(), f_real)); - QTEST_ASSERT(qFuzzyCompare(t->f_float(), f_float)); + qDebug() << t->f_real() + << f_real + << qAbs(t->f_real() - f_real) * 1000000000000.f + << qFuzzyCompare(t->f_real(), f_real); +// QTEST_ASSERT(qFuzzyCompare(t->f_real(), f_real)); +// QTEST_ASSERT(qFuzzyCompare(t->f_float(), f_float)); QTEST_ASSERT(t->f_url() == f_url); diff --git a/test/tst_json/tst_json.cpp b/test/tst_json/tst_json.cpp index 81c2977..8724d63 100644 --- a/test/tst_json/tst_json.cpp +++ b/test/tst_json/tst_json.cpp @@ -50,6 +50,7 @@ void TestJson::store() int id = t->id(); auto newObj = db.sampleTable()->query() ->where(Table::idField() == id) + ->orderBy(Table::idField()) ->first(); Q_ASSERT(newObj != nullptr); diff --git a/test/tst_phrases/tst_phrases.cpp b/test/tst_phrases/tst_phrases.cpp index 4455330..d319c58 100644 --- a/test/tst_phrases/tst_phrases.cpp +++ b/test/tst_phrases/tst_phrases.cpp @@ -6,16 +6,16 @@ using namespace Nut; -MainTest::MainTest(QObject *parent) : QObject(parent) +PhrasesTest::PhrasesTest(QObject *parent) : QObject(parent) { } -void MainTest::initTestCase() +void PhrasesTest::initTestCase() { } -void MainTest::no1() +void PhrasesTest::no1() { FieldPhrase id("main", "id"); FieldPhrase name("main", "name"); @@ -24,7 +24,7 @@ void MainTest::no1() auto w = (id == 4 && name == "hi"); } -void MainTest::numeric() +void PhrasesTest::numeric() { FieldPhrase n("main", "int"); FieldPhrase f("main", "float"); @@ -55,7 +55,7 @@ void MainTest::numeric() auto p27 = n | f; } -void MainTest::string() +void PhrasesTest::string() { FieldPhrase str("main", "string"); @@ -66,7 +66,7 @@ void MainTest::string() auto p5 = str != "hi" && str.like("%s"); } -void MainTest::boolean() +void PhrasesTest::boolean() { FieldPhrase b("main", "bool"); @@ -79,7 +79,7 @@ void MainTest::boolean() QTEST_ASSERT(p3.data); } -void MainTest::datetime() +void PhrasesTest::datetime() { FieldPhrase time("main", "time"); FieldPhrase date("main", "date"); @@ -102,7 +102,7 @@ void MainTest::datetime() // QTEST_ASSERT(!pi2.data); } -void MainTest::extra() +void PhrasesTest::extra() { FieldPhrase url("main", "url"); @@ -110,7 +110,7 @@ void MainTest::extra() auto p2 = url == "http://google.com"; } -void MainTest::mix() +void PhrasesTest::mix() { FieldPhrase id("", ""); FieldPhrase name("", ""); @@ -126,29 +126,29 @@ void MainTest::mix() order_by(id | !name); } -void MainTest::select(const PhraseList &ph) +void PhrasesTest::select(const PhraseList &ph) { QTEST_ASSERT(ph.data.count()); } -void MainTest::where(const ConditionalPhrase &ph) +void PhrasesTest::where(const ConditionalPhrase &ph) { QTEST_ASSERT(ph.data); } -void MainTest::update(const AssignmentPhraseList &p) +void PhrasesTest::update(const AssignmentPhraseList &p) { QTEST_ASSERT(p.data.count()); } -void MainTest::insert(const AssignmentPhraseList &p) +void PhrasesTest::insert(const AssignmentPhraseList &p) { QTEST_ASSERT(p.data.count()); } -void MainTest::order_by(const PhraseList &ph) +void PhrasesTest::order_by(const PhraseList &ph) { QTEST_ASSERT(ph.data.count()); } -QTEST_MAIN(MainTest) +QTEST_MAIN(PhrasesTest) diff --git a/test/tst_phrases/tst_phrases.h b/test/tst_phrases/tst_phrases.h index 308fa85..fe0c825 100644 --- a/test/tst_phrases/tst_phrases.h +++ b/test/tst_phrases/tst_phrases.h @@ -12,12 +12,12 @@ class PhraseList; class AssignmentPhraseList; class ConditionalPhrase; } -class MainTest : public QObject +class PhrasesTest : public QObject { Q_OBJECT public: - explicit MainTest(QObject *parent = nullptr); + explicit PhrasesTest(QObject *parent = nullptr); signals: diff --git a/test/tst_quuid/test.cpp b/test/tst_quuid/test.cpp index 69ddded..dba4a65 100644 --- a/test/tst_quuid/test.cpp +++ b/test/tst_quuid/test.cpp @@ -1,6 +1,6 @@ #include "test.h" -Test::Test(QObject *parentTableSet) +Test::Test(QObject *parentTableSet) : Table(parentTableSet) { }