diff --git a/src/database.cpp b/src/database.cpp index 23aa6dc..ca189a3 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -131,10 +131,10 @@ bool DatabasePrivate::updateDatabase() qWarning("Error executing sql command, %s", db.lastError().text().toLatin1().data()); } + storeScheemaInDB(); bool ok = db.commit(); if (db.lastError().type() == QSqlError::NoError) { - storeScheemaInDB(); q->databaseUpdated(last.versionMajor(), last.versionMinor(), current.versionMajor(), current.versionMinor()); diff --git a/src/query.cpp b/src/query.cpp index 2a6cbbd..9fc86ca 100644 --- a/src/query.cpp +++ b/src/query.cpp @@ -23,7 +23,7 @@ NUT_BEGIN_NAMESPACE QueryPrivate::QueryPrivate(QueryBase *parent) : q_ptr(parent), - joinClassName(QString::null) + joinClassName(QString::null), skip(-1), take(-1) { } diff --git a/src/query.h b/src/query.h index da68c48..937f90e 100644 --- a/src/query.h +++ b/src/query.h @@ -61,6 +61,8 @@ public: } // Query *orderBy(QString fieldName, QString type); + Query *skip(int &n); + Query *take(int &n); Query *orderBy(WherePhrase phrase); int count(); @@ -81,6 +83,7 @@ public: template inline Query *createQuery(TableSet *tableSet) { + return tableSet->query(); } template @@ -120,7 +123,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) // d->orders, d->tableName, d->joinClassName)); d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::SelectAll, "", d->wheres, d->orderPhrases, - d->tableName, d->joinClassName); + d->tableName, d->joinClassName, d->skip, d->take); QSqlQuery q = d->database->exec(d->sql); // QString pk = TableModel::findByName(d->tableName)->primaryKey(); @@ -218,7 +221,7 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) QList ret; d->sql = d->database->sqlGenertor()->selectCommand( SqlGeneratorBase::SignleField, f.data()->text, d->wheres, - d->orderPhrases, d->tableName, d->joinClassName); + d->orderPhrases, d->tableName, d->joinClassName, d->skip, d->take); QSqlQuery q = d->database->exec(d->sql); @@ -319,6 +322,22 @@ Q_OUTOFLINE_TEMPLATE Query *Query::setWhere(WherePhrase where) return this; } +template +Q_OUTOFLINE_TEMPLATE Query *Query::skip(int &n) +{ + Q_D(Query); + d->skip = n; + return this; +} + +template +Q_OUTOFLINE_TEMPLATE Query *Query::take(int &n) +{ + Q_D(Query); + d->take = n; + return this; +} + //template //Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(QString fieldName, // QString type) diff --git a/src/query_p.h b/src/query_p.h index f074592..8046c3c 100644 --- a/src/query_p.h +++ b/src/query_p.h @@ -49,6 +49,8 @@ public: QList wheres; QList orderPhrases; QHash orders; + int skip; + int take; }; NUT_END_NAMESPACE diff --git a/src/sqlgeneratorbase.cpp b/src/sqlgeneratorbase.cpp index be176d9..43c1f02 100644 --- a/src/sqlgeneratorbase.cpp +++ b/src/sqlgeneratorbase.cpp @@ -65,8 +65,7 @@ QString SqlGeneratorBase::saveRecord(Table *t, QString tableName) case Table::NewCreated: case Table::FeatchedFromDB: - // disable compiler warning - return ""; + Q_UNREACHABLE(); } return ""; @@ -308,7 +307,7 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QList &wheres, QList &orders, QString tableName, - QString joinClassName) + QString joinClassName, int skip, int take) { QString select = agregateText(t, agregateArg); QString where = createWhere(wheres); diff --git a/src/sqlgeneratorbase_p.h b/src/sqlgeneratorbase_p.h index 0214057..3aba191 100644 --- a/src/sqlgeneratorbase_p.h +++ b/src/sqlgeneratorbase_p.h @@ -81,7 +81,8 @@ public: QList &wheres, QList &orders, QString tableName, - QString joinClassName); + QString joinClassName, + int skip = -1, int take = -1); virtual QString deleteCommand(QList &wheres, QString tableName); diff --git a/src/sqlservergenerator.cpp b/src/sqlservergenerator.cpp index 20dd90c..cdca934 100644 --- a/src/sqlservergenerator.cpp +++ b/src/sqlservergenerator.cpp @@ -27,14 +27,17 @@ NUT_BEGIN_NAMESPACE -SqlServerGenerator::SqlServerGenerator(Database *parent) : SqlGeneratorBase(parent) +SqlServerGenerator::SqlServerGenerator(Database *parent) + : SqlGeneratorBase(parent) { - } QString SqlServerGenerator::masterDatabaseName(QString databaseName) { - return databaseName.replace(QRegularExpression("DATABASE\\=(\\w+)", QRegularExpression::CaseInsensitiveOption), "DATABASE="); + return databaseName.replace( + QRegularExpression("DATABASE\\=(\\w+)", + QRegularExpression::CaseInsensitiveOption), + "DATABASE="); } QString SqlServerGenerator::fieldType(FieldModel *field) @@ -48,7 +51,7 @@ QString SqlServerGenerator::fieldType(FieldModel *field) case QVariant::ByteArray: dbType = "VARBINARY"; - if(field->length) + if (field->length) dbType.append(" (" + QString::number(field->length) + ")"); else dbType.append(" (MAX)"); @@ -67,7 +70,7 @@ QString SqlServerGenerator::fieldType(FieldModel *field) break; case QVariant::Int: dbType = "INT"; - if(field->isAutoIncrement) + if (field->isAutoIncrement) dbType += " IDENTITY(1,1)"; break; @@ -77,7 +80,7 @@ QString SqlServerGenerator::fieldType(FieldModel *field) break; case QVariant::String: - if(field->length) + if (field->length) dbType = QString("NVARCHAR(%1)").arg(field->length); else dbType = "NVARCHAR(MAX)"; @@ -97,14 +100,14 @@ QString SqlServerGenerator::fieldType(FieldModel *field) QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField) { QString sql = ""; - if(oldField && newField) - if(*oldField == *newField) + if (oldField && newField) + if (*oldField == *newField) return QString::null; - if(!newField){ + if (!newField) { sql = "DROP COLUMN " + oldField->name; - }else{ - if(oldField) + } else { + if (oldField) sql = "MODIFY COLUMN "; else sql = "ADD "; @@ -116,16 +119,32 @@ QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField) QString SqlServerGenerator::escapeValue(const QVariant &v) const { - if(v.type() == QVariant::String || v.type() == QVariant::Char) + if (v.type() == QVariant::String || v.type() == QVariant::Char) return "N'" + v.toString() + "'"; else if (v.type() == QVariant::Point) { QPoint pt = v.toPoint(); - return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg(pt.y()); + return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( + pt.y()); } else if (v.type() == QVariant::Point) { QPointF pt = v.toPointF(); - return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg(pt.y()); + return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( + pt.y()); } - return SqlGeneratorBase::escapeValue(v); + return SqlGeneratorBase::escapeValue(v); +} + +QString SqlServerGenerator::selectCommand( + SqlGeneratorBase::AgregateType t, QString agregateArg, + QList &wheres, QList &orders, QString tableName, + QString joinClassName, int skip, int take) +{ + QString command = SqlGeneratorBase::selectCommand(t, agregateArg, wheres, orders, tableName, joinClassName, skip, take); + + if (take != -1 && skip != -1) + command.append(QString("OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY") + .arg(skip) + .arg(take)); + return command; } NUT_END_NAMESPACE diff --git a/src/sqlservergenerator.h b/src/sqlservergenerator.h index 8dedd27..0966b27 100644 --- a/src/sqlservergenerator.h +++ b/src/sqlservergenerator.h @@ -30,13 +30,18 @@ class SqlServerGenerator : public SqlGeneratorBase { public: SqlServerGenerator(Database *parent = 0); - + QString masterDatabaseName(QString databaseName); QString fieldType(FieldModel *field); QString diff(FieldModel *oldField, FieldModel *newField); QString escapeValue(const QVariant &v) const; + + QString selectCommand(AgregateType t, QString agregateArg, + QList &wheres, + QList &orders, QString tableName, + QString joinClassName, int skip, int take); }; NUT_END_NAMESPACE