This commit is contained in:
blackdal 2017-05-28 19:38:59 +04:30
parent 805f56c76a
commit d780bf234a
12 changed files with 84 additions and 46 deletions

View File

@ -48,6 +48,7 @@
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
int DatabasePrivate::lastId = 0; int DatabasePrivate::lastId = 0;
QMap<QString, DatabaseModel> DatabasePrivate::allTableMaps;
DatabasePrivate::DatabasePrivate(Database *parent) : q_ptr(parent) DatabasePrivate::DatabasePrivate(Database *parent) : q_ptr(parent)
{ {
@ -56,8 +57,8 @@ DatabasePrivate::DatabasePrivate(Database *parent) : q_ptr(parent)
bool DatabasePrivate::open(bool update) bool DatabasePrivate::open(bool update)
{ {
Q_Q(Database); Q_Q(Database);
if (update) // if (update)
getCurrectScheema(); bool isNew = getCurrectScheema();
connectionName = q->metaObject()->className() connectionName = q->metaObject()->className()
+ QString::number(DatabasePrivate::lastId); + QString::number(DatabasePrivate::lastId);
@ -98,7 +99,7 @@ bool DatabasePrivate::open(bool update)
return false; return false;
} }
if(update) if(isNew)
return updateDatabase(); return updateDatabase();
else else
return true; return true;
@ -124,7 +125,6 @@ bool DatabasePrivate::updateDatabase()
QStringList sql = sqlGenertor->diff(last, current); QStringList sql = sqlGenertor->diff(last, current);
db.transaction(); db.transaction();
foreach (QString s, sql) { foreach (QString s, sql) {
qDebug() <<"cmd="<<s;
db.exec(s); db.exec(s);
if (db.lastError().type() != QSqlError::NoError) if (db.lastError().type() != QSqlError::NoError)
@ -158,9 +158,14 @@ bool DatabasePrivate::updateDatabase()
return ok; return ok;
} }
void DatabasePrivate::getCurrectScheema() bool DatabasePrivate::getCurrectScheema()
{ {
Q_Q(Database); Q_Q(Database);
if (allTableMaps.contains(q->metaObject()->className())) {
currentModel = allTableMaps[q->metaObject()->className()];
return false;
}
tables.clear(); tables.clear();
// TODO: change logs must not be in model // TODO: change logs must not be in model
@ -201,7 +206,6 @@ void DatabasePrivate::getCurrectScheema()
QMetaProperty tableProperty = q->metaObject()->property(i); QMetaProperty tableProperty = q->metaObject()->property(i);
int typeId = QMetaType::type(tableProperty.typeName()); int typeId = QMetaType::type(tableProperty.typeName());
qDebug() << tables.values().contains(tableProperty.name()) << typeId;
if (tables.values().contains(tableProperty.name()) if (tables.values().contains(tableProperty.name())
&& typeId >= QVariant::UserType) { && typeId >= QVariant::UserType) {
TableModel *sch = new TableModel(typeId, tableProperty.name()); TableModel *sch = new TableModel(typeId, tableProperty.name());
@ -212,6 +216,9 @@ void DatabasePrivate::getCurrectScheema()
foreach (TableModel *sch, currentModel) foreach (TableModel *sch, currentModel)
foreach (RelationModel *fk, sch->foregionKeys()) foreach (RelationModel *fk, sch->foregionKeys())
fk->table = currentModel.modelByClass(fk->className); fk->table = currentModel.modelByClass(fk->className);
allTableMaps.insert(q->metaObject()->className(), currentModel);
return true;
} }
DatabaseModel DatabasePrivate::getLastScheema() DatabaseModel DatabasePrivate::getLastScheema()
@ -251,7 +258,6 @@ DatabaseModel DatabasePrivate::getLastScheema()
// ret.append(sch); // ret.append(sch);
// } // }
// } // }
// qDebug() << "ret=" <<ret;
// return ret; // return ret;
} }
@ -385,7 +391,7 @@ DatabaseModel Database::model() const
QString Database::tableName(QString className) QString Database::tableName(QString className)
{ {
Q_D(Database); Q_D(Database);
return d->tables[className]; return model().modelByClass(className)->name();
} }
void Database::setDatabaseName(QString databaseName) void Database::setDatabaseName(QString databaseName)
@ -494,8 +500,9 @@ QSqlQuery Database::exec(QString sql)
QSqlQuery q = d->db.exec(sql); QSqlQuery q = d->db.exec(sql);
if (d->db.lastError().type() != QSqlError::NoError) if (d->db.lastError().type() != QSqlError::NoError)
qWarning("Error executing sql command: %s", qWarning("Error executing sql command: %s; Command=%s",
d->db.lastError().text().toLatin1().data()); d->db.lastError().text().toLatin1().data(),
sql.toUtf8().constData());
return q; return q;
} }
@ -504,10 +511,12 @@ void Database::add(TableSetBase *t)
tableSets.insert(t); tableSets.insert(t);
} }
void Database::saveChanges() int Database::saveChanges()
{ {
int rowsAffected = 0;
foreach (TableSetBase *ts, tableSets) foreach (TableSetBase *ts, tableSets)
ts->save(this); rowsAffected += ts->save(this);
return rowsAffected;
} }
void Database::cleanUp() void Database::cleanUp()

View File

@ -54,7 +54,7 @@ public:
QSqlQuery exec(QString sql); QSqlQuery exec(QString sql);
void add(TableSetBase *); void add(TableSetBase *);
void saveChanges(); int saveChanges();
void cleanUp(); void cleanUp();
QString databaseName() const; QString databaseName() const;

View File

@ -44,7 +44,7 @@ public:
void createChangeLogs(); void createChangeLogs();
bool storeScheemaInDB(); bool storeScheemaInDB();
DatabaseModel getLastScheema(); DatabaseModel getLastScheema();
void getCurrectScheema(); bool getCurrectScheema();
QSqlDatabase db; QSqlDatabase db;
@ -56,13 +56,15 @@ public:
QString connectionName; QString connectionName;
QString driver; QString driver;
QHash<QString, QString> tables;
SqlGeneratorBase *sqlGenertor; SqlGeneratorBase *sqlGenertor;
DatabaseModel currentModel; DatabaseModel currentModel;
TableSet<ChangeLogTable> *changeLogs; TableSet<ChangeLogTable> *changeLogs;
QT_DEPRECATED
QHash<QString, QString> tables;
static QMap<QString, DatabaseModel> allTableMaps;
static int lastId; static int lastId;
}; };

View File

@ -43,6 +43,10 @@ TableModel *DatabaseModel::model(QString tableName) const
if(s->name() == tableName) if(s->name() == tableName)
return s; return s;
} }
qWarning("Table with name '%s' not found in model",
qUtf8Printable(tableName));
Q_UNREACHABLE();
return 0; return 0;
} }
@ -53,6 +57,10 @@ TableModel *DatabaseModel::modelByClass(QString className) const
if(s->className() == className) if(s->className() == className)
return s; return s;
} }
qWarning("Table with class name '%s' not found in model",
qUtf8Printable(className));
Q_UNREACHABLE();
return 0; return 0;
} }

View File

@ -56,10 +56,7 @@ public:
QVariant max(FieldPhrase<int> &f); QVariant max(FieldPhrase<int> &f);
QVariant min(FieldPhrase<int> &f); QVariant min(FieldPhrase<int> &f);
QVariant average(FieldPhrase<int> &f){ QVariant average(FieldPhrase<int> &f);
//TODO: ...
return QVariant();
}
Query<T> *join(const QString &tableName); Query<T> *join(const QString &tableName);
Query<T> *setWhere(WherePhrase where); Query<T> *setWhere(WherePhrase where);
@ -87,8 +84,8 @@ Q_OUTOFLINE_TEMPLATE Query<T>::Query(Database *database, TableSetBase *tableSet)
d->database = database; d->database = database;
d->tableSet = tableSet; d->tableSet = tableSet;
d->tableName = TableModel::findByClassName(T::staticMetaObject.className())->name(); d->tableName = //TableModel::findByClassName(T::staticMetaObject.className())->name();
//d->database->tableName(T::staticMetaObject.className()); d->database->model().modelByClass(T::staticMetaObject.className())->name();
} }
template<class T> template<class T>
@ -113,17 +110,18 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
d->orderPhrases, d->orderPhrases,
d->tableName, d->tableName,
d->joinClassName); d->joinClassName);
qDebug() << "sql="<<sql;
QSqlQuery q = d->database->exec(sql); QSqlQuery q = d->database->exec(sql);
QString pk = TableModel::findByName(d->tableName)->primaryKey(); // QString pk = TableModel::findByName(d->tableName)->primaryKey();
// QString pk = d->database->model().model(d->tableName)->primaryKey(); QString pk = d->database->model().model(d->tableName)->primaryKey();
QVariant lastPkValue = QVariant(); QVariant lastPkValue = QVariant();
int childTypeId = 0; int childTypeId = 0;
T *lastRow = 0; T *lastRow = 0;
TableSetBase *childTableSet; 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; QStringList childFields;
if(!d->joinClassName.isNull()) { if(!d->joinClassName.isNull()) {
TableModel *joinTableModel = TableModel::findByClassName(d->joinClassName); TableModel *joinTableModel = TableModel::findByClassName(d->joinClassName);
@ -131,8 +129,8 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
// childFields = d->database->model().modelByClass(d->joinClassName)->fieldsNames(); // childFields = d->database->model().modelByClass(d->joinClassName)->fieldsNames();
childFields = TableModel::findByClassName(d->joinClassName)->fieldsNames(); childFields = TableModel::findByClassName(d->joinClassName)->fieldsNames();
QString joinTableName = d->database->tableName(d->joinClassName); QString joinTableName = d->database->tableName(d->joinClassName);
// childTypeId = d->database->model().model(joinTableName)->typeId(); childTypeId = d->database->model().model(joinTableName)->typeId();
childTypeId = TableModel::findByName(joinTableName)->typeId(); // childTypeId = TableModel::findByName(joinTableName)->typeId();
} }
} }
@ -200,6 +198,7 @@ Q_OUTOFLINE_TEMPLATE int Query<T>::count()
d->select = "COUNT(*)"; d->select = "COUNT(*)";
QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand("COUNT(*)", d->wheres, d->orders, d->tableName, d->joinClassName)); QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand("COUNT(*)", d->wheres, d->orders, d->tableName, d->joinClassName));
qDebug() << "sql="<<d->database->sqlGenertor()->selectCommand("COUNT(*)", d->wheres, d->orders, d->tableName, d->joinClassName);
if(q.next()) if(q.next())
return q.value(0).toInt(); return q.value(0).toInt();
return 0; return 0;
@ -227,6 +226,18 @@ Q_OUTOFLINE_TEMPLATE QVariant Query<T>::min(FieldPhrase<int> &f){
return 0; return 0;
} }
template<class T>
Q_OUTOFLINE_TEMPLATE QVariant Query<T>::average(FieldPhrase<int> &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<class T> template<class T>
Q_OUTOFLINE_TEMPLATE int Query<T>::remove() Q_OUTOFLINE_TEMPLATE int Query<T>::remove()
{ {

View File

@ -51,6 +51,7 @@ QString SqlGeneratorBase::masterDatabaseName(QString databaseName)
QString SqlGeneratorBase::saveRecord(Table *t, QString tableName) QString SqlGeneratorBase::saveRecord(Table *t, QString tableName)
{ {
Q_ASSERT(!tableName.isEmpty() && !tableName.isNull());
switch(t->status()){ switch(t->status()){
case Table::Added: case Table::Added:
return insertRecord(t, tableName); return insertRecord(t, tableName);

View File

@ -121,7 +121,7 @@ void Table::setTableSet(TableSetBase *parent)
_tableSet->add(this); _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()))); 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) foreach(TableSetBase *ts, tableSets)
ts->save(db); ts->save(db);
setStatus(FeatchedFromDB); setStatus(FeatchedFromDB);
return q.numRowsAffected();
} }
Table::Status Table::status() const Table::Status Table::status() const

View File

@ -49,7 +49,7 @@ public:
}; };
void add(TableSetBase *); void add(TableSetBase *);
void save(Database *db); int save(Database *db);
QString primaryKey() const; QString primaryKey() const;
bool isPrimaryKeyAutoIncrement() const; bool isPrimaryKeyAutoIncrement() const;

View File

@ -103,13 +103,13 @@ TableModel *TableModel::findByTypeId(int typeId)
return 0; return 0;
} }
TableModel *TableModel::findByName(QString name) //TableModel *TableModel::findByName(QString name)
{ //{
foreach (TableModel *model, _allModels) // foreach (TableModel *model, _allModels)
if(model->name() == name) // if(model->name() == name)
return model; // return model;
return 0; // return 0;
} //}
TableModel *TableModel::findByClassName(QString className) TableModel *TableModel::findByClassName(QString className)
{ {
@ -146,6 +146,10 @@ bool TableModel::operator !=(const TableModel &t) const
TableModel::TableModel(int typeId, QString tableName) TableModel::TableModel(int typeId, QString tableName)
{ {
//TODO: check that
// if (findByTypeId(typeId))
// return;
const QMetaObject *tableMetaObject = QMetaType::metaObjectForType(typeId); const QMetaObject *tableMetaObject = QMetaType::metaObjectForType(typeId);
_typeId = typeId; _typeId = typeId;
@ -238,8 +242,8 @@ TableModel::TableModel(int typeId, QString tableName)
} }
} }
_allModels.insert(this); if(!findByTypeId(typeId) && !tableName.isNull())
qDebug() << "all models"<<_allModels; _allModels.insert(this);
} }
/* /*
@ -267,7 +271,6 @@ TableModel::TableModel(QJsonObject json, QString tableName)
QJsonObject fieldObject = fields.value(key).toObject(); QJsonObject fieldObject = fields.value(key).toObject();
FieldModel *f = new FieldModel; FieldModel *f = new FieldModel;
f->name = fieldObject.value(__NAME).toString(); f->name = fieldObject.value(__NAME).toString();
qDebug() << "fieldObject.value(__TYPE).toString()"<<fieldObject.value(__TYPE).toString();
f->type = QVariant::nameToType(fieldObject.value(__TYPE).toString().toLatin1().data()); f->type = QVariant::nameToType(fieldObject.value(__TYPE).toString().toLatin1().data());
if(fieldObject.contains(__nut_NOT_NULL)) 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; field(json.value(__nut_PRIMARY_KEY).toString())->isAutoIncrement = true;
_allModels.insert(this); _allModels.insert(this);
} }
QJsonObject TableModel::toJson() const QJsonObject TableModel::toJson() const

View File

@ -73,7 +73,7 @@ class TableModel
{ {
public: public:
TableModel(int typeId, QString tableName); TableModel(int typeId, QString tableName = QString::null);
TableModel(QJsonObject json, QString tableName); TableModel(QJsonObject json, QString tableName);
QJsonObject toJson() const; QJsonObject toJson() const;
@ -103,7 +103,7 @@ public:
static QSet<TableModel *> allModels(); static QSet<TableModel *> allModels();
static TableModel *findByTypeId(int typeId); static TableModel *findByTypeId(int typeId);
static TableModel *findByName(QString name); // static TableModel *findByName(QString name);
static TableModel *findByClassName(QString className); static TableModel *findByClassName(QString className);
bool operator ==(const TableModel &t) const; bool operator ==(const TableModel &t) const;

View File

@ -35,8 +35,9 @@ TableSetBase::TableSetBase(Table *parent) : QObject(parent), _database(0), _tabl
parent->add(this); parent->add(this);
} }
void TableSetBase::save(Database *db) int TableSetBase::save(Database *db)
{ {
int rowsAffected = 0;
foreach (Table *t, _tablesList) { foreach (Table *t, _tablesList) {
if(_table) if(_table)
t->setParentTable(_table); t->setParentTable(_table);
@ -44,9 +45,11 @@ void TableSetBase::save(Database *db)
if(t->status() == Table::Added if(t->status() == Table::Added
|| t->status() == Table::Modified || t->status() == Table::Modified
|| t->status() == Table::Deleted){ || t->status() == Table::Deleted){
t->save(db); rowsAffected += t->save(db);
} }
} }
return rowsAffected;
} }
void TableSetBase::clearChilds() void TableSetBase::clearChilds()

View File

@ -38,7 +38,7 @@ public:
TableSetBase(Database *parent); TableSetBase(Database *parent);
TableSetBase(Table *parent); TableSetBase(Table *parent);
virtual void save(Database *db); virtual int save(Database *db);
void clearChilds(); void clearChilds();
void add(Table* t); void add(Table* t);
QString childClassName() const; QString childClassName() const;