From d97bcaba84720e61b937ae93759325cd5538efc5 Mon Sep 17 00:00:00 2001 From: kirilma Date: Thu, 15 Apr 2010 12:49:59 +0000 Subject: [PATCH] implement deleting a conference pass event about it to mainwindow to update select control fix Conference::activeConference() to work when first conference is removed --- src/gui/importschedulewidget.cpp | 17 ++++++++++++- src/gui/importschedulewidget.h | 1 + src/gui/mainwindow.cpp | 14 +++++++++++ src/gui/mainwindow.h | 1 + src/mvc/conference.cpp | 32 +++++++++++++++--------- src/mvc/conference.h | 1 + src/sql/sqlengine.cpp | 42 ++++++++++++++++++++++++++++++++ src/sql/sqlengine.h | 2 ++ 8 files changed, 97 insertions(+), 13 deletions(-) diff --git a/src/gui/importschedulewidget.cpp b/src/gui/importschedulewidget.cpp index 5583028..453ff12 100644 --- a/src/gui/importschedulewidget.cpp +++ b/src/gui/importschedulewidget.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -166,7 +167,21 @@ void ImportScheduleWidget::on_newFromUrl() void ImportScheduleWidget::on_delete() { - // TODO: implement + int active_id = Conference::activeConference(); + Conference active_conference = Conference::getById(active_id); + + QMessageBox::StandardButton answer = + QMessageBox::question(0 + , "Deletion confirmation" + , QString("Really delete the %1 conference").arg(active_conference.title()) + , QMessageBox::Yes | QMessageBox::No + , QMessageBox::No); + + if (answer == QMessageBox::Yes) { + QString title = active_conference.title(); + Conference::deleteConference(active_id); + emit(scheduleDeleted(title)); + } } void ImportScheduleWidget::importFromNetwork(const QString& url) diff --git a/src/gui/importschedulewidget.h b/src/gui/importschedulewidget.h index 236e1fd..3e00d76 100644 --- a/src/gui/importschedulewidget.h +++ b/src/gui/importschedulewidget.h @@ -43,6 +43,7 @@ class ImportScheduleWidget : public QWidget, Ui::ImportScheduleWidget void on_newFromUrl(); signals: void scheduleImported(int confId); + void scheduleDeleted(const QString& title); private: void importFromNetwork(const QString& url); void importData(const QByteArray &aData, const QString& url); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 552224a..b2d33d7 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -74,6 +74,7 @@ MainWindow::MainWindow(int aEventId, QWidget *aParent) int confId = Conference::activeConference(); connect(importScheduleWidget, SIGNAL(scheduleImported(int)), SLOT(scheduleImported(int))); + connect(importScheduleWidget, SIGNAL(scheduleDeleted(const QString&)), SLOT(scheduleDeleted(const QString&))); // event details have changed connect(dayTabContainer, SIGNAL(eventHasChanged(int,bool)), SLOT(eventHasChanged(int,bool))); @@ -160,6 +161,19 @@ void MainWindow::scheduleImported(int aConfId) } } +void MainWindow::scheduleDeleted(const QString& title) +{ + int idx = selectConference->findText(title); + + if (idx == -1) { + // should not happen + qWarning() << __PRETTY_FUNCTION__ << "removed non-existent item:" << title; + } else { + // will it signal "changed"? + selectConference->removeItem(idx); + } +} + void MainWindow::aboutApp() { QDialog dialog(this); diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index 4309915..7740b85 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -33,6 +33,7 @@ public: ~MainWindow() {} private slots: void scheduleImported(int aConfId); + void scheduleDeleted(const QString& title); void aboutApp(); void conferenceMapClicked(); void eventHasChanged(int aEventId, bool aReloadModel); diff --git a/src/mvc/conference.cpp b/src/mvc/conference.cpp index 23c4cc2..6c00f5e 100644 --- a/src/mvc/conference.cpp +++ b/src/mvc/conference.cpp @@ -17,6 +17,7 @@ * fosdem-schedule. If not, see . */ #include "conference.h" +#include "../sql/sqlengine.h" QSqlRecord const Conference::sColumns = Conference::toRecord(QList() << QSqlField("id", QVariant::Int) @@ -51,20 +52,27 @@ QList Conference::getAll() int Conference::activeConference() { - QSqlQuery query("SELECT id FROM conference WHERE active = 1"); - query.exec(); + { + QSqlQuery query("SELECT id FROM conference WHERE active = 1"); + query.exec(); - QList activeConfs; - while(query.next()) - activeConfs.append(query.record().value("id").toInt()); + // TODO: change it so that it will select somw existing ID - qDebug() << __PRETTY_FUNCTION__ - << "activeConfs.count()" << activeConfs.count() - ; + if (query.next()) { + return query.record().value("id").toInt(); + } + } - if(activeConfs.count()==0) // no active DB - return 1; - else // even if there are more active confs, the first from the list is confidered active - return activeConfs[0]; + QSqlQuery query2("SELECT id FROM conference ORDER BY id"); + if (query2.next()) { + return query2.record().value("id").toInt(); + } + + return -1; +} + +void Conference::deleteConference(int id) +{ + SqlEngine::deleteConference(id); } diff --git a/src/mvc/conference.h b/src/mvc/conference.h index c16ac74..8e32c65 100644 --- a/src/mvc/conference.h +++ b/src/mvc/conference.h @@ -35,6 +35,7 @@ public: static Conference getById(int id); static QList getAll(); static int activeConference(); + static void deleteConference(int id); public: int id() const { return value("id").toInt(); } diff --git a/src/sql/sqlengine.cpp b/src/sql/sqlengine.cpp index cc7122f..28344b9 100644 --- a/src/sql/sqlengine.cpp +++ b/src/sql/sqlengine.cpp @@ -320,6 +320,29 @@ bool SqlEngine::commitTransaction() return execQuery(db, "COMMIT"); } +void SqlEngine::deleteConference(int id) +{ + QSqlDatabase db = QSqlDatabase::database(); + + if ( !db.isValid() || !db.isOpen()) { + return; + } + + beginTransaction(); + + QHash params; + params["xid_conference"] = id; + execQueryWithParameter(db, "DELETE FROM LINK WHERE xid_conference = :xid_conference", params); + execQueryWithParameter(db, "DELETE FROM EVENT_ROOM WHERE xid_conference = :xid_conference", params); + execQueryWithParameter(db, "DELETE FROM EVENT_PERSON WHERE xid_conference = :xid_conference", params); + execQueryWithParameter(db, "DELETE FROM EVENT WHERE xid_conference = :xid_conference", params); + execQueryWithParameter(db, "DELETE FROM CONFERENCE WHERE id = :xid_conference", params); + execQuery(db, "DELETE FROM ROOM WHERE NOT EXISTS(SELECT * FROM EVENT_ROOM WHERE xid_room = ROOM.id)"); + execQuery(db, "DELETE FROM PERSON WHERE NOT EXISTS(SELECT * FROM EVENT_PERSON WHERE xid_person = PERSON.id)"); + + commitTransaction(); +} + bool SqlEngine::execQuery(QSqlDatabase &aDatabase, const QString &aQuery) { //qDebug() << "\nSQL: " << aQuery; @@ -335,3 +358,22 @@ bool SqlEngine::execQuery(QSqlDatabase &aDatabase, const QString &aQuery) } } +bool SqlEngine::execQueryWithParameter(QSqlDatabase &aDatabase, const QString &aQuery, const QHash& params) +{ + qDebug() << "SQL:" << aQuery << "params:" << params; + + QSqlQuery sqlQuery(aDatabase); + sqlQuery.prepare(aQuery); + foreach (QString param_key, params.keys()) { + sqlQuery.bindValue(param_key, params[param_key]); + } + if( !sqlQuery.exec() ){ + qDebug() << "SQL ERR: " << sqlQuery.lastError().number() << ", " << sqlQuery.lastError().text(); + return false; + } + else{ + //qDebug() << "SQL OK.\n"; + return true; + } +} + diff --git a/src/sql/sqlengine.h b/src/sql/sqlengine.h index b175568..9bee268 100644 --- a/src/sql/sqlengine.h +++ b/src/sql/sqlengine.h @@ -36,6 +36,7 @@ class SqlEngine : public QObject static void addPersonToDB(QHash &aPerson); static void addLinkToDB(QHash &aLink); static void addRoomToDB(QHash &aRoom); + static void deleteConference(int id); static bool beginTransaction(); static bool commitTransaction(); @@ -45,6 +46,7 @@ class SqlEngine : public QObject private: static QString login(const QString &aDatabaseType, const QString &aDatabaseName); static bool execQuery(QSqlDatabase &aDatabase, const QString &aQuery); + static bool execQueryWithParameter(QSqlDatabase &aDatabase, const QString &aQuery, const QHash& params); }; #endif /* SQLENGINE_H */ -- 2.30.2