diff --git a/src/database.cpp b/src/database.cpp index b2ad6b6..79429a7 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -227,7 +227,7 @@ DatabaseModel DatabasePrivate::getLastScheema() // ChangeLogTable *u = q->_change_logs()->createQuery()->orderBy("id", // "desc")->first(); ChangeLogTable *u - = changeLogs->createQuery()->orderBy("id", "desc")->first(); + = changeLogs->query()->orderBy("id", "desc")->first(); DatabaseModel ret; diff --git a/src/query.h b/src/query.h index 8771079..bbbe66a 100644 --- a/src/query.h +++ b/src/query.h @@ -72,6 +72,8 @@ public: // Query *setWhere(const QString &where); Query *orderBy(QString fieldName, QString type); Query *orderBy(WherePhrase phrase); + + int update(WherePhrase phrase); }; template @@ -309,6 +311,20 @@ Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(WherePhrase phrase) return this; } +template +Q_OUTOFLINE_TEMPLATE int Query::update(WherePhrase phrase) +{ + Q_D(Query); + + QString sql = d->database->sqlGenertor()->updateCommand( + phrase, + d->wheres, + d->tableName); + qDebug() << sql; + QSqlQuery q = d->database->exec(sql); + return q.numRowsAffected(); +} + NUT_END_NAMESPACE #endif // QUERY_H diff --git a/src/sqlgeneratorbase.cpp b/src/sqlgeneratorbase.cpp index ee8d269..d64b4ac 100644 --- a/src/sqlgeneratorbase.cpp +++ b/src/sqlgeneratorbase.cpp @@ -431,6 +431,22 @@ QString SqlGeneratorBase::deleteCommand(QList &wheres, QString tabl return command; } +QString SqlGeneratorBase::updateCommand(WherePhrase &phrase, QList &wheres, QString tableName) +{ + QString p = this->phrase(phrase.data()); + QString where = createWhere(wheres); + + QString sql = "UPDATE " + tableName + " SET " + p; + + if(where != "") + sql.append(" WHERE " + where); + + for(int i = 0; i < _database->model().count(); i++) + sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); + + return sql; +} + QString SqlGeneratorBase::escapeValue(const QVariant &v)const { switch (v.type()) { diff --git a/src/sqlgeneratorbase_p.h b/src/sqlgeneratorbase_p.h index e9e5c56..7c15856 100644 --- a/src/sqlgeneratorbase_p.h +++ b/src/sqlgeneratorbase_p.h @@ -92,6 +92,8 @@ public: virtual QString deleteCommand(QList &wheres, QString tableName); + virtual QString updateCommand(WherePhrase &phrase, QList &wheres, QString tableName); + virtual QString escapeValue(const QVariant &v) const; virtual QString phrase(const PhraseData *d) const; virtual QString operatorString(const PhraseData::Condition &cond) const; diff --git a/src/tableset.h b/src/tableset.h index 7b9c919..a759a73 100644 --- a/src/tableset.h +++ b/src/tableset.h @@ -52,7 +52,7 @@ public: int length() const; T *at(int i) const; const T &operator[](int i) const; - Query *createQuery(); + Query *query(); }; template @@ -68,7 +68,7 @@ Q_OUTOFLINE_TEMPLATE TableSet::TableSet(Table *parent) : TableSetBase(parent) } template -Q_OUTOFLINE_TEMPLATE Query *TableSet::createQuery() +Q_OUTOFLINE_TEMPLATE Query *TableSet::query() { Query *q = new Query(_database, this); diff --git a/src/wherephrase.cpp b/src/wherephrase.cpp index a4af1f9..8be3c72 100644 --- a/src/wherephrase.cpp +++ b/src/wherephrase.cpp @@ -164,6 +164,17 @@ WherePhrase WherePhrase::operator >=(const WherePhrase &other) return WherePhrase(this, PhraseData::GreaterEqual, (WherePhrase*)&other); } + +WherePhrase WherePhrase::operator !() +{ + if(_data->operatorCond < 20) + _data->operatorCond = (PhraseData::Condition)((_data->operatorCond + 10) % 20); + else + qFatal("Operator ! can not aplied to non condition statements"); + + return this;//WherePhrase(this, PhraseData::Not); +} + WherePhrase WherePhrase::operator =(const WherePhrase &other) { return WherePhrase(this, PhraseData::Set, (WherePhrase*)&other); diff --git a/src/wherephrase.h b/src/wherephrase.h index 931c67e..4f45616 100644 --- a/src/wherephrase.h +++ b/src/wherephrase.h @@ -116,6 +116,7 @@ public: WherePhrase operator <=(const WherePhrase &other); WherePhrase operator >=(const WherePhrase &other); + WherePhrase operator !(); WherePhrase operator =(const WherePhrase &other); WherePhrase operator +(const WherePhrase &other); @@ -149,8 +150,8 @@ public: WherePhrase operator !(); WherePhrase isNull(); - WherePhrase in(QVariantList list); - WherePhrase in(QStringList list); + WherePhrase in(QList list); +// WherePhrase in(QStringList list); WherePhrase like(QString pattern); }; @@ -191,16 +192,20 @@ Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::isNull(){ } template -Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::in(QVariantList list) +Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::in(QList list) { - return WherePhrase(this, PhraseData::In, list); + QVariantList vlist; + foreach (T t, list) + vlist.append(QVariant::fromValue(t)); + + return WherePhrase(this, PhraseData::In, vlist); } -template -Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::in(QStringList list) -{ - return WherePhrase(this, PhraseData::In, list); -} +//template +//Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::in(QStringList list) +//{ +// return WherePhrase(this, PhraseData::In, list); +//} template Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::like(QString pattern)