Co-authored-by: Hamed Masafi <hamed.masfi@gmail.com>
This commit is contained in:
Hamed Masafi 2022-04-30 12:28:04 +04:30 committed by GitHub
parent ad6eab9de1
commit c22ff56600
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 49 additions and 39 deletions

View File

@ -3,7 +3,7 @@ load(qt_build_config)
CONFIG += warning_clean exceptions qt_module_build c++17 CONFIG += warning_clean exceptions qt_module_build c++17
DEFINES += QT_DEPRECATED_WARNINGS QT_ASCII_CAST_WARNINGS DEFINES += QT_DEPRECATED_WARNINGS QT_ASCII_CAST_WARNINGS
MODULE_VERSION = 0.6.0 MODULE_VERSION = 0.6.1
# had to be added because std::visit only works on macos 10.14 and above # had to be added because std::visit only works on macos 10.14 and above
# remove again once Qt raises the value to 10.14! # remove again once Qt raises the value to 10.14!

View File

@ -49,34 +49,27 @@ AbstractTableSet::~AbstractTableSet()
t->setParentTableSet(nullptr); t->setParentTableSet(nullptr);
} }
int AbstractTableSet::save(Database *db, bool cleanUp) int AbstractTableSet::save(Database *db)
{ {
int rowsAffected = 0; int rowsAffected = 0;
TableModel *masterModel = nullptr; TableModel *masterModel = nullptr;
if (data->table) if (data->table)
masterModel = db->model().tableByClassName(QString::fromUtf8(data->table->metaObject()->className())); masterModel = db->model().tableByClassName(
QString::fromUtf8(data->table->metaObject()->className()));
for (auto &t : data->children) { for (auto i = data->weakChildren.begin(); i != data->weakChildren.end(); ) {
if (data->table) auto &row = *i;
t->setParentTable(data->table,
masterModel,
db->model().tableByClassName(
QString::fromUtf8(t->metaObject()->className())));
if (t->status() == Table::Added || t->status() == Table::Modified if (!row) {
|| t->status() == Table::Deleted) { i = data->weakChildren.erase(i);
rowsAffected += t->save(db); continue;
if (cleanUp)
#ifdef NUT_RAW_POINTER
t->deleteLater();
#else
remove(t);
#endif
} }
}
for (auto &row : data->weakChildren) {
auto t = row.lock(); auto t = row.lock();
if (t.isNull()) {
i = data->weakChildren.erase(i);
continue;
}
if (data->table) if (data->table)
t->setParentTable(data->table, t->setParentTable(data->table,
masterModel, masterModel,
@ -86,25 +79,38 @@ int AbstractTableSet::save(Database *db, bool cleanUp)
if (t->status() == Table::Added || t->status() == Table::Modified if (t->status() == Table::Added || t->status() == Table::Modified
|| t->status() == Table::Deleted) { || t->status() == Table::Deleted) {
rowsAffected += t->save(db); rowsAffected += t->save(db);
if (cleanUp)
#ifdef NUT_RAW_POINTER
t->deleteLater();
#else
remove(row);
#endif
} }
i++;
} }
if (cleanUp) { for (auto i = data->children.begin(); i != data->children.end(); ) {
data->children.clear(); auto &t = *i;
data->weakChildren.clear(); if (!t) {
i = data->children.erase(i);
continue;
} }
if (data->table)
t->setParentTable(data->table,
masterModel,
db->model().tableByClassName(
QString::fromUtf8(t->metaObject()->className())));
if (t->status() == Table::Added || t->status() == Table::Modified
|| t->status() == Table::Deleted) {
rowsAffected += t->save(db);
data->weakChildren.append(t.toWeakRef());
}
i++;
}
data->children.clear();
return rowsAffected; return rowsAffected;
} }
void AbstractTableSet::clearChildren() void AbstractTableSet::clearChildren()
{ {
#ifdef NUT_RAW_POINTER #ifdef NUT_RAW_POINTER
for (auto &t: data->children) for (auto &t: data->children)
t->deleteLater(); t->deleteLater();
@ -130,6 +136,11 @@ void AbstractTableSet::remove(Row<Table> t)
{ {
data.detach(); data.detach();
data->children.removeAll(t); data->children.removeAll(t);
#ifdef NUT_RAW_POINTER
t->deleteLater();
#endif
} }
void AbstractTableSet::remove(WeakRow<Table> t) void AbstractTableSet::remove(WeakRow<Table> t)

View File

@ -44,7 +44,7 @@ public:
explicit AbstractTableSet(Table *parent); explicit AbstractTableSet(Table *parent);
virtual ~AbstractTableSet(); virtual ~AbstractTableSet();
virtual int save(Database *db, bool cleanUp = false); virtual int save(Database *db);
void clearChildren(); void clearChildren();
QString childClassName() const; QString childClassName() const;

View File

@ -134,7 +134,7 @@ bool DatabasePrivate::updateDatabase()
{ {
Q_Q(Database); Q_Q(Database);
QString databaseHistoryName = driver + "\t" + databaseName + "\t" + hostName; QString databaseHistoryName = driver + QStringLiteral("\t") + databaseName + QStringLiteral("\t") + hostName;
if (updatedDatabases.contains(databaseHistoryName)) if (updatedDatabases.contains(databaseHistoryName))
return true; return true;
@ -331,7 +331,7 @@ bool DatabasePrivate::putModelToDatabase()
changeLog->setData(QString::fromUtf8(QJsonDocument(current.toJson()).toJson(QJsonDocument::Compact))); changeLog->setData(QString::fromUtf8(QJsonDocument(current.toJson()).toJson(QJsonDocument::Compact)));
changeLog->setVersion(current.version()); changeLog->setVersion(current.version());
changeLogs->append(changeLog); changeLogs->append(changeLog);
q->saveChanges(true); q->saveChanges();
changeLog->deleteLater(); changeLog->deleteLater();
return true; return true;
@ -597,7 +597,7 @@ void Database::add(AbstractTableSet *t)
d->tableSets.insert(t); d->tableSets.insert(t);
} }
int Database::saveChanges(bool cleanUp) int Database::saveChanges()
{ {
Q_D(Database); Q_D(Database);
@ -608,7 +608,7 @@ int Database::saveChanges(bool cleanUp)
int rowsAffected = 0; int rowsAffected = 0;
for (const auto &ts: qAsConst(d->tableSets)) for (const auto &ts: qAsConst(d->tableSets))
rowsAffected += ts->save(this, cleanUp); rowsAffected += ts->save(this);
return rowsAffected; return rowsAffected;
} }

View File

@ -59,7 +59,7 @@ public:
QSqlQuery exec(const QString& sql); QSqlQuery exec(const QString& sql);
int saveChanges(bool cleanUp = true); int saveChanges();
void cleanUp(); void cleanUp();
QString databaseName() const; QString databaseName() const;

View File

@ -179,7 +179,6 @@ AbstractTableSet *Table::childTableSet(const QString &name) const
int Table::save(Database *db) int Table::save(Database *db)
{ {
//Q_D(Table); //Q_D(Table);
QSqlQuery q = db->exec(db->sqlGenerator()->saveRecord(this, db->tableName(QString::fromUtf8(metaObject()->className())))); QSqlQuery q = db->exec(db->sqlGenerator()->saveRecord(this, db->tableName(QString::fromUtf8(metaObject()->className()))));
auto model = db->model().tableByClassName(QString::fromUtf8(metaObject()->className())); auto model = db->model().tableByClassName(QString::fromUtf8(metaObject()->className()));