diff --git a/src/database.cpp b/src/database.cpp index b923e34..5420c42 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -48,6 +48,7 @@ NUT_BEGIN_NAMESPACE int DatabasePrivate::lastId = 0; +QMap DatabasePrivate::allTableMaps; DatabasePrivate::DatabasePrivate(Database *parent) : q_ptr(parent) { @@ -56,8 +57,8 @@ DatabasePrivate::DatabasePrivate(Database *parent) : q_ptr(parent) bool DatabasePrivate::open(bool update) { Q_Q(Database); - if (update) - getCurrectScheema(); +// if (update) + bool isNew = getCurrectScheema(); connectionName = q->metaObject()->className() + QString::number(DatabasePrivate::lastId); @@ -98,7 +99,7 @@ bool DatabasePrivate::open(bool update) return false; } - if(update) + if(isNew) return updateDatabase(); else return true; @@ -124,7 +125,6 @@ bool DatabasePrivate::updateDatabase() QStringList sql = sqlGenertor->diff(last, current); db.transaction(); foreach (QString s, sql) { - qDebug() <<"cmd="<metaObject()->className())) { + currentModel = allTableMaps[q->metaObject()->className()]; + return false; + } + tables.clear(); // TODO: change logs must not be in model @@ -201,7 +206,6 @@ void DatabasePrivate::getCurrectScheema() QMetaProperty tableProperty = q->metaObject()->property(i); int typeId = QMetaType::type(tableProperty.typeName()); - qDebug() << tables.values().contains(tableProperty.name()) << typeId; if (tables.values().contains(tableProperty.name()) && typeId >= QVariant::UserType) { TableModel *sch = new TableModel(typeId, tableProperty.name()); @@ -212,6 +216,9 @@ void DatabasePrivate::getCurrectScheema() foreach (TableModel *sch, currentModel) foreach (RelationModel *fk, sch->foregionKeys()) fk->table = currentModel.modelByClass(fk->className); + + allTableMaps.insert(q->metaObject()->className(), currentModel); + return true; } DatabaseModel DatabasePrivate::getLastScheema() @@ -251,7 +258,6 @@ DatabaseModel DatabasePrivate::getLastScheema() // ret.append(sch); // } // } - // qDebug() << "ret=" <tables[className]; + return model().modelByClass(className)->name(); } void Database::setDatabaseName(QString databaseName) @@ -494,8 +500,9 @@ QSqlQuery Database::exec(QString sql) QSqlQuery q = d->db.exec(sql); if (d->db.lastError().type() != QSqlError::NoError) - qWarning("Error executing sql command: %s", - d->db.lastError().text().toLatin1().data()); + qWarning("Error executing sql command: %s; Command=%s", + d->db.lastError().text().toLatin1().data(), + sql.toUtf8().constData()); return q; } @@ -504,10 +511,12 @@ void Database::add(TableSetBase *t) tableSets.insert(t); } -void Database::saveChanges() +int Database::saveChanges() { + int rowsAffected = 0; foreach (TableSetBase *ts, tableSets) - ts->save(this); + rowsAffected += ts->save(this); + return rowsAffected; } void Database::cleanUp() diff --git a/src/database.h b/src/database.h index 79dd6e9..96aa277 100644 --- a/src/database.h +++ b/src/database.h @@ -54,7 +54,7 @@ public: QSqlQuery exec(QString sql); void add(TableSetBase *); - void saveChanges(); + int saveChanges(); void cleanUp(); QString databaseName() const; diff --git a/src/database_p.h b/src/database_p.h index 5a19e95..ac01411 100644 --- a/src/database_p.h +++ b/src/database_p.h @@ -44,7 +44,7 @@ public: void createChangeLogs(); bool storeScheemaInDB(); DatabaseModel getLastScheema(); - void getCurrectScheema(); + bool getCurrectScheema(); QSqlDatabase db; @@ -56,13 +56,15 @@ public: QString connectionName; QString driver; - QHash tables; SqlGeneratorBase *sqlGenertor; DatabaseModel currentModel; TableSet *changeLogs; + QT_DEPRECATED + QHash tables; + static QMap allTableMaps; static int lastId; }; diff --git a/src/databasemodel.cpp b/src/databasemodel.cpp index 44e74e1..c8dc6d2 100644 --- a/src/databasemodel.cpp +++ b/src/databasemodel.cpp @@ -43,6 +43,10 @@ TableModel *DatabaseModel::model(QString tableName) const if(s->name() == tableName) return s; } + + qWarning("Table with name '%s' not found in model", + qUtf8Printable(tableName)); + Q_UNREACHABLE(); return 0; } @@ -53,6 +57,10 @@ TableModel *DatabaseModel::modelByClass(QString className) const if(s->className() == className) return s; } + + qWarning("Table with class name '%s' not found in model", + qUtf8Printable(className)); + Q_UNREACHABLE(); return 0; } diff --git a/src/query.h b/src/query.h index ff128a8..1c3b02b 100644 --- a/src/query.h +++ b/src/query.h @@ -56,10 +56,7 @@ public: QVariant max(FieldPhrase &f); QVariant min(FieldPhrase &f); - QVariant average(FieldPhrase &f){ - //TODO: ... - return QVariant(); - } + QVariant average(FieldPhrase &f); Query *join(const QString &tableName); Query *setWhere(WherePhrase where); @@ -87,8 +84,8 @@ Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, TableSetBase *tableSet) d->database = database; d->tableSet = tableSet; - d->tableName = TableModel::findByClassName(T::staticMetaObject.className())->name(); - //d->database->tableName(T::staticMetaObject.className()); + d->tableName = //TableModel::findByClassName(T::staticMetaObject.className())->name(); + d->database->model().modelByClass(T::staticMetaObject.className())->name(); } template @@ -113,17 +110,18 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) d->orderPhrases, d->tableName, d->joinClassName); - qDebug() << "sql="<database->exec(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().model(d->tableName)->primaryKey(); QVariant lastPkValue = QVariant(); int childTypeId = 0; T *lastRow = 0; TableSetBase *childTableSet; - 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().model(d->tableName)->fieldsNames(); QStringList childFields; if(!d->joinClassName.isNull()) { TableModel *joinTableModel = TableModel::findByClassName(d->joinClassName); @@ -131,8 +129,8 @@ Q_OUTOFLINE_TEMPLATE QList Query::toList(int count) // 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().model(joinTableName)->typeId(); +// childTypeId = TableModel::findByName(joinTableName)->typeId(); } } @@ -200,6 +198,7 @@ Q_OUTOFLINE_TEMPLATE int Query::count() d->select = "COUNT(*)"; QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand("COUNT(*)", d->wheres, d->orders, d->tableName, d->joinClassName)); + qDebug() << "sql="<database->sqlGenertor()->selectCommand("COUNT(*)", d->wheres, d->orders, d->tableName, d->joinClassName); if(q.next()) return q.value(0).toInt(); return 0; @@ -227,6 +226,18 @@ Q_OUTOFLINE_TEMPLATE QVariant Query::min(FieldPhrase &f){ return 0; } +template +Q_OUTOFLINE_TEMPLATE QVariant Query::average(FieldPhrase &f) +{ + Q_D(Query); + + QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand("AVG(" + f.data()->text + ")", d->wheres, d->orders, d->tableName, d->joinClassName)); + + if(q.next()) + return q.value(0).toInt(); + return 0; +} + template Q_OUTOFLINE_TEMPLATE int Query::remove() { diff --git a/src/sqlgeneratorbase.cpp b/src/sqlgeneratorbase.cpp index 2afea5a..3c69fe5 100644 --- a/src/sqlgeneratorbase.cpp +++ b/src/sqlgeneratorbase.cpp @@ -51,6 +51,7 @@ QString SqlGeneratorBase::masterDatabaseName(QString databaseName) QString SqlGeneratorBase::saveRecord(Table *t, QString tableName) { + Q_ASSERT(!tableName.isEmpty() && !tableName.isNull()); switch(t->status()){ case Table::Added: return insertRecord(t, tableName); diff --git a/src/table.cpp b/src/table.cpp index 2825e62..e8b62d6 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -121,7 +121,7 @@ void Table::setTableSet(TableSetBase *parent) _tableSet->add(this); } -void Table::save(Database *db) +int Table::save(Database *db) { QSqlQuery q = db->exec(db->sqlGenertor()->saveRecord(this, db->tableName(metaObject()->className()))); @@ -131,6 +131,8 @@ void Table::save(Database *db) foreach(TableSetBase *ts, tableSets) ts->save(db); setStatus(FeatchedFromDB); + + return q.numRowsAffected(); } Table::Status Table::status() const diff --git a/src/table.h b/src/table.h index 3df4ee5..ca5d411 100644 --- a/src/table.h +++ b/src/table.h @@ -49,7 +49,7 @@ public: }; void add(TableSetBase *); - void save(Database *db); + int save(Database *db); QString primaryKey() const; bool isPrimaryKeyAutoIncrement() const; diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index cc3f9cf..32688bc 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -103,13 +103,13 @@ TableModel *TableModel::findByTypeId(int typeId) return 0; } -TableModel *TableModel::findByName(QString name) -{ - foreach (TableModel *model, _allModels) - if(model->name() == name) - return model; - return 0; -} +//TableModel *TableModel::findByName(QString name) +//{ +// foreach (TableModel *model, _allModels) +// if(model->name() == name) +// return model; +// return 0; +//} TableModel *TableModel::findByClassName(QString className) { @@ -146,6 +146,10 @@ bool TableModel::operator !=(const TableModel &t) const TableModel::TableModel(int typeId, QString tableName) { + //TODO: check that +// if (findByTypeId(typeId)) +// return; + const QMetaObject *tableMetaObject = QMetaType::metaObjectForType(typeId); _typeId = typeId; @@ -238,8 +242,8 @@ TableModel::TableModel(int typeId, QString tableName) } } - _allModels.insert(this); - qDebug() << "all models"<<_allModels; + if(!findByTypeId(typeId) && !tableName.isNull()) + _allModels.insert(this); } /* @@ -267,7 +271,6 @@ TableModel::TableModel(QJsonObject json, QString tableName) QJsonObject fieldObject = fields.value(key).toObject(); FieldModel *f = new FieldModel; f->name = fieldObject.value(__NAME).toString(); - qDebug() << "fieldObject.value(__TYPE).toString()"<type = QVariant::nameToType(fieldObject.value(__TYPE).toString().toLatin1().data()); if(fieldObject.contains(__nut_NOT_NULL)) @@ -288,7 +291,6 @@ TableModel::TableModel(QJsonObject json, QString tableName) field(json.value(__nut_PRIMARY_KEY).toString())->isAutoIncrement = true; _allModels.insert(this); - } QJsonObject TableModel::toJson() const diff --git a/src/tablemodel.h b/src/tablemodel.h index 36f040e..3e2b9c6 100644 --- a/src/tablemodel.h +++ b/src/tablemodel.h @@ -73,7 +73,7 @@ class TableModel { public: - TableModel(int typeId, QString tableName); + TableModel(int typeId, QString tableName = QString::null); TableModel(QJsonObject json, QString tableName); QJsonObject toJson() const; @@ -103,7 +103,7 @@ public: static QSet allModels(); static TableModel *findByTypeId(int typeId); - static TableModel *findByName(QString name); +// static TableModel *findByName(QString name); static TableModel *findByClassName(QString className); bool operator ==(const TableModel &t) const; diff --git a/src/tablesetbase.cpp b/src/tablesetbase.cpp index b29a40b..e9bc7f5 100644 --- a/src/tablesetbase.cpp +++ b/src/tablesetbase.cpp @@ -35,8 +35,9 @@ TableSetBase::TableSetBase(Table *parent) : QObject(parent), _database(0), _tabl parent->add(this); } -void TableSetBase::save(Database *db) +int TableSetBase::save(Database *db) { + int rowsAffected = 0; foreach (Table *t, _tablesList) { if(_table) t->setParentTable(_table); @@ -44,9 +45,11 @@ void TableSetBase::save(Database *db) if(t->status() == Table::Added || t->status() == Table::Modified || t->status() == Table::Deleted){ - t->save(db); + rowsAffected += t->save(db); } } + + return rowsAffected; } void TableSetBase::clearChilds() diff --git a/src/tablesetbase_p.h b/src/tablesetbase_p.h index 307e0e0..50dd5a6 100644 --- a/src/tablesetbase_p.h +++ b/src/tablesetbase_p.h @@ -38,7 +38,7 @@ public: TableSetBase(Database *parent); TableSetBase(Table *parent); - virtual void save(Database *db); + virtual int save(Database *db); void clearChilds(); void add(Table* t); QString childClassName() const;