implement deleting a conference
authorkirilma <kirilma@localhost>
Thu, 15 Apr 2010 12:49:59 +0000 (12:49 +0000)
committerkirilma <kirilma@localhost>
Thu, 15 Apr 2010 12:49:59 +0000 (12:49 +0000)
pass event about it to mainwindow to update select control
fix Conference::activeConference() to work when first conference is removed

src/gui/importschedulewidget.cpp
src/gui/importschedulewidget.h
src/gui/mainwindow.cpp
src/gui/mainwindow.h
src/mvc/conference.cpp
src/mvc/conference.h
src/sql/sqlengine.cpp
src/sql/sqlengine.h

index 5583028..453ff12 100644 (file)
@@ -26,6 +26,7 @@
 #include <QNetworkProxy>
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
+#include <QMessageBox>
 #include <QDebug>
 #include <appsettings.h>
 
@@ -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)
index 236e1fd..3e00d76 100644 (file)
@@ -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);
index 552224a..b2d33d7 100644 (file)
@@ -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);
index 4309915..7740b85 100644 (file)
@@ -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);
index 23c4cc2..6c00f5e 100644 (file)
@@ -17,6 +17,7 @@
  * fosdem-schedule.  If not, see <http://www.gnu.org/licenses/>.
  */
 #include "conference.h"
+#include "../sql/sqlengine.h"
 
 QSqlRecord const Conference::sColumns = Conference::toRecord(QList<QSqlField>()
     << QSqlField("id", QVariant::Int)
@@ -51,20 +52,27 @@ QList<Conference> 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<int> 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);
 }
 
index c16ac74..8e32c65 100644 (file)
@@ -35,6 +35,7 @@ public:
     static Conference getById(int id);
     static QList<Conference> getAll();
     static int activeConference();
+    static void deleteConference(int id);
 
 public:
     int id() const { return value("id").toInt(); }
index cc7122f..28344b9 100644 (file)
@@ -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<QString, QVariant> 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<QString, QVariant>& 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;
+    }
+}
+
index b175568..9bee268 100644 (file)
@@ -36,6 +36,7 @@ class SqlEngine : public QObject
         static void addPersonToDB(QHash<QString,QString> &aPerson);
         static void addLinkToDB(QHash<QString,QString> &aLink);
         static void addRoomToDB(QHash<QString,QString> &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<QString, QVariant>& params);
 };
 
 #endif /* SQLENGINE_H */