From 87b46a808ab6c62996a96dfd8517331d90283570 Mon Sep 17 00:00:00 2001 From: blackdal Date: Thu, 10 Aug 2017 19:39:41 +0430 Subject: [PATCH] wip: query and model improvment --- src/database.cpp | 21 +-- src/database.h | 2 + src/databasemodel.cpp | 32 ++-- src/databasemodel.h | 25 +-- src/defines.h | 11 +- src/query.h | 201 +++++++++++++----------- src/sqlgeneratorbase.cpp | 319 ++++++++++++++++----------------------- src/sqlgeneratorbase_p.h | 19 +-- 8 files changed, 298 insertions(+), 332 deletions(-) diff --git a/src/database.cpp b/src/database.cpp index bd02b61..23aa6dc 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -161,6 +161,7 @@ bool DatabasePrivate::updateDatabase() bool DatabasePrivate::getCurrectScheema() { Q_Q(Database); + if (allTableMaps.contains(q->metaObject()->className())) { currentModel = allTableMaps[q->metaObject()->className()]; return false; @@ -207,7 +208,7 @@ bool DatabasePrivate::getCurrectScheema() int typeId = QMetaType::type(tableProperty.typeName()); if (tables.values().contains(tableProperty.name()) - && typeId >= QVariant::UserType) { + && (unsigned)typeId >= QVariant::UserType) { TableModel *sch = new TableModel(typeId, tableProperty.name()); currentModel.append(sch); } @@ -215,7 +216,7 @@ bool DatabasePrivate::getCurrectScheema() foreach (TableModel *sch, currentModel) foreach (RelationModel *fk, sch->foregionKeys()) - fk->table = currentModel.modelByClass(fk->className); + fk->table = currentModel.tableByClassName(fk->className); allTableMaps.insert(q->metaObject()->className(), currentModel); return true; @@ -224,12 +225,12 @@ bool DatabasePrivate::getCurrectScheema() DatabaseModel DatabasePrivate::getLastScheema() { Q_Q(Database); - // ChangeLogTable *u = q->_change_logs()->createQuery()->orderBy("id", - // "desc")->first(); - ChangeLogTable *u - = changeLogs->query()->orderBy("id", "desc")->first(); - DatabaseModel ret; + ChangeLogTable *u = changeLogs->query() + ->orderBy(!ChangeLogTable::idField()) + ->first(); + + DatabaseModel ret(q->metaObject()->className()); if (u) { QJsonObject json @@ -291,7 +292,7 @@ bool DatabasePrivate::storeScheemaInDB() void DatabasePrivate::createChangeLogs() { // currentModel.model("change_log") - QString diff = sqlGenertor->diff(0, currentModel.model("__change_log")); + QString diff = sqlGenertor->diff(0, currentModel.tableByName("__change_log")); db.exec(diff); } @@ -392,7 +393,7 @@ DatabaseModel Database::model() const QString Database::tableName(QString className) { Q_D(Database); - TableModel *m = model().modelByClass(className); + TableModel *m = model().tableByClassName(className); if (m) return m->name(); else @@ -438,7 +439,7 @@ void Database::setConnectionName(QString connectionName) void Database::setDriver(QString driver) { Q_D(Database); - d->driver = driver; + d->driver = driver.toUpper(); } SqlGeneratorBase *Database::sqlGenertor() const diff --git a/src/database.h b/src/database.h index 96aa277..8b9661b 100644 --- a/src/database.h +++ b/src/database.h @@ -53,6 +53,7 @@ public: QSqlQuery exec(QString sql); + //TODO: make me private and rename me void add(TableSetBase *); int saveChanges(); void cleanUp(); @@ -71,6 +72,7 @@ public: SqlGeneratorBase *sqlGenertor() const; protected: + //remove minor version virtual void databaseUpdated(int oldMajor, int oldMinor, int newMajor, int newMinor); diff --git a/src/databasemodel.cpp b/src/databasemodel.cpp index fca63a3..3cea9da 100644 --- a/src/databasemodel.cpp +++ b/src/databasemodel.cpp @@ -25,9 +25,11 @@ NUT_BEGIN_NAMESPACE -DatabaseModel::DatabaseModel() : QList(), _versionMajor(0), _versionMinor(0) -{ +QMap DatabaseModel::_models; +DatabaseModel::DatabaseModel(const QString &name) : QList(), _databaseClassName(name), _versionMajor(0), _versionMinor(0) +{ + _models.insert(name, this); } DatabaseModel::DatabaseModel(const DatabaseModel &other) : QList(other), _versionMajor(0), _versionMinor(0) @@ -35,7 +37,7 @@ DatabaseModel::DatabaseModel(const DatabaseModel &other) : QList(ot } -TableModel *DatabaseModel::model(QString tableName) const +TableModel *DatabaseModel::tableByName(QString tableName) const { for(int i = 0; i < size(); i++){ TableModel *s = at(i); @@ -49,7 +51,7 @@ TableModel *DatabaseModel::model(QString tableName) const return 0; } -TableModel *DatabaseModel::modelByClass(QString className) const +TableModel *DatabaseModel::tableByClassName(QString className) const { for(int i = 0; i < size(); i++){ TableModel *s = at(i); @@ -71,7 +73,7 @@ bool DatabaseModel::operator ==(const DatabaseModel &other) const for(int i = 0; i < size(); i++){ TableModel *mine = at(i); - TableModel *others = other.model(mine->name()); + TableModel *others = other.tableByName(mine->name()); if(!others) return false; @@ -98,9 +100,9 @@ QJsonObject DatabaseModel::toJson() const return obj; } -RelationModel *DatabaseModel::relationByClassNames(QString masterClassName, QString childClassName) +RelationModel *DatabaseModel::relationByClassNames(const QString &masterClassName, const QString &childClassName) { - TableModel *childTable = modelByClass(childClassName); + TableModel *childTable = tableByClassName(childClassName); if(!childTable) return 0; @@ -112,9 +114,9 @@ RelationModel *DatabaseModel::relationByClassNames(QString masterClassName, QStr return 0; } -RelationModel *DatabaseModel::relationByTableNames(QString masterTableName, QString childTableName) +RelationModel *DatabaseModel::relationByTableNames(const QString &masterTableName, const QString &childTableName) { - TableModel *childTable = model(childTableName); + TableModel *childTable = tableByName(childTableName); if(!childTable) return 0; @@ -128,7 +130,7 @@ RelationModel *DatabaseModel::relationByTableNames(QString masterTableName, QStr DatabaseModel DatabaseModel::fromJson(QJsonObject &json) { - DatabaseModel model; + DatabaseModel model(QString::null); // model.setVersionMajor(json.value(QT_STRINGIFY(versionMajor)).toInt()); // model.setVersionMinor(json.value(QT_STRINGIFY(versionMinor)).toInt()); @@ -163,7 +165,7 @@ void DatabaseModel::setVersionMinor(int versionMinor) _versionMinor = versionMinor; } -bool DatabaseModel::remove(QString tableName) +bool DatabaseModel::remove(const QString &tableName) { for(int i = 0; i < size(); i++){ TableModel *s = at(i); @@ -175,4 +177,12 @@ bool DatabaseModel::remove(QString tableName) return false; } +DatabaseModel *DatabaseModel::modelByName(const QString &name) +{ + if (_models.contains(name)) + return _models[name]; + + return Q_NULLPTR; +} + NUT_END_NAMESPACE diff --git a/src/databasemodel.h b/src/databasemodel.h index 27a36d7..8a57f7d 100644 --- a/src/databasemodel.h +++ b/src/databasemodel.h @@ -22,7 +22,7 @@ #define DATABASEMODEL_H #include -#include"defines.h" +#include "defines.h" class QJsonObject; @@ -30,20 +30,25 @@ NUT_BEGIN_NAMESPACE class TableModel; struct RelationModel; -class DatabaseModel : public QList +class DatabaseModel : public QList { + QString _databaseClassName; int _versionMajor, _versionMinor; + static QMap _models; + public: - DatabaseModel(); + DatabaseModel(const QString &name = QString::null); DatabaseModel(const DatabaseModel &other); - TableModel *model(QString tableName) const; - TableModel *modelByClass(QString className) const; + TableModel *tableByName(QString tableName) const; + TableModel *tableByClassName(QString className) const; - RelationModel *relationByClassNames(QString masterClassName, QString childClassName); - RelationModel *relationByTableNames(QString masterTableName, QString childTableName); + RelationModel *relationByClassNames(const QString &masterClassName, + const QString &childClassName); + RelationModel *relationByTableNames(const QString &masterClassName, + const QString &childClassName); - bool operator ==(const DatabaseModel &other) const; + bool operator==(const DatabaseModel &other) const; static DatabaseModel fromJson(QJsonObject &json); QJsonObject toJson() const; @@ -54,7 +59,9 @@ public: int versionMinor() const; void setVersionMinor(int versionMinor); - bool remove(QString tableName); + bool remove(const QString &tableName); + + static DatabaseModel *modelByName(const QString &name); }; NUT_END_NAMESPACE diff --git a/src/defines.h b/src/defines.h index 1916472..e657dd1 100644 --- a/src/defines.h +++ b/src/defines.h @@ -43,18 +43,19 @@ #endif // Database +//TODO: remove minor version #define NUT_DB_VERSION(major, minor) Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX __nut_DB_VERSION), QT_STRINGIFY(#major "." #minor)) #define NUT_DECLARE_TABLE(type, name) \ Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX __nut_TABLE " " #type), #name) \ Q_PROPERTY(type* name READ name) \ - Q_PROPERTY(__NUT_NAMESPACE_PERFIX TableSet name##s READ name##s) \ + Q_PROPERTY(NUT_WRAP_NAMESPACE(TableSet) name##s READ name##s) \ type* m_##name; \ - __NUT_NAMESPACE_PERFIX TableSet *m_##name##s; \ + NUT_WRAP_NAMESPACE(TableSet) *m_##name##s; \ public: \ static const type _##name; \ type* name() const{ return m_##name; } \ - __NUT_NAMESPACE_PERFIX TableSet *name##s() const { return m_##name##s; } + NUT_WRAP_NAMESPACE(TableSet) *name##s() const { return m_##name##s; } //Table #define NUT_DECLARE_FIELD(type, name, read, write) \ @@ -62,8 +63,8 @@ public: \ Q_CLASSINFO(QT_STRINGIFY(__nut_NAME_PERFIX #name " " __nut_FIELD), #name) \ type m_##name; \ public: \ - static __NUT_NAMESPACE_PERFIX FieldPhrase name##Field(){ \ - static __NUT_NAMESPACE_PERFIX FieldPhrase f = __NUT_NAMESPACE_PERFIX FieldPhrase(staticMetaObject.className(), #name); \ + static NUT_WRAP_NAMESPACE(FieldPhrase) name ## Field(){ \ + static NUT_WRAP_NAMESPACE(FieldPhrase) f = NUT_WRAP_NAMESPACE(FieldPhrase)(staticMetaObject.className(), #name); \ return f; \ } \ type read() const{ \ diff --git a/src/query.h b/src/query.h index 7f1b892..30c66f9 100644 --- a/src/query.h +++ b/src/query.h @@ -38,7 +38,7 @@ NUT_BEGIN_NAMESPACE -template +template class NUT_EXPORT Query : public QueryBase { QueryPrivate *d_ptr; @@ -54,12 +54,13 @@ public: Query *join(const QString &tableName); Query *setWhere(WherePhrase where); - Query *join(Table *c){ + Query *join(Table *c) + { join(c->metaObject()->className()); return this; } - Query *orderBy(QString fieldName, QString type); +// Query *orderBy(QString fieldName, QString type); Query *orderBy(WherePhrase phrase); int count(); @@ -68,7 +69,7 @@ public: QVariant average(FieldPhrase &f); T *first(); QList toList(int count = -1); - template + template QList select(const FieldPhrase f); int update(WherePhrase phrase); @@ -78,23 +79,28 @@ public: }; template -inline Query *createQuery(TableSet *tableSet){ - +inline Query *createQuery(TableSet *tableSet) +{ } -template -Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, TableSetBase *tableSet, bool autoDelete) : QueryBase(database), - d_ptr(new QueryPrivate(this)), m_autoDelete(autoDelete) +template +Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, TableSetBase *tableSet, + bool autoDelete) + : QueryBase(database), d_ptr(new QueryPrivate(this)), + m_autoDelete(autoDelete) { Q_D(Query); d->database = database; d->tableSet = tableSet; - d->tableName = //TableModel::findByClassName(T::staticMetaObject.className())->name(); - d->database->model().modelByClass(T::staticMetaObject.className())->name(); + d->tableName + = // TableModel::findByClassName(T::staticMetaObject.className())->name(); + d->database->model() + .tableByClassName(T::staticMetaObject.className()) + ->name(); } -template +template Q_OUTOFLINE_TEMPLATE Query::~Query() { Q_D(Query); @@ -102,55 +108,63 @@ Q_OUTOFLINE_TEMPLATE Query::~Query() delete d; } -template +template Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) { Q_D(Query); - QList result; + QList result; d->select = "*"; -// QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, d->orders, d->tableName, d->joinClassName)); + // QSqlQuery q = + // d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, + // d->orders, d->tableName, d->joinClassName)); d->sql = d->database->sqlGenertor()->selectCommand( - SqlGeneratorBase::SelectAll, - "", - d->wheres, - d->orderPhrases, - d->tableName, - d->joinClassName); + SqlGeneratorBase::SelectAll, "", d->wheres, d->orderPhrases, + d->tableName, d->joinClassName); QSqlQuery q = d->database->exec(d->sql); -// QString pk = TableModel::findByName(d->tableName)->primaryKey(); - QString pk = d->database->model().model(d->tableName)->primaryKey(); + // QString pk = TableModel::findByName(d->tableName)->primaryKey(); + QString pk = d->database->model().tableByName(d->tableName)->primaryKey(); QVariant lastPkValue = QVariant(); int childTypeId = 0; T *lastRow = 0; TableSetBase *childTableSet = Q_NULLPTR; - //FIXME: getting table error -// QStringList masterFields = TableModel::findByName(d->tableName)->fieldsNames(); - QStringList masterFields = d->database->model().model(d->tableName)->fieldsNames(); + // FIXME: getting table error + // QStringList masterFields = + // TableModel::findByName(d->tableName)->fieldsNames(); + QStringList masterFields + = d->database->model().tableByName(d->tableName)->fieldsNames(); QStringList childFields; - if(!d->joinClassName.isNull()) { - TableModel *joinTableModel = TableModel::findByClassName(d->joinClassName); - if(joinTableModel){ -// childFields = d->database->model().modelByClass(d->joinClassName)->fieldsNames(); - childFields = TableModel::findByClassName(d->joinClassName)->fieldsNames(); + if (!d->joinClassName.isNull()) { + TableModel *joinTableModel + = TableModel::findByClassName(d->joinClassName); + if (joinTableModel) { + // childFields = + // d->database->model().modelByClass(d->joinClassName)->fieldsNames(); + childFields + = TableModel::findByClassName(d->joinClassName)->fieldsNames(); QString joinTableName = d->database->tableName(d->joinClassName); - childTypeId = d->database->model().model(joinTableName)->typeId(); -// childTypeId = TableModel::findByName(joinTableName)->typeId(); + childTypeId = d->database->model().tableByName(joinTableName)->typeId(); + // childTypeId = + // TableModel::findByName(joinTableName)->typeId(); } } while (q.next()) { - if(lastPkValue != q.value(pk)){ + if (lastPkValue != q.value(pk)) { T *t = new T(); foreach (QString field, masterFields) t->setProperty(field.toLatin1().data(), q.value(field)); -// for (int i = 0; i < t->metaObject()->propertyCount(); i++) { -// const QMetaProperty p = t->metaObject()->property(i); + // for (int i = 0; i < t->metaObject()->propertyCount(); + // i++) { + // const QMetaProperty p = + // t->metaObject()->property(i); -// p.write(t, d->database->sqlGenertor()->readValue(p.type(), q.value(p.name()))); -// } + // p.write(t, + // d->database->sqlGenertor()->readValue(p.type(), + // q.value(p.name()))); + // } t->setTableSet(d->tableSet); t->setStatus(Table::FeatchedFromDB); @@ -160,21 +174,24 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) result.append(t); lastRow = t; - if(childTypeId){ - QSet tableSets = t->tableSets; + if (childTypeId) { + QSet tableSets = t->tableSets; foreach (TableSetBase *ts, tableSets) - if(ts->childClassName() == d->joinClassName) + if (ts->childClassName() == d->joinClassName) childTableSet = ts; } } - if(childTypeId){ - const QMetaObject *childMetaObject = QMetaType::metaObjectForType(childTypeId); - Table *childTable = qobject_cast(childMetaObject->newInstance()); + if (childTypeId) { + const QMetaObject *childMetaObject + = QMetaType::metaObjectForType(childTypeId); + Table *childTable + = qobject_cast(childMetaObject->newInstance()); foreach (QString field, childFields) - childTable->setProperty(field.toLatin1().data(), q.value(field)); -//TODO: set database for table + childTable->setProperty(field.toLatin1().data(), + q.value(field)); + // TODO: set database for table childTable->setParent(this); childTable->setParentTable(lastRow); childTable->setStatus(Table::FeatchedFromDB); @@ -184,11 +201,11 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) } lastPkValue = q.value(pk); - if(!--count) + if (!--count) break; } - if(m_autoDelete) + if (m_autoDelete) deleteLater(); return result; } @@ -200,12 +217,8 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) Q_D(Query); QList ret; d->sql = d->database->sqlGenertor()->selectCommand( - SqlGeneratorBase::SignleField, - f.data()->text, - d->wheres, - d->orderPhrases, - d->tableName, - d->joinClassName); + SqlGeneratorBase::SignleField, f.data()->text, d->wheres, + d->orderPhrases, d->tableName, d->joinClassName); QSqlQuery q = d->database->exec(d->sql); while (q.next()) { @@ -213,74 +226,83 @@ Q_OUTOFLINE_TEMPLATE QList Query::select(const FieldPhrase f) ret.append(v.value()); } - if(m_autoDelete) + if (m_autoDelete) deleteLater(); return ret; } -template +template Q_OUTOFLINE_TEMPLATE T *Query::first() { QList list = toList(1); - if(list.count()) + if (list.count()) return list.first(); else return 0; } -template +template Q_OUTOFLINE_TEMPLATE int Query::count() { Q_D(Query); d->select = "COUNT(*)"; - d->sql = d->database->sqlGenertor()->selectCommand("COUNT(*)", d->wheres, d->orders, d->tableName, d->joinClassName); + d->sql = d->database->sqlGenertor()->selectCommand(SqlGeneratorBase::Count, + QStringLiteral("*"), d->wheres, d->orderPhrases, d->tableName, d->joinClassName); QSqlQuery q = d->database->exec(d->sql); - if(q.next()) + if (q.next()) return q.value(0).toInt(); return 0; } -template -Q_OUTOFLINE_TEMPLATE QVariant Query::max(FieldPhrase &f){ +template +Q_OUTOFLINE_TEMPLATE QVariant Query::max(FieldPhrase &f) +{ Q_D(Query); - d->sql = d->database->sqlGenertor()->selectCommand("MAX(" + f.data()->text + ")", d->wheres, d->orders, d->tableName, d->joinClassName); + d->sql = d->database->sqlGenertor()->selectCommand( + SqlGeneratorBase::Max, f.data()->text, d->wheres, d->orderPhrases, + d->tableName, d->joinClassName); QSqlQuery q = d->database->exec(d->sql); - if(q.next()) + if (q.next()) return q.value(0).toInt(); return 0; } -template -Q_OUTOFLINE_TEMPLATE QVariant Query::min(FieldPhrase &f){ +template +Q_OUTOFLINE_TEMPLATE QVariant Query::min(FieldPhrase &f) +{ Q_D(Query); - d->sql = d->database->sqlGenertor()->selectCommand("MIN(" + f.data()->text + ")", d->wheres, d->orders, d->tableName, d->joinClassName); + d->sql = d->database->sqlGenertor()->selectCommand( + SqlGeneratorBase::Min, f.data()->text, d->wheres, d->orderPhrases, + d->tableName, d->joinClassName); QSqlQuery q = d->database->exec(d->sql); - if(q.next()) + if (q.next()) return q.value(0).toInt(); return 0; } -template +template Q_OUTOFLINE_TEMPLATE QVariant Query::average(FieldPhrase &f) { Q_D(Query); - d->sql = d->database->sqlGenertor()->selectCommand("AVG(" + f.data()->text + ")", d->wheres, d->orders, d->tableName, d->joinClassName); + d->sql = d->database->sqlGenertor()->selectCommand( + SqlGeneratorBase::Average, f.data()->text, d->wheres, d->orderPhrases, + d->tableName, d->joinClassName); QSqlQuery q = d->database->exec(d->sql); - if(q.next()) + if (q.next()) return q.value(0).toInt(); return 0; } -template +template Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &tableName) { Q_D(Query); @@ -288,7 +310,7 @@ Q_OUTOFLINE_TEMPLATE Query *Query::join(const QString &tableName) return this; } -template +template Q_OUTOFLINE_TEMPLATE Query *Query::setWhere(WherePhrase where) { Q_D(Query); @@ -296,15 +318,16 @@ Q_OUTOFLINE_TEMPLATE Query *Query::setWhere(WherePhrase where) return this; } -template -Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(QString fieldName, QString type) -{ - Q_D(Query); - d->orders.insert(fieldName, type); - return this; -} +//template +//Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(QString fieldName, +// QString type) +//{ +// Q_D(Query); +// d->orderPhrases.append(fieldName, type); +// return this; +//} -template +template Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(WherePhrase phrase) { Q_D(Query); @@ -312,15 +335,13 @@ Q_OUTOFLINE_TEMPLATE Query *Query::orderBy(WherePhrase phrase) return this; } -template +template Q_OUTOFLINE_TEMPLATE int Query::update(WherePhrase phrase) { Q_D(Query); - d->sql = d->database->sqlGenertor()->updateCommand( - phrase, - d->wheres, - d->tableName); + d->sql = d->database->sqlGenertor()->updateCommand(phrase, d->wheres, + d->tableName); QSqlQuery q = d->database->exec(d->sql); if (m_autoDelete) @@ -328,14 +349,12 @@ Q_OUTOFLINE_TEMPLATE int Query::update(WherePhrase phrase) return q.numRowsAffected(); } -template +template Q_OUTOFLINE_TEMPLATE int Query::remove() { Q_D(Query); - d->sql = d->database->sqlGenertor()->deleteCommand( - d->wheres, - d->tableName); + d->sql = d->database->sqlGenertor()->deleteCommand(d->wheres, d->tableName); QSqlQuery q = d->database->exec(d->sql); if (m_autoDelete) @@ -343,7 +362,7 @@ Q_OUTOFLINE_TEMPLATE int Query::remove() return q.numRowsAffected(); } -template +template Q_OUTOFLINE_TEMPLATE QString Query::sqlCommand() const { Q_D(const Query); diff --git a/src/sqlgeneratorbase.cpp b/src/sqlgeneratorbase.cpp index 92047cb..a1df142 100644 --- a/src/sqlgeneratorbase.cpp +++ b/src/sqlgeneratorbase.cpp @@ -33,15 +33,15 @@ NUT_BEGIN_NAMESPACE -SqlGeneratorBase::SqlGeneratorBase(Database *parent) : QObject((QObject*)parent) +SqlGeneratorBase::SqlGeneratorBase(Database *parent) + : QObject((QObject *)parent) { - if(parent) + if (parent) _database = parent; } SqlGeneratorBase::~SqlGeneratorBase() { - } QString SqlGeneratorBase::masterDatabaseName(QString databaseName) @@ -53,7 +53,7 @@ QString SqlGeneratorBase::masterDatabaseName(QString databaseName) QString SqlGeneratorBase::saveRecord(Table *t, QString tableName) { Q_ASSERT(!tableName.isEmpty() && !tableName.isNull()); - switch(t->status()){ + switch (t->status()) { case Table::Added: return insertRecord(t, tableName); @@ -77,7 +77,8 @@ QString SqlGeneratorBase::fieldDeclare(FieldModel *field) return field->name + " " + fieldType(field); } -QStringList SqlGeneratorBase::diff(DatabaseModel lastModel, DatabaseModel newModel) +QStringList SqlGeneratorBase::diff(DatabaseModel lastModel, + DatabaseModel newModel) { QStringList ret; @@ -88,10 +89,9 @@ QStringList SqlGeneratorBase::diff(DatabaseModel lastModel, DatabaseModel newMod foreach (TableModel *table, newModel) tableNames.insert(table->name()); - foreach (QString tableName, tableNames) { - TableModel *oldTable = lastModel.model(tableName); - TableModel *newTable = newModel.model(tableName); + TableModel *oldTable = lastModel.tableByName(tableName); + TableModel *newTable = newModel.tableByName(tableName); QString sql = diff(oldTable, newTable); ret << sql; } @@ -102,14 +102,14 @@ QStringList SqlGeneratorBase::diff(DatabaseModel lastModel, DatabaseModel newMod QString SqlGeneratorBase::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 COLUMN "; @@ -120,16 +120,16 @@ QString SqlGeneratorBase::diff(FieldModel *oldField, FieldModel *newField) QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable) { - if(oldTable && newTable) - if(*oldTable == *newTable) + if (oldTable && newTable) + if (*oldTable == *newTable) return ""; - if(!newTable) + if (!newTable) return "DROP TABLE " + oldTable->name(); QSet fieldNames; - if(oldTable) + if (oldTable) foreach (FieldModel *f, oldTable->fields()) fieldNames.insert(f->name); @@ -139,31 +139,28 @@ QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable) QStringList columnSql; foreach (QString fieldName, fieldNames) { FieldModel *newField = newTable->field(fieldName); - if(oldTable){ + if (oldTable) { FieldModel *oldField = oldTable->field(fieldName); - QString buffer = diff(oldField, newField); - if(!buffer.isNull()) + QString buffer = diff(oldField, newField); + if (!buffer.isNull()) columnSql << buffer; - }else{ + } else { columnSql << fieldDeclare(newField); } } QString sql; - if(oldTable){ - sql = QString("ALTER TABLE %1 \n%2") - .arg(newTable->name()) - .arg(columnSql.join(",\n")); - }else{ - if(!newTable->primaryKey().isNull()) + if (oldTable) { + sql = QString("ALTER TABLE %1 \n%2").arg(newTable->name()).arg( + columnSql.join(",\n")); + } else { + if (!newTable->primaryKey().isNull()) columnSql << QString("CONSTRAINT pk_%1 PRIMARY KEY (%2)") - .arg(newTable->name()) - .arg(newTable->primaryKey()); - - sql = QString("CREATE TABLE %1 \n(%2)") - .arg(newTable->name()) - .arg(columnSql.join(",\n")); + .arg(newTable->name()) + .arg(newTable->primaryKey()); + sql = QString("CREATE TABLE %1 \n(%2)").arg(newTable->name()).arg( + columnSql.join(",\n")); } return sql; } @@ -175,20 +172,21 @@ QString SqlGeneratorBase::insertRecord(Table *t, QString tableName) QStringList values; foreach (QString f, t->changedProperties()) - if(f != key) - values.append("'" + t->property(f.toLatin1().data()).toString() + "'"); + if (f != key) + values.append("'" + t->property(f.toLatin1().data()).toString() + + "'"); QString changedPropertiesText = ""; QSet props = t->changedProperties(); foreach (QString s, props) { - if(changedPropertiesText != "") + if (changedPropertiesText != "") changedPropertiesText.append(", "); changedPropertiesText.append(s); } sql = QString("INSERT INTO %1 (%2) VALUES (%3)") - .arg(tableName) - .arg(changedPropertiesText) - .arg(values.join(", ")); + .arg(tableName) + .arg(changedPropertiesText) + .arg(values.join(", ")); return sql; } @@ -200,13 +198,14 @@ QString SqlGeneratorBase::updateRecord(Table *t, QString tableName) QStringList values; foreach (QString f, t->changedProperties()) - if(f != key) - values.append(f + "='" + t->property(f.toLatin1().data()).toString() + "'"); + if (f != key) + values.append(f + "='" + t->property(f.toLatin1().data()).toString() + + "'"); sql = QString("UPDATE %1 SET %2 WHERE %3=%4") - .arg(tableName) - .arg(values.join(", ")) - .arg(key) - .arg(t->primaryValue().toString()); + .arg(tableName) + .arg(values.join(", ")) + .arg(key) + .arg(t->primaryValue().toString()); return sql; } @@ -214,12 +213,13 @@ QString SqlGeneratorBase::updateRecord(Table *t, QString tableName) QString SqlGeneratorBase::deleteRecord(Table *t, QString tableName) { return QString("DELETE FROM %1 WHERE %2='%3'") - .arg(tableName) - .arg(t->primaryKey()) - .arg(t->primaryValue().toString()); + .arg(tableName) + .arg(t->primaryKey()) + .arg(t->primaryValue().toString()); } -QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg) const +QString SqlGeneratorBase::agregateText(const AgregateType &t, + const QString &arg) const { switch (t) { case SelectAll: @@ -251,26 +251,32 @@ QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg } } -QString SqlGeneratorBase::fromTableText(const QString &tableName, QString &joinClassName, QString &orderBy) const +QString SqlGeneratorBase::fromTableText(const QString &tableName, + QString &joinClassName, + QString &orderBy) const { QString tableNameText = tableName; - if(!joinClassName.isNull()){ + if (!joinClassName.isNull()) { QString joinTableName = _database->tableName(joinClassName); - RelationModel *rel = _database->model().relationByTableNames(tableName, joinTableName); - if(rel){ - QString pk = _database->model().model(tableName)->primaryKey(); - tableNameText = QString("%1 INNER JOIN %2 ON (%1.%3 = %2.%4)") - .arg(tableName) - .arg(joinTableName) - .arg(pk) - .arg(rel->localColumn); + RelationModel *rel + = _database->model().relationByTableNames(tableName, joinTableName); + if (rel) { + QString pk = _database->model().tableByName(tableName)->primaryKey(); + tableNameText = QString("%1 INNER JOIN %2 ON (%1.%3 = %2.%4)") + .arg(tableName) + .arg(joinTableName) + .arg(pk) + .arg(rel->localColumn); orderBy = tableName + "." + pk; - }else{ - qWarning(QString("Relation between table %1 and class %2 (%3) not exists!") - .arg(tableName) - .arg(joinClassName) - .arg(joinTableName.isNull() ? "NULL" : joinTableName) - .toLatin1().data()); + } else { + qWarning( + QString( + "Relation between table %1 and class %2 (%3) not exists!") + .arg(tableName) + .arg(joinClassName) + .arg(joinTableName.isNull() ? "NULL" : joinTableName) + .toLatin1() + .data()); joinClassName = QString::null; } } @@ -281,7 +287,7 @@ QString SqlGeneratorBase::fromTableText(const QString &tableName, QString &joinC QString SqlGeneratorBase::deleteRecords(QString tableName, QString where) { QString sql = ""; - if(where.isEmpty() || where.isNull()) + if (where.isEmpty() || where.isNull()) sql = "DELETE FROM " + tableName; else sql = "DELETE FROM " + tableName + " WHERE " + where; @@ -291,86 +297,51 @@ QString SqlGeneratorBase::deleteRecords(QString tableName, QString where) return sql; } -QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QString agregateArg, QList &wheres, QList &orders, QString tableName, QString joinClassName) +QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, + QString agregateArg, + QList &wheres, + QList &orders, + QString tableName, + QString joinClassName) { QString select = agregateText(t, agregateArg); QString where = createWhere(wheres); QString order = ""; QString from = fromTableText(tableName, joinClassName, order); - foreach(WherePhrase p, orders){ - if(order != "") + foreach (WherePhrase p, orders) { + if (order != "") order.append(", "); order.append(phraseOrder(p.data())); } QString sql = "SELECT " + select + " FROM " + from; - if(where != "") + if (where != "") sql.append(" WHERE " + where); - if(order != "") + if (order != "") sql.append(" ORDER BY " + order); - for(int i = 0; i < _database->model().count(); i++) - sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); + for (int i = 0; i < _database->model().count(); i++) + sql = sql.replace(_database->model().at(i)->className() + ".", + _database->model().at(i)->name() + "."); replaceTableNames(sql); return sql; } -QString SqlGeneratorBase::selectCommand(QString selectPhrase, QString agregateArg, - QList &wheres, QList &orders, - QString tableName, QString joinClassName) -{ - QString where = createWhere(wheres); - QString order = ""; - QString from = fromTableText(tableName, joinClassName, order); - - foreach(WherePhrase p, orders){ - if(order != "") - order.append(", "); - order.append(phraseOrder(p.data())); - } - - QString sql = "SELECT " + selectPhrase + " FROM " + from; - - if(where != "") - sql.append(" WHERE " + where); - - if(order != "") - sql.append(" ORDER BY " + order); - - for(int i = 0; i < _database->model().count(); i++) - sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); - - replaceTableNames(sql); - - return sql; -} - -QString SqlGeneratorBase::selectCommand(QList &wheres, QHash &orders, QString tableName, QString joinClassName) -{ - return selectCommand("*", wheres, orders, tableName, joinClassName); -} - QString SqlGeneratorBase::createWhere(QList &wheres) { QString whereText = ""; -// for (int i = 0; i < wheres.count(); i++) { -// if(whereText != "") -// whereText.append(" AND "); -// whereText.append(phrase(wheres[i].data())); -// } + foreach (WherePhrase w, wheres) { - if(whereText != "") + if (whereText != "") whereText.append(" AND "); whereText.append(phrase(w.data())); } -// if(whereText != "") -// whereText.prepend(" WHERE "); return whereText; } @@ -378,93 +349,49 @@ QString SqlGeneratorBase::createWhere(QList &wheres) void SqlGeneratorBase::replaceTableNames(QString &command) { foreach (TableModel *m, TableModel::allModels()) - command = command.replace("[" + m->className() + "]." , m->name() + "."); + command = command.replace("[" + m->className() + "].", m->name() + "."); } -QString SqlGeneratorBase::selectCommand(QString selectPhrase, QList &wheres, QHash &orders, QString tableName, QString joinClassName) -{ - QString orderText = ""; - QStringList orderby; - - QString whereText = createWhere(wheres); - - if(whereText != "") - whereText.prepend(" WHERE "); - - QString tableNameText = tableName; - if(!joinClassName.isNull()){ - QString joinTableName = _database->tableName(joinClassName); - RelationModel *rel = _database->model().relationByTableNames(tableName, joinTableName); - if(rel){ - QString pk = _database->model().model(tableName)->primaryKey(); - tableNameText = QString("%1 INNER JOIN %2 ON (%1.%3 = %2.%4)") - .arg(tableName) - .arg(joinTableName) - .arg(pk) - .arg(rel->localColumn); - orderby.append(tableName + "." + pk); - }else{ - qWarning("Relation between table %s and class %s (%s) not exists!", - qPrintable(tableName), - qPrintable(joinClassName), - qPrintable(joinTableName.isNull() ? "NULL" : joinTableName)); - joinClassName = QString::null; - } - } - - if(orders.count()) - foreach (QString o, orders.keys()) -// orderby.append(o + (orders.value(o) ? " ASC" : " DESC")); - orderby.append(o + " " + orders.value(o)); - - if(orderby.count()) - orderText = " ORDER BY " + orderby.join(", "); - - QString command = "SELECT " - +selectPhrase - + " FROM " - + tableNameText - + whereText - + orderText; - - replaceTableNames(command); - - return command; -} - -QString SqlGeneratorBase::deleteCommand(QList &wheres, QString tableName) +QString SqlGeneratorBase::deleteCommand(QList &wheres, + QString tableName) { QString command = "DELETE FROM " + tableName; QString where = createWhere(wheres); - if(where != "") + if (where != "") command.append(" WHERE " + where); - for(int i = 0; i < _database->model().count(); i++) - command = command.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + "."); + for (int i = 0; i < _database->model().count(); i++) + command = command.replace(_database->model().at(i)->className() + ".", + _database->model().at(i)->name() + "."); replaceTableNames(command); return command; } -QString SqlGeneratorBase::updateCommand(WherePhrase &phrase, QList &wheres, QString tableName) +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 != "") + 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() + "."); + for (int i = 0; i < _database->model().count(); i++) + sql = sql.replace(_database->model().at(i)->className() + ".", + _database->model().at(i)->name() + "."); + + replaceTableNames(sql); return sql; } -QString SqlGeneratorBase::escapeValue(const QVariant &v)const +QString SqlGeneratorBase::escapeValue(const QVariant &v) const { switch (v.type()) { case QVariant::Bool: @@ -513,7 +440,8 @@ QString SqlGeneratorBase::escapeValue(const QVariant &v)const return ""; } -QVariant SqlGeneratorBase::readValue(const QVariant::Type &type, const QVariant &dbValue) +QVariant SqlGeneratorBase::readValue(const QVariant::Type &type, + const QVariant &dbValue) { return dbValue; } @@ -523,16 +451,16 @@ QString SqlGeneratorBase::phraseOrder(const PhraseData *d) const QString ret = ""; - switch(d->type){ + switch (d->type) { case PhraseData::Field: - if(d->operatorCond == PhraseData::Not) + if (d->operatorCond == PhraseData::Not) ret = d->text + " DESC"; else ret = d->text; break; case PhraseData::WithOther: - if(d->operatorCond != PhraseData::Append) + if (d->operatorCond != PhraseData::Append) qFatal("Order phease can only have & operator"); ret = phraseOrder(d->left) + ", " + phraseOrder(d->right); @@ -550,17 +478,19 @@ QString SqlGeneratorBase::phrase(const PhraseData *d) const { QString ret = ""; - switch(d->type){ + switch (d->type) { case PhraseData::Field: ret = d->text; break; case PhraseData::WithVariant: - ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + escapeValue(d->operand); + ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + + escapeValue(d->operand); break; case PhraseData::WithOther: - ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + phrase(d->right); + ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + + phrase(d->right); break; case PhraseData::WithoutOperand: @@ -571,7 +501,7 @@ QString SqlGeneratorBase::phrase(const PhraseData *d) const ret = ""; } - if(d->operatorCond == PhraseData::And || d->operatorCond == PhraseData::Or) + if (d->operatorCond == PhraseData::And || d->operatorCond == PhraseData::Or) ret = "(" + ret + ")"; return ret; @@ -581,20 +511,23 @@ QString SqlGeneratorBase::phraseUpdate(const PhraseData *d) const { QString ret = ""; - if (d->operatorCond != PhraseData::And && d->operatorCond != PhraseData::Equal) + if (d->operatorCond != PhraseData::And + && d->operatorCond != PhraseData::Equal) qFatal("Update command does not accept any phrase else &, ="); - switch(d->type){ + switch (d->type) { case PhraseData::Field: ret = d->text; break; case PhraseData::WithVariant: - ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + escapeValue(d->operand); + ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + + escapeValue(d->operand); break; case PhraseData::WithOther: - ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + phrase(d->right); + ret = phrase(d->left) + " " + operatorString(d->operatorCond) + " " + + phrase(d->right); break; case PhraseData::WithoutOperand: @@ -605,15 +538,16 @@ QString SqlGeneratorBase::phraseUpdate(const PhraseData *d) const ret = ""; } - if(d->operatorCond == PhraseData::And || d->operatorCond == PhraseData::Or) + if (d->operatorCond == PhraseData::And || d->operatorCond == PhraseData::Or) ret = "(" + ret + ")"; return ret; } -QString SqlGeneratorBase::operatorString(const PhraseData::Condition &cond) const +QString +SqlGeneratorBase::operatorString(const PhraseData::Condition &cond) const { - switch (cond){ + switch (cond) { case PhraseData::Equal: return "="; case PhraseData::NotEqual: @@ -667,5 +601,4 @@ QString SqlGeneratorBase::operatorString(const PhraseData::Condition &cond) cons return QString(""); } - NUT_END_NAMESPACE diff --git a/src/sqlgeneratorbase_p.h b/src/sqlgeneratorbase_p.h index 86718c3..0214057 100644 --- a/src/sqlgeneratorbase_p.h +++ b/src/sqlgeneratorbase_p.h @@ -76,19 +76,12 @@ public: virtual QString deleteRecords(QString tableName, QString where); - virtual QString selectCommand(AgregateType t, QString agregateArg, - QList &wheres, QList &orders, - QString tableName, QString joinClassName); - - virtual QString selectCommand(QString selectPhrase, QString agregateArg, - QList &wheres, QList &orders, - QString tableName, QString joinClassName); - - virtual QString selectCommand(QList &wheres, QHash &orders, - QString tableName, QString joinClassName); - virtual QString selectCommand(QString selectPhrase, - QList &wheres, QHash &orders, - QString tableName, QString joinClassName); + virtual QString selectCommand(AgregateType t, + QString agregateArg, + QList &wheres, + QList &orders, + QString tableName, + QString joinClassName); virtual QString deleteCommand(QList &wheres, QString tableName);