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
int DatabasePrivate::lastId = 0;
QMap<QString, DatabaseModel> 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="<<s;
db.exec(s);
if (db.lastError().type() != QSqlError::NoError)
@ -158,9 +158,14 @@ bool DatabasePrivate::updateDatabase()
return ok;
}
void DatabasePrivate::getCurrectScheema()
bool DatabasePrivate::getCurrectScheema()
{
Q_Q(Database);
if (allTableMaps.contains(q->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=" <<ret;
// return ret;
}
@ -385,7 +391,7 @@ DatabaseModel Database::model() const
QString Database::tableName(QString className)
{
Q_D(Database);
return d->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()

View File

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

View File

@ -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<QString, QString> tables;
SqlGeneratorBase *sqlGenertor;
DatabaseModel currentModel;
TableSet<ChangeLogTable> *changeLogs;
QT_DEPRECATED
QHash<QString, QString> tables;
static QMap<QString, DatabaseModel> allTableMaps;
static int lastId;
};

View File

@ -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;
}

View File

@ -56,10 +56,7 @@ public:
QVariant max(FieldPhrase<int> &f);
QVariant min(FieldPhrase<int> &f);
QVariant average(FieldPhrase<int> &f){
//TODO: ...
return QVariant();
}
QVariant average(FieldPhrase<int> &f);
Query<T> *join(const QString &tableName);
Query<T> *setWhere(WherePhrase where);
@ -87,8 +84,8 @@ Q_OUTOFLINE_TEMPLATE Query<T>::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<class T>
@ -113,17 +110,18 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
d->orderPhrases,
d->tableName,
d->joinClassName);
qDebug() << "sql="<<sql;
QSqlQuery q = d->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<T *> Query<T>::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<T>::count()
d->select = "COUNT(*)";
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())
return q.value(0).toInt();
return 0;
@ -227,6 +226,18 @@ Q_OUTOFLINE_TEMPLATE QVariant Query<T>::min(FieldPhrase<int> &f){
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>
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)
{
Q_ASSERT(!tableName.isEmpty() && !tableName.isNull());
switch(t->status()){
case Table::Added:
return insertRecord(t, tableName);

View File

@ -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

View File

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

View File

@ -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()"<<fieldObject.value(__TYPE).toString();
f->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

View File

@ -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<TableModel *> 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;

View File

@ -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()

View File

@ -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;