Skip to content

Commit

Permalink
Implement DBEVENT_RUN_CHANGED + signal Event::dbEvent(...)
Browse files Browse the repository at this point in the history
  • Loading branch information
Fanda Vacek committed Mar 1, 2024
1 parent b35183d commit b76e9ca
Show file tree
Hide file tree
Showing 25 changed files with 427 additions and 207 deletions.
28 changes: 27 additions & 1 deletion libqf/libqfcore/src/sql/query.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include <QSqlField>
#include <QVariant>

using namespace qf::core::sql;
namespace qf::core::sql {

Query::Query(const QSqlDatabase &db)
: Super(db)
Expand Down Expand Up @@ -176,3 +176,29 @@ void Query::execCommandsThrow(const QStringList &commands, const QMap<QString, Q
exec(qs, qf::core::Exception::Throw);
}
}

QVariantMap recordToMap(const QSqlRecord &rec)
{
QVariantMap record;
for (int i = 0; i < rec.count(); ++i) {
QSqlField fld = rec.field(i);
auto fld_name = fld.name();
fld_name.replace("__", ".");
record[fld_name] = fld.value();
}
return record;
}

QVariantMap recordDiff(const QVariantMap &from, const QVariantMap &to)
{
QVariantMap ret;
for (const auto &[k2, v2] : to.asKeyValueRange()) {
auto v1 = from.value(k2);
if (v1 == v2)
continue;
ret[k2] = v2;
}
return ret;
}

}
3 changes: 3 additions & 0 deletions libqf/libqfcore/src/sql/query.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ class QFCORE_DECL_EXPORT Query : public QSqlQuery
mutable QSqlRecord m_demangledRecord;
};

QFCORE_DECL_EXPORT QVariantMap recordToMap(const QSqlRecord &rec);
QFCORE_DECL_EXPORT QVariantMap recordDiff(const QVariantMap &from, const QVariantMap &to);

}}}

#endif // QF_CORE_SQL_QUERY_H
22 changes: 13 additions & 9 deletions libqf/libqfcore/src/utils/table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -447,17 +447,21 @@ QVariantMap TableRow::valuesMap(bool full_names) const
}
return ret;
}
/*
#if defined QT_DEBUG
static QString v2str(const QVariant &ret)

QVariantMap TableRow::dirtyValuesMap() const
{
if(!ret.isValid()) return "INVALID";
if(ret.type() == QVariant::ByteArray) return QString(ret.toByteArray().toBase64());
if(ret.type() == QVariant::String) return '\'' + ret.toString() + '\'';
return ret.toString();
QVariantMap ret;
for (int i=0; i<fields().count(); ++i) {
const Table::Field &fld = fields()[i];
if (isDirty(i)) {
QString key = fld.name().toLower(); // PSQL returns all fieldnames in lowercase
key.replace("__", ".");
ret[key] = value(i);
}
}
return ret;
}
#endif
*/

void TableRow::setBareBoneValue(int col, const QVariant & val)
{
d->values[col] = val;
Expand Down
1 change: 1 addition & 0 deletions libqf/libqfcore/src/utils/table.h
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ class QFCORE_DECL_EXPORT TableRow
//QVector<QVariant>& valuesRef() {return d->values;}
const QVector<QVariant>& values() const {return d->values;}
QVariantMap valuesMap(bool full_names = false) const;
QVariantMap dirtyValuesMap() const;

//! Dirty flag nastavi, jen kdyz je value jina, nez ta, co uz tam byla.
void setValue(int col, const QVariant &v);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,14 @@ bool CardReaderPlugin::processCardToRunAssignment(int card_id, int run_id)
setStartTime(relay_id, leg + 1, new_next_leg_start_time);
int competitor_id = getPlugin<RunsPlugin>()->competitorForRun(next_leg_run_id);
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_COMPETITOR_EDITED, competitor_id);
QVariantList param {
next_leg_run_id,
QVariantMap {
{"runs.id", next_leg_run_id},
{"runs.startTimeMs", new_next_leg_start_time},
}
};
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_RUN_CHANGED, param);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
#include "competitordocument.h"

#include <plugins/Event/src/eventplugin.h>
#include <plugins/Runs/src/runsplugin.h>

#include <qf/qmlwidgets/framework/mainwindow.h>
#include <qf/qmlwidgets/framework/plugin.h>

#include <qf/core/sql/connection.h>
#include <qf/core/sql/query.h>
#include <qf/core/sql/transaction.h>
#include <qf/core/assert.h>
#include <plugins/Event/src/eventplugin.h>

using namespace Competitors;
using qf::qmlwidgets::framework::getPlugin;
using Event::EventPlugin;
using Runs::RunsPlugin;

CompetitorDocument::CompetitorDocument(QObject *parent)
: Super(parent)
Expand All @@ -30,6 +33,17 @@ bool CompetitorDocument::saveData()
{
qfLogFuncFrame();
RecordEditMode old_mode = mode();
QMap<int, QVariantMap> old_records;
auto *runs_plugin = getPlugin<RunsPlugin>();
if (old_mode == DataDocument::ModeEdit) {
auto competitor_id = dataId().toInt();
qf::core::sql::Query q(sqlModel()->connectionName());
q.exec(QStringLiteral("SELECT id FROM runs WHERE competitorId = %1").arg(competitor_id));
while(q.next()) {
int run_id = q.value(0).toInt();
old_records[run_id] = runs_plugin->runRecord(run_id);
}
}
bool siid_dirty = isDirty("competitors.siId");
bool class_dirty = isDirty("competitors.classId");
bool ret = Super::saveData();
Expand All @@ -52,24 +66,37 @@ bool CompetitorDocument::saveData()
q.exec(qf::core::Exception::Throw);
m_lastInsertedRunsIds << q.lastInsertId().toInt();
}
if(m_isEmitDbEventsOnSave)
if(m_isEmitDbEventsOnSave) {
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_COMPETITOR_COUNTS_CHANGED);
for (auto run_id : m_lastInsertedRunsIds) {
auto rec = runs_plugin->runRecord(run_id);
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_RUN_CHANGED, QVariantList {run_id, rec});
}
}
}
else if(old_mode == DataDocument::ModeEdit) {
competitor_id = dataId().toInt();
if(siid_dirty) {
qfDebug() << "updating SIID in run tables";
if(siid_dirty) {
int competitor_id = dataId().toInt();
qf::core::sql::Query q(sqlModel()->connectionName());
q.prepare("UPDATE runs SET siId=:siId WHERE competitorId=:competitorId", qf::core::Exception::Throw);
q.bindValue(":competitorId", competitor_id);
q.bindValue(":siId", siid());
q.exec(qf::core::Exception::Throw);
int competitor_id = dataId().toInt();
qf::core::sql::Query q(sqlModel()->connectionName());
q.prepare("UPDATE runs SET siId=:siId WHERE competitorId=:competitorId", qf::core::Exception::Throw);
q.bindValue(":competitorId", competitor_id);
q.bindValue(":siId", siid());
q.exec(qf::core::Exception::Throw);
}
if(m_isEmitDbEventsOnSave) {
if(class_dirty) {
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_COMPETITOR_COUNTS_CHANGED);
}
for(const auto &[run_id, old_record] : old_records.asKeyValueRange()) {
auto record = runs_plugin->runRecord(run_id);
auto diff = qf::core::sql::recordDiff(old_record, record);
if (!diff.isEmpty()) {
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_RUN_CHANGED, QVariantList {run_id, diff});
}
}
}
if(class_dirty && m_isEmitDbEventsOnSave)
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_COMPETITOR_COUNTS_CHANGED);
}
else {
competitor_id = dataId().toInt();
Expand All @@ -83,19 +110,29 @@ bool CompetitorDocument::saveData()
bool CompetitorDocument::dropData()
{
bool ret = false;
auto id = dataId();
auto competitor_id = dataId().toInt();
QList<int> run_ids;
{
qf::core::sql::Query q(sqlModel()->connectionName());
q.exec(QStringLiteral("SELECT id FROM runs WHERE competitorId = %1").arg(competitor_id));
while(q.next()) {
run_ids << q.value(0).toInt();
}
}
{
qf::core::sql::Query q(sqlModel()->connectionName());
q.prepare("DELETE FROM runs WHERE competitorId = :competitorId");
q.bindValue(":competitorId", id);
ret = q.exec();
ret = q.exec(QStringLiteral("DELETE FROM runs WHERE competitorId = %1").arg(competitor_id));
if(!ret)
qfError() << q.lastError().text();
}
if(ret) {
ret = Super::dropData();
if(m_isEmitDbEventsOnSave)
if(m_isEmitDbEventsOnSave) {
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_COMPETITOR_COUNTS_CHANGED);
for (auto run_id : run_ids) {
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_RUN_CHANGED, QVariantList {run_id, {}});
}
}
}
return ret;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,34 @@ using qf::qmlwidgets::framework::getPlugin;
using Event::EventPlugin;
using Competitors::CompetitorsPlugin;

class CompetitorsModel : public qfm::SqlTableModel
{
using Super = qfm::SqlTableModel;
public:
CompetitorsModel(QObject *parent ) : Super(parent) {}

bool postRow(int row_no, bool throw_exc) override
{
qfu::TableRow &row_ref = m_table.rowRef(row_no);
auto competitor_id = row_ref.value("competitors.id").toInt();
QVariantMap dirty_rec;
if (!row_ref.isInsert()) {
Q_ASSERT(competitor_id > 0);
dirty_rec = row_ref.dirtyValuesMap();
}
auto ret = Super::postRow(row_no, throw_exc);
if (!dirty_rec.isEmpty()) {
qf::core::sql::Query q;
q.exec(QStringLiteral("SELECT id FROM runs WHERE competitorId = %1").arg(competitor_id));
while(q.next()) {
int run_id = q.value(0).toInt();
getPlugin<EventPlugin>()->emitDbEvent(Event::EventPlugin::DBEVENT_RUN_CHANGED, QVariantList {run_id, dirty_rec});
}
}
return ret;
}
};

CompetitorsWidget::CompetitorsWidget(QWidget *parent) :
Super(parent),
ui(new Ui::CompetitorsWidget)
Expand All @@ -60,7 +88,7 @@ CompetitorsWidget::CompetitorsWidget(QWidget *parent) :
ui->tblCompetitors->setPersistentSettingsId("tblCompetitors");
ui->tblCompetitors->setRowEditorMode(qfw::TableView::EditRowsMixed);
ui->tblCompetitors->setInlineEditSaveStrategy(qfw::TableView::OnEditedValueCommit);
qfm::SqlTableModel *m = new qfm::SqlTableModel(this);
qfm::SqlTableModel *m = new CompetitorsModel(this);
m->addColumn("id").setReadOnly(true);
m->addColumn("classes.name", tr("Class"));
m->addColumn("competitors.startNumber", tr("SN", "start number")).setToolTip(tr("Start number"));
Expand Down
Loading

0 comments on commit b76e9ca

Please sign in to comment.