From d3b4698b3edb4567693be617ec8a06443f92d32c Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 19 Jun 2019 11:22:00 +0430 Subject: [PATCH] fix uuid as primary key on sqlite [skip ci] --- src/defines.h | 5 +++++ src/generators/sqlitegenerator.cpp | 2 +- src/sqlmodel.cpp | 4 ++-- src/sqlmodel.h | 2 +- src/tableset.h | 10 ++++++++-- src/tablesetbase.cpp | 16 ++++++++++------ src/tablesetbase_p.h | 4 ++-- src/tablesetbasedata.h | 2 ++ test/tst_quuid/tst_uuid.cpp | 1 - 9 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/defines.h b/src/defines.h index 86a96a3..d0a75dc 100644 --- a/src/defines.h +++ b/src/defines.h @@ -209,6 +209,11 @@ inline Row create() { return QSharedPointer(new T); } +template +inline Row create(QObject *parent) { + return QSharedPointer(new T(parent)); +} + #else template using RowList = QList; diff --git a/src/generators/sqlitegenerator.cpp b/src/generators/sqlitegenerator.cpp index d62f895..e97687b 100644 --- a/src/generators/sqlitegenerator.cpp +++ b/src/generators/sqlitegenerator.cpp @@ -95,7 +95,7 @@ QString SqliteGenerator::fieldDeclare(FieldModel *field) if (type.isEmpty()) return type; - if (field->isPrimaryKey) { + if (isNumeric(field->type) && field->isPrimaryKey) { type = "INTEGER PRIMARY KEY"; if (field->isAutoIncrement) type.append(" AUTOINCREMENT"); diff --git a/src/sqlmodel.cpp b/src/sqlmodel.cpp index 7ee2dbd..153b892 100644 --- a/src/sqlmodel.cpp +++ b/src/sqlmodel.cpp @@ -135,10 +135,10 @@ QVariant SqlModel::headerData(int section, Qt::Orientation orientation, int role return QAbstractItemModel::headerData(section, orientation, role); } -Table *SqlModel::at(const int &i) const +Row SqlModel::at(const int &i) const { Q_D(const SqlModel); - return d->rows.at(i).data(); + return d->rows.at(i); } SqlModelPrivate::SqlModelPrivate(SqlModel *parent) : q_ptr(parent) diff --git a/src/sqlmodel.h b/src/sqlmodel.h index 55ed774..6a3ca84 100644 --- a/src/sqlmodel.h +++ b/src/sqlmodel.h @@ -55,7 +55,7 @@ public: void append(Row
table); // void append(Table *table); QVariant headerData(int section, Qt::Orientation orientation, int role) const; - Table *at(const int &i) const; + Row at(const int &i) const; void setRenderer(const std::function &renderer); diff --git a/src/tableset.h b/src/tableset.h index af02003..95a88a6 100644 --- a/src/tableset.h +++ b/src/tableset.h @@ -45,6 +45,10 @@ template class NUT_EXPORT TableSet : public TableSetBase { public: + typedef T value_type; + typedef T *pointer; + typedef T &reference; + explicit TableSet(Database *parent); explicit TableSet(Table *parent); @@ -53,8 +57,6 @@ public: void remove(T *t); void remove(QList t); - inline T *type() const {} - int length() const; T *at(int i) const; const T &operator[](int i) const; @@ -112,6 +114,8 @@ Q_OUTOFLINE_TEMPLATE const T &TableSet::operator[](int i) const template Q_OUTOFLINE_TEMPLATE void TableSet::append(Row t) { + data.detach(); + data->childs.append(t); data->tables.insert(t.data()); data->childRows.append(t.data()); @@ -133,6 +137,8 @@ Q_OUTOFLINE_TEMPLATE void TableSet::append(RowList t) template Q_OUTOFLINE_TEMPLATE void TableSet::remove(T *t) { + data.detach(); + data->childs.removeOne(t); data->tables.remove(t); t->setStatus(Table::Deleted); } diff --git a/src/tablesetbase.cpp b/src/tablesetbase.cpp index 15289ab..41cc254 100644 --- a/src/tablesetbase.cpp +++ b/src/tablesetbase.cpp @@ -51,7 +51,7 @@ int TableSetBase::save(Database *db, bool cleanUp) if (data->table) masterModel = db->model().tableByClassName(data->table->metaObject()->className()); - foreach (Row
t, data->childRows) { + foreach (Table *t, data->childRows) { if(data->table) t->setParentTable(data->table, masterModel, @@ -82,18 +82,22 @@ void TableSetBase::clearChilds() data->childRows.clear(); } -void TableSetBase::add(Row
t) +void TableSetBase::add(Table *t) { - if(!data->tables.contains(t.data())){ - data->tables.insert(t.data()); + if(!data->tables.contains(t)){ + data.detach(); + data->tables.insert(t); data->childRows.append(t); +// data->childs.append(t); } } -void TableSetBase::remove(Row
t) +void TableSetBase::remove(Table *t) { - data->tables.remove(t.data()); + data.detach(); + data->tables.remove(t); data->childRows.removeOne(t); +// data->childs.removeOne(t); } QString TableSetBase::childClassName() const diff --git a/src/tablesetbase_p.h b/src/tablesetbase_p.h index c04072e..cb8c6d2 100644 --- a/src/tablesetbase_p.h +++ b/src/tablesetbase_p.h @@ -58,8 +58,8 @@ protected: QExplicitlySharedDataPointer data; private: - void add(Row
t); - void remove(Row
t); + void add(Table* t); + void remove(Table *t); friend class Table; friend class QueryBase; diff --git a/src/tablesetbasedata.h b/src/tablesetbasedata.h index 7e132ed..4ab1203 100644 --- a/src/tablesetbasedata.h +++ b/src/tablesetbasedata.h @@ -40,6 +40,8 @@ public: QSet tables; QList childRows; + RowList
childs; + Database *database; Table *table; QString childClassName; diff --git a/test/tst_quuid/tst_uuid.cpp b/test/tst_quuid/tst_uuid.cpp index 3337e34..21dadae 100644 --- a/test/tst_quuid/tst_uuid.cpp +++ b/test/tst_quuid/tst_uuid.cpp @@ -48,7 +48,6 @@ void UuidTest::save() int n = db.saveChanges(); TOC(); - TOC(); QTEST_ASSERT(n == 1); }