/************************************************************************** ** ** This file is part of Nut project. ** https://github.com/HamedMasafi/Nut ** ** Nut is free software: you can redistribute it and/or modify ** it under the terms of the GNU Lesser General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** Nut is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with Nut. If not, see . ** **************************************************************************/ #include "databasemodel.h" #include "tablemodel.h" #include NUT_BEGIN_NAMESPACE QMap DatabaseModel::_models; DatabaseModel::DatabaseModel(const QString &name) : QList(), _databaseClassName(name), _version(QString::null) { _models.insert(name, this); } DatabaseModel::DatabaseModel(const DatabaseModel &other) : QList(other), _version(QString::null) { } TableModel *DatabaseModel::tableByName(QString tableName) const { for(int i = 0; i < size(); i++){ TableModel *s = at(i); if(s->name() == tableName) return s; } qWarning("Table with name '%s' not found in model", qUtf8Printable(tableName)); return 0; } TableModel *DatabaseModel::tableByClassName(QString className) const { for(int i = 0; i < size(); i++){ TableModel *s = at(i); if(s->className() == className) return s; } qWarning("Table with class name '%s' not found in model", qUtf8Printable(className)); // Q_UNREACHABLE(); return 0; } bool DatabaseModel::operator ==(const DatabaseModel &other) const { if(size() != other.size()) return false; for(int i = 0; i < size(); i++){ TableModel *mine = at(i); TableModel *others = other.tableByName(mine->name()); if(!others) return false; if(*mine != *others) return false; } return true; } QJsonObject DatabaseModel::toJson() const { QJsonObject obj; // obj.insert(QT_STRINGIFY(versionMajor), QJsonValue(_versionMajor)); // obj.insert(QT_STRINGIFY(versionMinor), QJsonValue(_versionMinor)); for(int i = 0; i < size(); i++){ TableModel *s = at(i); obj.insert(s->name(), s->toJson()); } return obj; } RelationModel *DatabaseModel::relationByClassNames(const QString &masterClassName, const QString &childClassName) { TableModel *childTable = tableByClassName(childClassName); if(!childTable) return 0; foreach (RelationModel *rel, childTable->foregionKeys()) if(rel->className == masterClassName) return rel; return 0; } RelationModel *DatabaseModel::relationByTableNames(const QString &masterTableName, const QString &childTableName) { TableModel *childTable = tableByName(childTableName); if(!childTable) return 0; foreach (RelationModel *rel, childTable->foregionKeys()) if(rel->table->name() == masterTableName) return rel; return 0; } DatabaseModel DatabaseModel::fromJson(QJsonObject &json) { DatabaseModel model(QString::null); // model.setVersionMajor(json.value(QT_STRINGIFY(versionMajor)).toInt()); // model.setVersionMinor(json.value(QT_STRINGIFY(versionMinor)).toInt()); foreach (QString key, json.keys()) { if(!json.value(key).isObject()) continue; TableModel *sch = new TableModel(json.value(key).toObject(), key); model.append(sch); } return model; } QString DatabaseModel::version() const { return _version; } void DatabaseModel::setVersion(QString version) { _version = version; } bool DatabaseModel::remove(const QString &tableName) { for(int i = 0; i < size(); i++){ TableModel *s = at(i); if(s->name() == tableName){ removeAt(i); return true; } } return false; } DatabaseModel *DatabaseModel::modelByName(const QString &name) { if (_models.contains(name)) return _models[name]; return Q_NULLPTR; } NUT_END_NAMESPACE