minor
This commit is contained in:
parent
805f56c76a
commit
d780bf234a
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ public:
|
|||
QSqlQuery exec(QString sql);
|
||||
|
||||
void add(TableSetBase *);
|
||||
void saveChanges();
|
||||
int saveChanges();
|
||||
void cleanUp();
|
||||
|
||||
QString databaseName() const;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
37
src/query.h
37
src/query.h
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public:
|
|||
};
|
||||
|
||||
void add(TableSetBase *);
|
||||
void save(Database *db);
|
||||
int save(Database *db);
|
||||
|
||||
QString primaryKey() const;
|
||||
bool isPrimaryKeyAutoIncrement() const;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue