diff --git a/src/generators/mysqlgenerator.cpp b/src/generators/mysqlgenerator.cpp index c6d7dc2..2d21a93 100644 --- a/src/generators/mysqlgenerator.cpp +++ b/src/generators/mysqlgenerator.cpp @@ -345,4 +345,15 @@ QString MySqlGenerator::createConditionalPhrase(const PhraseData *d) const return SqlGeneratorBase::createConditionalPhrase(d); } +void MySqlGenerator::appendSkipTake(QString &sql, int skip, int take) +{ + if (take > 0 && skip > 0) { + sql.append(QString(" LIMIT %1 OFFSET %2") + .arg(take) + .arg(skip)); + } else if (take > 0) { + sql.append(QString(" LIMIT %1").arg(take)); + } +} + NUT_END_NAMESPACE diff --git a/src/generators/mysqlgenerator.h b/src/generators/mysqlgenerator.h index 95a0e98..4d38fa9 100644 --- a/src/generators/mysqlgenerator.h +++ b/src/generators/mysqlgenerator.h @@ -37,6 +37,8 @@ public: // QString phrase(const PhraseData *d) const; // QString selectCommand(AgregateType t, QString agregateArg, QString tableName, QList &wheres, QList &orders, QList joins, int skip, int take); QString createConditionalPhrase(const PhraseData *d) const override; + void appendSkipTake(QString &sql, int skip, int take) override; + private: bool readInsideParentese(QString &text, QString &out); }; diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index fee139f..063fe74 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -617,8 +617,6 @@ QString SqlGeneratorBase::selectCommand(const QString &tableName, const int skip, const int take) { - Q_UNUSED(skip); - Q_UNUSED(take); QStringList joinedOrders; QString selectText = agregateText(t, agregateArg); QString whereText = createConditionalPhrase(where.data); diff --git a/src/generators/sqlitegenerator.cpp b/src/generators/sqlitegenerator.cpp index b261a4d..98d4cec 100644 --- a/src/generators/sqlitegenerator.cpp +++ b/src/generators/sqlitegenerator.cpp @@ -187,10 +187,13 @@ QStringList SqliteGenerator::diff(TableModel *oldTable, TableModel *newTable) } void SqliteGenerator::appendSkipTake(QString &sql, int skip, int take) { - if (take != -1 && skip != -1) + if (take > 0 && skip > 0) { sql.append(QString(" LIMIT %1 OFFSET %2") - .arg(take) + .arg(take) .arg(skip)); + } else if (take > 0) { + sql.append(QString(" LIMIT %1").arg(take)); + } } QString SqliteGenerator::primaryKeyConstraint(const TableModel *table) const diff --git a/src/query.h b/src/query.h index f1ff3e4..5e8c344 100644 --- a/src/query.h +++ b/src/query.h @@ -169,14 +169,13 @@ Q_OUTOFLINE_TEMPLATE Query::~Query() template Q_OUTOFLINE_TEMPLATE RowList Query::toList(int count) { - Q_UNUSED(count); Q_D(Query); RowList returnList; d->select = "*"; d->sql = d->database->sqlGenertor()->selectCommand( d->tableName, d->fieldPhrase, d->wherePhrase, d->orderPhrase, - d->relations, d->skip, d->take); + d->relations, d->skip, count); QSqlQuery q = d->database->exec(d->sql); if (q.lastError().isValid()) { @@ -372,7 +371,6 @@ template Q_OUTOFLINE_TEMPLATE Row Query::first() { skip(0); - take(1); RowList list = toList(1); if (list.count()) diff --git a/test/tst_basic/tst_basic.cpp b/test/tst_basic/tst_basic.cpp index 1a49325..e7a1ef1 100644 --- a/test/tst_basic/tst_basic.cpp +++ b/test/tst_basic/tst_basic.cpp @@ -225,6 +225,12 @@ void BasicTest::testDate() QTEST_ASSERT(q->saveDate() == d); } +void BasicTest::testLimitedQuery() +{ + auto comments = db.comments()->query()->toList(2); + QTEST_ASSERT(comments.length() == 2); +} + void BasicTest::join() { // TIC(); diff --git a/test/tst_basic/tst_basic.h b/test/tst_basic/tst_basic.h index 89b59a9..2b97ceb 100644 --- a/test/tst_basic/tst_basic.h +++ b/test/tst_basic/tst_basic.h @@ -36,6 +36,7 @@ private slots: void selectPostIds(); void updatePostOnTheFly(); void testDate(); + void testLimitedQuery(); void selectWithInvalidRelation(); void modifyPost(); void emptyDatabase();