]> ToastFreeware Gitweb - toast/confclerk.git/commitdiff
Stale events are deleted now after reloading conference.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 23 Apr 2024 20:31:13 +0000 (22:31 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 23 Apr 2024 20:31:13 +0000 (22:31 +0200)
src/sql/schedulexmlparser.cpp
src/sql/schedulexmlparser.h
src/sql/sqlengine.cpp
src/sql/sqlengine.h

index 64e266dbec34f4ddba26842a636a703a5e20001c..f758727659a8f8058371fafc8f50a107c0eaecf5 100644 (file)
@@ -93,6 +93,10 @@ void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& ur
         // we need to get count of all events in order to emit 'progressStatus' signal
         int totalEventsCount = scheduleElement.elementsByTagName("event").count();
 
+        // collect all event IDs so that we can identify previously existing events that were deleted
+        // when refreshing the conference
+        QSet<QString> importedEventIds;
+
         // parsing day elements
         int currentEvent = 0; // hold global idx of processed event
         QDomNodeList dayList = scheduleElement.elementsByTagName("day");
@@ -128,6 +132,7 @@ void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& ur
                         // process event's nodes
                         QHash<QString,QString> event;
                         event["id"] = eventElement.attribute("id");
+                        importedEventIds.insert(event["id"]);
                         event["conference_id"] = QString::number(conferenceId, 10);
                         QTime event_start = QTime::fromString(eventElement.firstChildElement("start").text(), sqlEngine->TIME_FORMAT);
                         event["start"] = event_start.toString(sqlEngine->TIME_FORMAT); // time eg. 10:00
@@ -190,6 +195,9 @@ void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& ur
             } // parsing room elements
         } // parsing day elements
 
+        // Delete events that exist from a previous import but have not been imported again
+        sqlEngine->deleteStaleEvents(conferenceId, importedEventIds);
+
         // Re-write conference as utc_offset was not known previously
         if (!conference.value("utc_offset").isEmpty()) {
             sqlEngine->addConferenceToDB(conference, conferenceId, conferenceId != 0);
index ae15a70ab2e97fde32efeff9fad3be0bd43ab16a..ffb340d9394eb8825024652dee446a709b076932 100644 (file)
@@ -28,6 +28,7 @@ class ScheduleXmlParser : public QObject
     Q_OBJECT
     private:
         SqlEngine* sqlEngine;
+        /// conference ID is assigned automatically if 0
         void parseDataImpl(const QByteArray &aData, const QString& url, int conferenceId);
     public:
         ScheduleXmlParser(SqlEngine* sqlEngine, QObject *aParent = NULL);
index 54228c35742a4cb90044fe294ce0fb911f4c987e..2d8672c61e9aa111edde6f7fc354d7303630511c 100644 (file)
@@ -459,6 +459,42 @@ bool SqlEngine::deleteConference(int id) {
 }
 
 
+bool SqlEngine::deleteStaleEvents(int conferenceId, QSet<QString> eventIdsToKeep) {
+    QSqlQuery query(db);
+
+    // get all event IDs from conference
+    query.prepare("SELECT id FROM event WHERE xid_conference = ?");
+    query.bindValue(0, conferenceId);
+    bool success = query.exec();
+    emitSqlQueryError(query);
+    if (!success) return false;
+    QSet<QString> existingEventIds;
+    while (query.next()) existingEventIds.insert(query.value(0).toString());
+
+    // determine events that are not existing anymore
+    QSet<QString> eventIdsToRemove = existingEventIds.subtract(eventIdsToKeep);
+
+    // delete events including entries from referencing tables
+    QList<QString> tables = {"link", "event_room", "event_person"};
+    for(const QString& eventId: eventIdsToRemove) {
+        for(const QString& table: tables) {
+            query.prepare(QString("DELETE FROM %1 WHERE xid_conference = ? AND xid_event = ?").arg(table));
+            query.bindValue(0, conferenceId);
+            query.bindValue(1, eventId);
+            success &= query.exec();
+            emitSqlQueryError(query);
+        }
+        query.prepare("DELETE FROM event WHERE xid_conference = ? AND id = ?");
+        query.bindValue(0, conferenceId);
+        query.bindValue(1, eventId);
+        success &= query.exec();
+        emitSqlQueryError(query);
+    }
+
+    return success;
+}
+
+
 void SqlEngine::emitSqlQueryError(const QSqlQuery &query) {
     QSqlError error = query.lastError();
     if (error.type() == QSqlError::NoError) return;
index 85ace9780dc53a96727003b89daced81b7bee878..097a9a6206297b7e15864126bf98000bcb0c4429 100644 (file)
@@ -66,6 +66,7 @@ class SqlEngine : public QObject {
         void addLinkToDB(QHash<QString,QString> &aLink);
         void addRoomToDB(QHash<QString,QString> &aRoom);
         bool deleteConference(int id);
+        bool deleteStaleEvents(int conferenceId, QSet<QString> eventIdsToKeep);
 
         bool beginTransaction();
         bool commitTransaction();