diff --git a/src/bulkinserter.cpp b/src/bulkinserter.cpp index f39f7e9..ddebc4b 100644 --- a/src/bulkinserter.cpp +++ b/src/bulkinserter.cpp @@ -23,7 +23,7 @@ void Nut::BulkInserter::setFields(const Nut::PhraseList &ph) void Nut::BulkInserter::insert(std::initializer_list vars) { if (vars.size() != _fieldCount) { - qInfo("Number of rows mstake"); + qInfo("Number of rows mistake"); return; } diff --git a/src/database.cpp b/src/database.cpp index 2b38e67..7f26b8d 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -45,7 +45,9 @@ #include #include -#define __CHANGE_LOG_TABLE_NAME "__change_logs" +#ifndef __CHANGE_LOG_TABLE_NAME +# define __CHANGE_LOG_TABLE_NAME "__change_logs" +#endif NUT_BEGIN_NAMESPACE @@ -196,6 +198,7 @@ bool DatabasePrivate::getCurrectScheema() return false; } + QMap tables; tables.clear(); // TODO: change logs must not be in model @@ -240,21 +243,6 @@ bool DatabasePrivate::getCurrectScheema() if (!ok) qFatal("NUT_DB_VERSION macro accept version in format 'x'"); currentModel.setVersion(version); - - /* TODO: remove - QStringList version - = QString(ci.value()).replace("\"", "").split('.'); - bool ok = false; - if (version.length() == 1) { - currentModel.setVersion(version.at(0).toInt(&ok)); - } else if (version.length() == 2) { - currentModel.setVersionMajor(version.at(0).toInt(&ok)); - currentModel.setVersionMinor(version.at(1).toInt(&ok)); - } - - if (!ok) - qFatal("NUT_DB_VERSION macro accept version in format 'x' or " - "'x[.y]' only, and x,y must be integer values\n");*/ } } @@ -288,22 +276,6 @@ bool DatabasePrivate::getCurrectScheema() return true; } -//bool DatabasePrivate::checkClassInfo(const QMetaClassInfo &classInfo, QString &type, QString &name, QString &value) -//{ -// if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { -// return false; -// } else { -// QStringList parts = QString(classInfo.value()).split("\n"); -// if (parts.count() != 3) -// return false; - -// type = parts[0]; -// name = parts[1]; -// value = parts[2]; -// return true; -// } -//} - DatabaseModel DatabasePrivate::getLastScheema() { ChangeLogTable *u = changeLogs->query() @@ -386,6 +358,7 @@ void DatabasePrivate::createChangeLogs() Database::Database(QObject *parent) : QObject(parent), d_ptr(new DatabasePrivate(this)) { +// _d = new QSharedDataPointer(new DatabasePrivate(this)); DatabasePrivate::lastId++; } @@ -393,6 +366,7 @@ Database::Database(const Database &other) : QObject(other.parent()), d_ptr(new DatabasePrivate(this)) { DatabasePrivate::lastId++; +// _d = other._d; setDriver(other.driver()); setHostName(other.hostName()); @@ -592,7 +566,6 @@ bool Database::open(bool updateDatabase) if (!d->sqlGenertor) { qFatal("Sql generator for driver %s not found", driver().toLatin1().constData()); - return false; } return d->open(updateDatabase); diff --git a/src/database.h b/src/database.h index 65d088a..58f611c 100644 --- a/src/database.h +++ b/src/database.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "defines.h" #include "tableset.h" @@ -39,6 +40,7 @@ class NUT_EXPORT Database : public QObject { Q_OBJECT +// QSharedDataPointer *_d; DatabasePrivate *d_ptr; Q_DECLARE_PRIVATE(Database) diff --git a/src/database_p.h b/src/database_p.h index 46ae47c..d05d540 100644 --- a/src/database_p.h +++ b/src/database_p.h @@ -25,11 +25,12 @@ #include "databasemodel.h" #include +#include NUT_BEGIN_NAMESPACE class ChangeLogTable; -class DatabasePrivate +class DatabasePrivate //: public QSharedData { Database *q_ptr; Q_DECLARE_PUBLIC(Database) @@ -45,8 +46,6 @@ public: DatabaseModel getLastScheema(); bool getCurrectScheema(); -// bool checkClassInfo(const QMetaClassInfo &classInfo, -// QString &type, QString &name, QString &value); QSqlDatabase db; QString hostName; @@ -62,8 +61,6 @@ public: TableSet *changeLogs; - QT_DEPRECATED - QMap tables; static QMap allTableMaps; static qulonglong lastId; diff --git a/src/generators/sqlservergenerator.cpp b/src/generators/sqlservergenerator.cpp index fc8481b..0731b59 100644 --- a/src/generators/sqlservergenerator.cpp +++ b/src/generators/sqlservergenerator.cpp @@ -163,13 +163,15 @@ QString SqlServerGenerator::diff(FieldModel *oldField, FieldModel *newField) QString SqlServerGenerator::escapeValue(const QVariant &v) const { - if (v.type() == QMetaType::QString || v.type() == QMetaType::QChar) + auto mid = static_cast(v.userType()); + + if (mid == QMetaType::QString || mid == QMetaType::QChar) return "N'" + v.toString() + "'"; - else if (v.type() == QMetaType::QPoint) { + else if (mid == QMetaType::QPoint) { QPoint pt = v.toPoint(); return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( pt.y()); - } else if (v.type() == QMetaType::QPointF) { + } else if (mid == QMetaType::QPointF) { QPointF pt = v.toPointF(); return QString("geography::POINT(%1, %2, 4326)").arg(pt.x()).arg( pt.y()); diff --git a/src/query.h b/src/query.h index 4103590..974520e 100644 --- a/src/query.h +++ b/src/query.h @@ -29,7 +29,9 @@ #include #include #include +#include +#include "table.h" #include "query_p.h" #include "database.h" #include "databasemodel.h" @@ -97,11 +99,11 @@ public: QString sqlCommand() const; }; -template -inline Query *createQuery(TableSet *tableSet) -{ - return tableSet->query(); -} +//template +//inline Query *createQuery(TableSet *tableSet) +//{ +// return tableSet->query(); +//} template Q_OUTOFLINE_TEMPLATE Query::Query(Database *database, TableSetBase *tableSet, diff --git a/src/sqlmodel.cpp b/src/sqlmodel.cpp index ff40fa3..ea2b27e 100644 --- a/src/sqlmodel.cpp +++ b/src/sqlmodel.cpp @@ -21,7 +21,8 @@ #include "database.h" #include "tablesetbase_p.h" #include "databasemodel.h" - +#include "tablemodel.h" +#include "table.h" #include "sqlmodel_p.h" #include "sqlmodel.h" diff --git a/src/table.cpp b/src/table.cpp index 87d11bb..6bcc750 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -20,11 +20,14 @@ #include #include +#include + #include "table.h" #include "table_p.h" #include "database.h" #include "databasemodel.h" #include "generators/sqlgeneratorbase_p.h" +#include "tablesetbase_p.h" NUT_BEGIN_NAMESPACE @@ -42,11 +45,7 @@ NUT_BEGIN_NAMESPACE Table::Table(QObject *parent) : QObject(parent), d_ptr(new TablePrivate(this)) -{ - Q_D(Table); - d->status = NewCreated; -// d->model = TableModel::findByClassName(metaObject()->className()); -} +{ } Table::~Table() { @@ -62,26 +61,26 @@ void Table::add(TableSetBase *t) d->childTableSets.insert(t); } -QString Table::primaryKey() const -{ - Q_D(const Table); - return d->model->primaryKey(); -} +//QString Table::primaryKey() const +//{ +// Q_D(const Table); +// return d->model->primaryKey(); +//} -bool Table::isPrimaryKeyAutoIncrement() const -{ - Q_D(const Table); - FieldModel *pk = d->model->field(d->model->primaryKey()); - if (!pk) - return false; - return pk->isAutoIncrement; -} +//bool Table::isPrimaryKeyAutoIncrement() const +//{ +// Q_D(const Table); +// FieldModel *pk = d->model->field(d->model->primaryKey()); +// if (!pk) +// return false; +// return pk->isAutoIncrement; +//} -QVariant Table::primaryValue() const -{ - return property(primaryKey().toLatin1().data()); -} +//QVariant Table::primaryValue() const +//{ +// return property(primaryKey().toLatin1().data()); +//} void Table::propertyChanged(const QString &propName) { @@ -104,6 +103,12 @@ void Table::propertyChanged(const QString &propName) d->status = Added; } +void Table::setModel(TableModel *model) +{ + Q_D(Table); + d->model = model; +} + void Table::clear() { Q_D(Table); @@ -116,21 +121,21 @@ QSet Table::changedProperties() const return d->changedProperties; } -bool Table::setParentTable(Table *master) +bool Table::setParentTable(Table *master, TableModel *masterModel, TableModel *model) { Q_D(Table); QString masterClassName = master->metaObject()->className(); d->refreshModel(); - if (!d->model) - d->model = TableModel::findByClassName(metaObject()->className()); +// if (!d->model) +// d->model = TableModel::findByClassName(metaObject()->className()); - foreach (RelationModel *r, d->model->foregionKeys()) + foreach (RelationModel *r, model->foregionKeys()) if(r->masterClassName == masterClassName) { setProperty(QString(r->localColumn).toLatin1().data(), - master->primaryValue()); + master->property(masterModel->primaryKey().toUtf8().data())); d->changedProperties.insert(r->localColumn); return true; } @@ -202,8 +207,8 @@ TablePrivate::TablePrivate(Table *parent) : q_ptr(parent), void TablePrivate::refreshModel() { Q_Q(Table); - if (!model) - model = TableModel::findByClassName(q->metaObject()->className()); +// if (!model) +// model = TableModel::findByClassName(q->metaObject()->className()); } NUT_END_NAMESPACE diff --git a/src/table.h b/src/table.h index 5526166..d661784 100644 --- a/src/table.h +++ b/src/table.h @@ -55,14 +55,14 @@ public: int save(Database *db); - Q_DECL_DEPRECATED - QString primaryKey() const; +// Q_DECL_DEPRECATED +// QString primaryKey() const; - Q_DECL_DEPRECATED - bool isPrimaryKeyAutoIncrement() const; +// Q_DECL_DEPRECATED +// bool isPrimaryKeyAutoIncrement() const; - Q_DECL_DEPRECATED - QVariant primaryValue() const; +// Q_DECL_DEPRECATED +// QVariant primaryValue() const; Status status() const; void setStatus(const Status &status); @@ -74,7 +74,7 @@ public: QSet changedProperties() const; - bool setParentTable(Table *master); + bool setParentTable(Table *master, TableModel *masterModel, TableModel *model); signals: public slots: @@ -83,6 +83,7 @@ protected: void propertyChanged(const QString &propName); private: + void setModel(TableModel *model); // TableModel *myModel; // Status _status; // QSet _changedProperties; @@ -96,6 +97,8 @@ private: template friend class Query; + template + friend class TableSet; friend class TableSetBase; }; diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index e434e84..22ddfeb 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -101,38 +101,6 @@ QStringList TableModel::fieldsNames() const return ret; } -QSet TableModel::allModels() -{ - return _allModels; -} - -/* - * This is not used anywhere - */ -TableModel *TableModel::findByTypeId(int typeId) -{ - foreach (TableModel *model, _allModels) - if(model->typeId() == typeId) - return model; - return nullptr; -} - -/** - * @brief TableModel::findByClassName - * Find a table model by class name - * @param className - * @return - */ -TableModel *TableModel::findByClassName(const QString &className) -{ - foreach (TableModel *model, _allModels){ - if(model->className() == className) - return model; - } - - return nullptr; -} - bool TableModel::operator ==(const TableModel &t) const{ if(_name != t.name()) return false; @@ -157,23 +125,6 @@ bool TableModel::operator !=(const TableModel &t) const return !(*this == t); } -//bool TableModel::checkClassInfo(const QMetaClassInfo &classInfo, -// QString &type, QString &name, QString &value) -//{ -// if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { -// return false; -// } else { -// QStringList parts = QString(classInfo.value()).split("\n"); -// if (parts.count() != 3) -// return false; - -// type = parts[0]; -// name = parts[1]; -// value = parts[2]; -// return true; -// } -//} - TableModel::TableModel(int typeId, const QString &tableName) { //TODO: check that @@ -271,9 +222,6 @@ TableModel::TableModel(int typeId, const QString &tableName) f->isAutoIncrement = true; } } - - if(!findByTypeId(typeId) && !tableName.isNull()) - _allModels.insert(this); } /* diff --git a/src/tablemodel.h b/src/tablemodel.h index 7914ee5..6b43071 100644 --- a/src/tablemodel.h +++ b/src/tablemodel.h @@ -87,8 +87,10 @@ struct RelationModel{ QJsonObject toJson() const; }; + bool operator ==(const RelationModel &l, const RelationModel &r); bool operator !=(const RelationModel &l, const RelationModel &r); + class NUT_EXPORT TableModel { public: @@ -98,10 +100,6 @@ public: QJsonObject toJson() const; -// static TableScheema *registerTable(int typeId, QString tableName); -// static void createForegionKeys(); -// static TableModel* model(QString className); - FieldModel *field(int n) const; FieldModel *field(const QString &name) const; RelationModel *foregionKey(const QString &otherTable) const; @@ -124,16 +122,6 @@ public: QList foregionKeys() const; QStringList fieldsNames() const; - Q_DECL_DEPRECATED - static QSet allModels(); - - Q_DECL_DEPRECATED - static TableModel *findByTypeId(int typeId); -// static TableModel *findByName(QString name); - - Q_DECL_DEPRECATED - static TableModel *findByClassName(const QString &className); - bool operator ==(const TableModel &t) const; bool operator !=(const TableModel &t) const; @@ -143,9 +131,9 @@ private: int _typeId; QList _fields; QList _foreignKeys; + + Q_DECL_DEPRECATED static QSet_allModels; -// bool checkClassInfo(const QMetaClassInfo &classInfo, -// QString &type, QString &name, QString &value); }; NUT_END_NAMESPACE diff --git a/src/tableset.h b/src/tableset.h index 6442403..7748614 100644 --- a/src/tableset.h +++ b/src/tableset.h @@ -30,6 +30,8 @@ #include "tablesetbase_p.h" #include "table.h" #include "bulkinserter.h" +//#include "database.h" +#include "databasemodel.h" NUT_BEGIN_NAMESPACE @@ -37,6 +39,7 @@ template class Query; class BulkInserter; +class Database; template class NUT_EXPORT TableSet : public TableSetBase { @@ -96,21 +99,24 @@ Q_OUTOFLINE_TEMPLATE int TableSet::length() const template Q_OUTOFLINE_TEMPLATE T *TableSet::at(int i) const { - return reinterpret_cast(_tablesList.at(i)); + return reinterpret_cast(_childRows.at(i)); } template Q_OUTOFLINE_TEMPLATE const T &TableSet::operator[](int i) const { - return _tablesList[i]; + return _childRows[i]; } template Q_OUTOFLINE_TEMPLATE void TableSet::append(T *t) { _tables.insert(t); - _tablesList.append(t); -// rows.append(t); + _childRows.append(t); + +// if (_database) +// t->setModel(_database->model().tableByClassName(t->metaObject()->className())); + t->setParentTableSet(this); if(t->status() != Table::FeatchedFromDB) t->setStatus(Table::Added); diff --git a/src/tablesetbase.cpp b/src/tablesetbase.cpp index 210819b..9b04a7a 100644 --- a/src/tablesetbase.cpp +++ b/src/tablesetbase.cpp @@ -26,13 +26,13 @@ NUT_BEGIN_NAMESPACE TableSetBase::TableSetBase(Database *parent) : QObject(parent), - _database(parent), _table(nullptr), _tableName(QString()) + _database(parent), _table(nullptr)//, _tableName(QString()) { parent->add(this); } TableSetBase::TableSetBase(Table *parent) : QObject(parent), - _database(nullptr), _table(parent), _tableName(QString()) + _database(nullptr), _table(parent)//, _tableName(QString()) { parent->add(this); } @@ -46,9 +46,14 @@ TableSetBase::~TableSetBase() int TableSetBase::save(Database *db, bool cleanUp) { int rowsAffected = 0; - foreach (Table *t, _tablesList) { + TableModel *masterModel = nullptr; + if (_table) + masterModel = db->model().tableByClassName(_table->metaObject()->className()); + + foreach (Table *t, _childRows) { if(_table) - t->setParentTable(_table); + t->setParentTable(_table, masterModel, + db->model().tableByClassName(t->metaObject()->className())); if(t->status() == Table::Added || t->status() == Table::Modified @@ -61,30 +66,30 @@ int TableSetBase::save(Database *db, bool cleanUp) } if (cleanUp) - _tablesList.clear(); + _childRows.clear(); return rowsAffected; } void TableSetBase::clearChilds() { - foreach (Table *t, _tablesList) + foreach (Table *t, _childRows) t->deleteLater(); - _tablesList.clear(); + _childRows.clear(); } void TableSetBase::add(Table *t) { if(!_tables.contains(t)){ _tables.insert(t); - _tablesList.append(t); + _childRows.append(t); } } void TableSetBase::remove(Table *t) { _tables.remove(t); - _tablesList.removeOne(t); + _childRows.removeOne(t); } QString TableSetBase::childClassName() const diff --git a/src/tablesetbase_p.h b/src/tablesetbase_p.h index 2a92abf..114f458 100644 --- a/src/tablesetbase_p.h +++ b/src/tablesetbase_p.h @@ -48,10 +48,10 @@ public: protected: QSet _tables; - QList _tablesList; + QList _childRows; Database *_database; Table *_table; - QString _tableName; +// QString _tableName; QString _childClassName; private: diff --git a/test/common/consts.h b/test/common/consts.h index 9fbd0f8..5b34315 100644 --- a/test/common/consts.h +++ b/test/common/consts.h @@ -4,7 +4,8 @@ #include #define REGISTER(x) qDebug() << (#x) << "type id:" << qMetaTypeId() -#define PRINT(x) qDebug() << (#x "=") << (x); +#define PRINT(x) +//qDebug() << (#x "=") << (x); #define TIC() QElapsedTimer timer; timer.start() #define TOC() qDebug() << QString("Elapsed time: %1ms for %2") \ .arg(timer.elapsed() / 1000.) \ diff --git a/test/common/nut-lib.pri b/test/common/nut-lib.pri index 190f49e..47b0640 100644 --- a/test/common/nut-lib.pri +++ b/test/common/nut-lib.pri @@ -5,6 +5,6 @@ win32 { LIBDIR = $$absolute_path($$OUT_PWD/../../src) } -#LIBS += -L$$LIBDIR -lnut +LIBS += -L$$LIBDIR -lnut INCLUDEPATH += $$PWD/../../src $$PWD/../common -include(../../src/src.pri) +#include(../../src/src.pri)