Added counting of reference dependencies. Added also new triggers for
authorMikko Keinänen <mikko.keinanen@gmail.com>
Sun, 10 Oct 2010 08:54:57 +0000 (11:54 +0300)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Sun, 10 Oct 2010 08:54:57 +0000 (11:54 +0300)
deleteing dependencies automatically.

24 files changed:
doc/er.dia
doc/uml-db_layer.dia
src/db/databasemanager.cpp
src/db/databasemanager.h
src/db/dbcreator.cpp
src/db/dbemufrontfileobject.cpp
src/db/dbemufrontfileobject.h
src/db/dbexecutable.cpp
src/db/dbexecutable.h
src/db/dbfile.cpp
src/db/dbfile.h
src/db/dbfilepath.cpp
src/db/dbfilepath.h
src/db/dbmediaimage.cpp
src/db/dbmediaimage.h
src/db/dbmediaimagecontainer.cpp
src/db/dbmediaimagecontainer.h
src/db/dbmediatype.cpp
src/db/dbmediatype.h
src/db/dbplatform.cpp
src/db/dbplatform.h
src/db/dbsetup.cpp
src/db/dbsetup.h
src/emulauncher.cpp

index 2df0a3b..400ce37 100644 (file)
Binary files a/doc/er.dia and b/doc/er.dia differ
index 2605b89..906b5e2 100644 (file)
Binary files a/doc/uml-db_layer.dia and b/doc/uml-db_layer.dia differ
index 8834cb1..d0b4b86 100644 (file)
@@ -151,3 +151,17 @@ EmuFrontObject* DatabaseManager::getDataObjectFromModel(QModelIndex *index)
 int DatabaseManager::getCurrentTimeStamp() {
     return QDateTime::currentDateTime().toTime_t();
 }
+
+int DatabaseManager::countDataObjectRefs(int id) const
+{
+    int ret = 0;
+    QSqlQuery q;
+    q.prepare(getCountRefsSelect(id));
+    q.exec();
+    QSqlRecord rec;
+    if (q.next()) {
+        rec = q.record();
+        ret = rec.value(0).toInt();
+    }
+    return ret;
+}
index 579ba13..0d6f16d 100644 (file)
@@ -43,7 +43,7 @@ public:
     virtual bool updateDataObjectToModel(const EmuFrontObject*) = 0;
     virtual int insertDataObjectToModel(const EmuFrontObject*) = 0;
     virtual bool deleteDataObjectFromModel(QModelIndex*) = 0;
-    virtual int countDataObjectRefs(int id) const = 0;
+    int countDataObjectRefs(int id) const;
     static int getCurrentTimeStamp();
     static bool openDB();
     void resetModel();
@@ -76,6 +76,7 @@ private:
     virtual QSqlQueryModel* getData() = 0;
     static QString getDbPath();
     EmuFrontObject* getFilteredDataObject();
+    virtual QString getCountRefsSelect(int) const = 0;
 
 };
 
index 745b1a4..23202e0 100644 (file)
@@ -157,17 +157,34 @@ bool DbCreator::createDB()
             "CREATE TRIGGER IF NOT EXISTS trg_onsetupdelete "
             "AFTER DELETE ON setup "
             "BEGIN "
-            "   DELETE FROM filepath WHERE filepath.setupid = old.id;"
+            "   DELETE FROM filepath WHERE filepath.setupid = old.id; "
+            "   DELETE FROM executable WHERE executable.setupid = old.id; "
             "END;"
             );
         query.exec(
+            "CREATE TRIGGER IF NOT EXISTS trg_onmediaimagecontainerdelete "
+            "AFTER DELETE ON mediaimagecontainer "
+            "BEGIN "
+            "    DELETE FROM file WHERE id=old.fileid; "
+            "    DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainerid=old.fileid; "
+            "END;"
+        );
+        query.exec(
+            "CREATE TRIGGER IF NOT EXISTS trg_onmediaimagecontainer_mediaimagedelete "
+            "AFTER DELETE ON mediaimagecontainer_mediaimage "
+            "BEGIN "
+            "    DELETE FROM file WHERE id=old.mediaimageid; "
+            "    DELETE FROM mediaimagecontainer WHERE fileid=old.mediaimagecontainerid; "
+        );
+        query.exec(
             "CREATE TRIGGER IF NOT EXISTS trg_onfiledelete "
             "AFTER DELETE ON file "
             "BEGIN "
-            "   UPDATE platform SET platform.fileid=NULL WHERE platform.fileid = old.id;"
+            "   UPDATE platform SET platform.fileid=NULL WHERE platform.fileid = old.id;."
             "   UPDATE mediatype SET mediatype.fileid=NULL WHERE mediatype.fileid = old.id;"
             "   DELETE FROM mediaimagecontainer WHERE fileid = old.id;"
-            "   DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainer_mediaimage.fileid = old.id;"
+            "   DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainer_mediaimage.mediaimageid = old.id;"
+            "   DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainer_mediaimage.mediaimagecontainerid = old.id;"
             "END;"
         );
     }
index 9245323..9922313 100644 (file)
@@ -99,12 +99,6 @@ bool DbEmuFrontFileObject::deleteDataObject(int id) const
 
 }
 
-int DbEmuFrontFileObject::countDataObjectRefs(int id) const
-{
-    return 0; // TODO
-    // return countRows("imagecontainer", "platformid", id);
-}
-
 // WARNING: this will delete also all the databindings to selected platform
 bool DbEmuFrontFileObject::deleteDataObjectFromModel(QModelIndex *index)
 {
index 97dddb2..9cd2b1a 100644 (file)
@@ -31,7 +31,6 @@ DbEmuFrontFileObject(QObject *parent);
 virtual bool updateDataObjectToModel(const EmuFrontObject*);
 int insertDataObjectToModel(const EmuFrontObject*);
 bool deleteDataObjectFromModel(QModelIndex*);
-int countDataObjectRefs(int) const;
 enum {
    EmuFrontFileObject_Id= 0,
    EmuFrontFileObject_Name,
index 44ca513..58ebe38 100644 (file)
@@ -104,12 +104,6 @@ bool DbExecutable::deleteDataObjectFromModel(QModelIndex*)
     return false;
 }
 
-int DbExecutable::countDataObjectRefs(int) const
-{
-    // TODO
-    return 0;
-}
-
 QString DbExecutable::constructSelectById(int id) const
 {
     return constructSelect(
@@ -162,3 +156,9 @@ QSqlQueryModel* DbExecutable::getData()
     return model;
 }
 
+QString DbExecutable::getCountRefsSelect(int id) const
+{
+    // These objects don't have references from other objects
+    // currently.
+    return QString("SELECT 0");
+}
index cf1f3af..aa4bb59 100644 (file)
@@ -31,7 +31,6 @@ public:
      virtual bool updateDataObjectToModel(const EmuFrontObject*);
     int insertDataObjectToModel(const EmuFrontObject*);
     bool deleteDataObjectFromModel(QModelIndex*);
-    int countDataObjectRefs(int) const;
     enum {
         Executable_Id = 0,
         Executable_Name,
@@ -49,6 +48,7 @@ protected:
     virtual bool deleteDataObject(int id) const;
 private:
     virtual QSqlQueryModel* getData();
+    virtual QString getCountRefsSelect(int) const;
     DbSetup *dbSetup;
 };
 
index 321c4dc..b9ab3dd 100644 (file)
@@ -98,12 +98,6 @@ int DbFile::insertDataObjectToModel(const EmuFrontObject *ob)
 
 }*/
 
-int DbFile::countDataObjectRefs(int id) const
-{
-    return 0; // TODO
-    // return countRows("imagecontainer", "platformid", id);
-}
-
 // WARNING: this will delete also all the databindings to selected platform
 // the delete must be confirmed in the UI
 bool DbFile::deleteDataObjectFromModel(QModelIndex *index)
@@ -183,3 +177,22 @@ EmuFrontObject* DbFile::getFileByChecksum(QString checksum)
 {
     return getDataObject(QString("checksum LIKE '%1'").arg(checksum));
 }
+
+QString DbFile::getCountRefsSelect(int id) const
+{
+    /* files are referenced from platform, mediatype, mediaimagecontainer_mediaimage and mediaimagecontainer. */
+    return QString("SELECT count(*) FROM ("
+              "SELECT file.id FROM file "
+              "INNER JOIN platform ON file.id=platform.fileid "
+              "WHERE file.id=%1 "
+              "UNION ALL "
+              "SELECT file.id FROM file "
+              "INNER JOIN mediatype ON file.id=mediatype.fileid "
+              "WHERE file.id=%1 "
+              "UNION ALL "
+              "SELECT file.id FROM file "
+              "INNER JOIN mediaimagecontainer_mediaimage "
+              "ON (mediaimagecontainerid=file.id OR mediaimageid=file.id) "
+              "WHERE file.id=%1 "
+              ")").arg(id);
+}
index 12e067b..24cd60a 100644 (file)
@@ -30,7 +30,6 @@ public:
     virtual bool updateDataObjectToModel(const EmuFrontObject*);
     int insertDataObjectToModel(const EmuFrontObject*);
     bool deleteDataObjectFromModel(QModelIndex*);
-    int countDataObjectRefs(int) const;
     EmuFrontObject* getFileByChecksum(QString checksum);
     //int insertFile(const EmuFrontFile *);
 
@@ -50,6 +49,8 @@ protected:
     virtual bool deleteDataObject(int id) const;
     int type;
     virtual QSqlQueryModel* getData();
+private:
+    virtual QString getCountRefsSelect(int) const;
 };
 
 #endif // DBFILE_H
index e124b65..24e62fe 100644 (file)
@@ -78,11 +78,6 @@ int DbFilePath::insertDataObjectToModel(const EmuFrontObject *ob)
     return id;
 }
 
-int DbFilePath::countDataObjectRefs(int id) const
-{
-    return 0;
-}
-
 // WARNING: this will delete also all the databindings to selected media image path
 bool DbFilePath::deleteDataObjectFromModel(QModelIndex *index)
 {
@@ -140,3 +135,12 @@ QSqlQueryModel* DbFilePath::getData()
     model->setHeaderData(FilePath_SetupName, Qt::Horizontal, tr("Set up"));
     return model;
 }
+
+QString DbFilePath::getCountRefsSelect(int id) const
+{
+    /* filepath is referenced from mediaimagecontainer */
+    return QString("SELECT count(*) FROM filepath"
+              "INNER JOIN mediaimagecontainer "
+              "ON filepath.id=mediaimagecontainer.filepathid"
+              "WHERE filepath.id=%1").arg(id);
+}
index 84848d8..682d393 100644 (file)
@@ -31,7 +31,6 @@ public:
     virtual bool updateDataObjectToModel(const EmuFrontObject*);
     int insertDataObjectToModel(const EmuFrontObject*);
     bool deleteDataObjectFromModel(QModelIndex*);
-    int countDataObjectRefs(int) const;
     enum { FilePath_Id = 0,
            FilePath_Name,
            FilePath_LastScanned,
@@ -47,6 +46,7 @@ protected:
 
 private:
     virtual QSqlQueryModel* getData();
+    virtual QString getCountRefsSelect(int) const;
     DbSetup *dbSetup;
 };
 
index a45a276..c741dd2 100644 (file)
@@ -157,3 +157,17 @@ QList<MediaImage*> DbMediaImage::getMediaImages(int micId) const
     }
     return list;
 }
+
+QString DbMediaImage::getCountRefsSelect(int id) const
+{
+
+    /* nothing will be removed if a mediaimage file is removed
+       from the db. TODO: if all the mediaimages from
+           mediaimagecontainer are removed
+           the mediaimagecontainer should be removed! */
+    return QString("SELECT 0");
+    /*return QString("SELECT count(*) FROM file "
+              "INNER JOIN mediaimagecontainer_mediaimage "
+              "ON file.id=mediaimagecontainer_mediaimage.mediaimageid "
+              "WHERE file.id=%1").arg(id);*/
+}
index 910d1a4..cedc3a6 100644 (file)
@@ -33,15 +33,16 @@ public:
     /*virtual bool updateDataObjectToModel(const EmuFrontObject *);
     virtual bool insertDataObjectToModel(const EmuFrontObject *);
     virtual bool deleteDataObjectFromModel(QModelIndex *);
-    virtual int countDataObjectRefs(int id) const;
     int getMediaImage(QString checksum) const;
     int insertMediaImage(const MediaImage*);
 protected:
     virtual QString constructSelect(QString whereClause) const;
     virtual QString constructSelectById(int id) const;
     virtual EmuFrontObject* recordToDataObject(const QSqlRecord *);
+    */
 private:
-    virtual QSqlQueryModel* getData();*/
+    /*virtual QSqlQueryModel* getData();*/
+    virtual QString getCountRefsSelect(int) const;
 };
 
 #endif // DBMEDIAIMAGE_H
index b353995..2d54917 100644 (file)
@@ -120,12 +120,6 @@ bool DbMediaImageContainer::deleteDataObjectFromModel(QModelIndex *i)
     return false;
 }
 
-int DbMediaImageContainer::countDataObjectRefs(int id) const
-{
-    // TODO
-    return -1;
-}
-
 QString DbMediaImageContainer::constructSelect(QString whereClause) const
 {
     // TODO, for a usual search we need a "light" version of this select
@@ -263,3 +257,19 @@ void DbMediaImageContainer::filter(int mediaTypeId, int platformId)
     filterDataObjects(filters);
 }
 
+QString DbMediaImageContainer::getCountRefsSelect(int id) const
+{
+    /* we need to count file references to give media image container */
+    /* example:
+        select count(*) from mediaimagecontainer
+        INNER JOIN mediaimagecontainer_mediaimage
+        ON mediaimagecontainer_mediaimage.mediaimagecontainerid
+        = mediaimagecontainer.fileid
+        WHERE mediaimagecontainer.fileid=589;
+    */
+    return QString("SELECT count(*) FROM mediaimagecontainer "
+              "INNER JOIN mediaimagecontainer_mediaimage "
+              "ON mediaimagecontainer_mediaimage.mediaimagecontainerid "
+              "    =mediaimagecontainer.fileid "
+              "WHERE mediaimagecontainer.fileid=%1").arg(id);
+}
index 9a94c2d..fa6488e 100644 (file)
@@ -38,7 +38,6 @@ public:
     virtual bool updateDataObjectToModel(const EmuFrontObject *);
     virtual int insertDataObjectToModel(const EmuFrontObject *);
     virtual bool deleteDataObjectFromModel(QModelIndex *);
-    virtual int countDataObjectRefs(int id) const;
     void storeContainers(QList<MediaImageContainer*>, FilePathObject*);
     int getMediaImageContainer(QString checksum) const;
     void filter(int mediaTypeId, int platformId);
@@ -67,6 +66,7 @@ private:
     void linkMediaImagesWithContainer(int, QList<int>);
     DbMediaImage *dbMediaImage;
     DbFilePath *dbFilePath;
+    virtual QString getCountRefsSelect(int) const;
     // DbSetup *dbSetup;
     // DbFile *dbFile;
  };
index 758ed2f..3c1bd87 100644 (file)
@@ -28,3 +28,10 @@ tableName = DbMediaType::DB_TABLE_NAME_MEDIATYPE;
 
 EmuFrontObject* DbMediaType::createEmuFrontFileObject(int id, QString name, EmuFrontFile *f)
 {   return new MediaType(id, name, f); }
+
+QString DbMediaType::getCountRefsSelect(int id) const
+{
+    return QString("SELECT count(*) FROM mediatype "
+                   "INNER JOIN setup ON mediatype.id=setup.mediatypeid "
+                   "WHERE mediatype.id=%1").arg(id);
+}
index 2bfd700..fe4b483 100644 (file)
@@ -30,6 +30,9 @@ public:
 
 protected:
     virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f);
+
+private:
+    QString getCountRefsSelect(int) const;
 };
 
 #endif // DBMEDIATYPE_H
index a7dd5f4..6bfa595 100644 (file)
@@ -18,6 +18,9 @@
 // along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "dbplatform.h"
+#include <QSqlQuery>
+#include <QSqlRecord>
+#include <QVariant>
 
 //QString DbPlatform::tableName = DbPlatform::DB_TABLE_NAME_PLATFORM;
 
@@ -28,3 +31,10 @@ DbPlatform::DbPlatform(QObject *parent) : DbEmuFrontFileObject(parent)
 
 EmuFrontObject* DbPlatform::createEmuFrontFileObject(int id, QString name, EmuFrontFile *f)
 {   return new Platform(id, name, f); }
+
+QString DbPlatform::getCountRefsSelect(int id) const
+{
+    return QString("SELECT count(*) FROM platform "
+              "INNER JOIN setup ON platform.id=setup.platformid "
+              "WHERE platform.id=%1").arg(id);
+}
index 20c6961..3c701fa 100644 (file)
@@ -33,6 +33,8 @@ public:
 
 protected:
     virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f);
+private:
+    virtual QString getCountRefsSelect(int) const;
 };
 
 #endif // DBPLATFORM_H
index b174a86..443e963 100644 (file)
@@ -91,12 +91,6 @@ int DbSetup::insertDataObjectToModel(const EmuFrontObject *ob)
     return id;
 }
 
-int DbSetup::countDataObjectRefs(int ) const
-{
-    // TODO
-    return -1;
-}
-
 QString DbSetup::constructSelect(QString where) const
 {
     /*QString where = whereClause.isEmpty()
@@ -158,3 +152,16 @@ QSqlQueryModel* DbSetup::getData()
     model->setHeaderData(Setup_Name, Qt::Horizontal, tr("Name"));
     return model;
 }
+
+QString DbSetup::getCountRefsSelect(int id) const
+{
+    /* setups are referenced by executable and filepath */
+    return QString("SELECT count(*) FROM "
+            "(SELECT setup.id FROM setup "
+              "INNER JOIN executable ON setup.id=executable.setupid "
+              "WHERE setup.id=%1 "
+              "UNION ALL "
+              "SELECT setup.id FROM setup "
+              "INNER JOIN filepath ON setup.id=filepath.setupid "
+              "WHERE setup.id=%1)").arg(id);
+}
index f4cea9d..83b9d9d 100644 (file)
@@ -32,7 +32,6 @@ public:
     virtual bool updateDataObjectToModel(const EmuFrontObject*);
     int insertDataObjectToModel(const EmuFrontObject*);
     bool deleteDataObjectFromModel(QModelIndex*);
-    int countDataObjectRefs(int) const;
     enum { Setup_Id = 0,
            Setup_PlatformId,
            Setup_MediaTypeId,
@@ -49,6 +48,7 @@ protected:
 
 private:
     virtual QSqlQueryModel* getData();
+    virtual QString getCountRefsSelect(int) const;
     DbPlatform *dbPlatform;
     DbMediaType *dbMediaType;
 };
index 896d199..5991a36 100644 (file)
@@ -139,8 +139,8 @@ void EmuLauncher::launchEmu()
                 << mic->getName() << " and emulator "
                 << obExe->getName() << ".";
         if (mic->getMediaImages().count() > 0) {
-            // TODO
             // 1. Launch media image
+            // TODO
             // 2. If 2 or more media images in container
             //    show a diaglog for choosing the boot image
             // 3. If 2 or more media image containers selected