Fixed two cases of memory loss (parenting was missing).
[emufront] / src / db / dbmediaimagecontainer.cpp
index da6f7ec..3d2464b 100644 (file)
 //#include "dbsetup.h"
 #include "dbfilepath.h"
 
-
 DbMediaImageContainer::DbMediaImageContainer(QObject *parent)
-    : DbFile(parent) // DbQueryModelManager(parent)
+    : DbFile(parent)
 {
     dbMediaImage = new DbMediaImage(parent);
     dbFilePath = new DbFilePath(parent);
     tableName = DbMediaImageContainer::DB_TABLE_MEDIAIMAGECONTAINER;
-    //dbFile = new DbFile(parent);
 }
 
 bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
@@ -43,25 +41,21 @@ bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
     return false;
 }
 
-int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
+
+int DbMediaImageContainer::storeMediaImageContainer(EmuFrontObject *efo)
 {
-    const MediaImageContainer *mic
-        = dynamic_cast<const MediaImageContainer *>(efo);
-
-    // check if this media image container is already in the database
-    EmuFrontObject *o = getFileByChecksum(mic->getCheckSum());
-    int fileId = o ? o->getId() : -1;
-    /*int fileId = getMediaImageContainer(mic->getCheckSum());*/
-    if (fileId >= 0) {
-        qDebug() << "Media image container already in db with id " << fileId << ".";
-        return fileId;
-   }
+    MediaImageContainer *mic
+        = dynamic_cast<MediaImageContainer *>(efo);
 
     if (!mic->getFilePath())
         throw new EmuFrontException("Cannot install media image "
             "container to database without a file path object!");
 
-    QList<MediaImage*> images = mic->getMediaImages();
+    // multiple media image containers with matching checksum will be stored
+    //       if each instance is in a different file path
+
+    int fileId = -1;
+    QMap<QString, EmuFrontObject*> images = mic->getMediaImages();
     QList<int> ids = dbMediaImage->storeMediaImages(images);
 
     qDebug() << "Stored " << ids.count() << " media images.";
@@ -78,7 +72,8 @@ int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
 
         // File id is used to store the media image container instance to database,
         // file id is also the media image container id
-        fileId = DbFile::insertDataObjectToModel(mic);
+
+        fileId = insertDataObjectToModel(mic);
 
         qDebug() << "Inserted media image container to file table with id " << fileId << ".";
 
@@ -92,21 +87,14 @@ int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
                     .arg(mic->getName()));
         }
 
-        // Insert to mediaimagecontainer table
+        mic->setId(fileId);
 
-        QSqlQuery q;
-        q.prepare("INSERT INTO mediaimagecontainer "
-                  "(fileid, filepathid, updatetime) "
-                  "VALUES (:fileid, :filepathid, :updatetime)");
-        q.bindValue(":fileid", fileId);
-        q.bindValue(":filepathid", mic->getFilePath()->getId());
-        q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
-        if (!q.exec()){
+        if (!linkMediaImageContainerToPath(mic)){
             DbFile::deleteDataObject(fileId);
             throw new EmuFrontException("Failed inserting media image to database!");
         }
         qDebug() << "Inserted media image container " << fileId << " to mediaimagecontainer table.";
-        linkMediaImagesWithContainer(fileId, ids);
+        linkMediaImagesWithContainer(fileId, images.values());
         qDebug() << "Linked media image container with media images.";
     } catch (EmuFrontException e) {
         dbMediaImage->removeOrphanedMediaImages(ids);
@@ -131,9 +119,9 @@ QString DbMediaImageContainer::constructSelect(QString whereClause) const
                 "        setup.id, "
                 "        platform.id, platform.name, "
                 "        mediatype.id, mediatype.name "
-                "FROM mediaimagecontainer "
-                "INNER JOIN file ON mediaimagecontainer.fileid = file.id "
-                "INNER JOIN filepath ON mediaimagecontainer.filepathid = filepath.id "
+                "FROM file "
+                "INNER JOIN mediaimagecontainer_filepath ON mediaimagecontainer_filepath.fileid = file.id "
+                "INNER JOIN filepath ON mediaimagecontainer_filepath.filepathid = filepath.id "
                 "INNER JOIN setup ON filepath.setupid = setup.id "
                 "INNER JOIN platform ON setup.platformid = platform.id "
                 "INNER JOIN mediatype ON setup.mediatypeid = mediatype.id "
@@ -169,7 +157,7 @@ EmuFrontObject* DbMediaImageContainer::recordToDataObject(const QSqlRecord *rec)
         = dynamic_cast<FilePathObject*>(dbFilePath->getDataObject(fpId));
     //int supId = rec->value(MIC_SetupId).toInt();
     //Setup *sup = dbSetup->getDataObject(supId)
-    QList<MediaImage*> images = dbMediaImage->getMediaImages(id);
+    QMap<QString, EmuFrontObject*> images = dbMediaImage->getMediaImages(id);
 
     mic = new MediaImageContainer(
        id, name, checksum, size, images, fpo
@@ -222,27 +210,23 @@ void DbMediaImageContainer::storeContainers(QList<MediaImageContainer *> lst, Fi
     foreach(MediaImageContainer *mic, lst)
     {
         qDebug() << "Media image container " << mic->getName();
-        int micFileId = insertDataObjectToModel(mic);
+        int micFileId = storeMediaImageContainer(mic);
     }
 }
 
-void DbMediaImageContainer::linkMediaImagesWithContainer(int micId, QList<int> miIds)
+void DbMediaImageContainer::linkMediaImagesWithContainer(int micId, QList<EmuFrontObject*> mediaImages)
 {
-    if (micId < 0 || miIds.count() <= 0)
+    if (micId < 0 || mediaImages.count() <= 0)
         return;
 
-    QSqlQuery q;
-    q.prepare("INSERT INTO mediaimagecontainer_mediaimage "
-        "(mediaimagecontainerid, mediaimageid) "
-        "VALUES (:micid, :miid) ");
-    q.bindValue(":micid", micId);
-
-    foreach(int miid, miIds) {
-        qDebug() << "Linking media image container " << micId << " to media image " << miid  << ".";
-        q.bindValue(":miid", miid);
-        if (!q.exec()) {
-            throw new EmuFrontException(QString("Failed linking media "
-                "image container %1 to a media image %2").arg(micId).arg(miid));
+    MediaImage *mi = 0;
+    foreach(EmuFrontObject *efo, mediaImages) {
+        mi = dynamic_cast<MediaImage*>(efo);
+        qDebug() << "Linking media image container " << micId
+            << " to media image " << mi->getId()  << ", " << mi->getName() << ".";
+        if (!linkMediaImageToMediaImageContainer(mi, micId)) {
+                throw new EmuFrontException(QString("Failed linking media "
+                                                    "image container %1 to a media image %2").arg(micId).arg(mi->getId()));
         }
     }
 }
@@ -287,3 +271,40 @@ QString DbMediaImageContainer::getDeleteObjectSql() const
        // mediaimages).
        return QString("DELETE FROM file WHERE id=:id");
 }
+
+EmuFrontObject* DbMediaImageContainer::getMediaImageContainerByChecksum(QString checksum)
+{
+    return getDataObject(QString("file.checksum LIKE '%1'").arg(checksum));
+}
+
+bool DbMediaImageContainer::linkMediaImageContainerToPath(const MediaImageContainer *mic) const
+{
+    QSqlQuery q;
+    q.prepare("INSERT INTO mediaimagecontainer_filepath "
+              "(fileid, filepathid, updatetime) "
+              "VALUES (:fileid, :filepathid, :updatetime)");
+    q.bindValue(":fileid", mic->getId());
+    q.bindValue(":filepathid", mic->getFilePath()->getId());
+    q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
+    return q.exec();
+}
+
+bool DbMediaImageContainer::linkMediaImageToMediaImageContainer(const MediaImage *mi, int micId) const
+{
+    QSqlQuery q;
+    q.prepare("INSERT INTO mediaimagecontainer_mediaimage "
+        "(mediaimagecontainerid, mediaimageid) "
+        "VALUES (:micid, :miid) ");
+    q.bindValue(":micid", micId);
+    q.bindValue(":miid", mi->getId());
+    return q.exec();
+}
+
+bool DbMediaImageContainer::removeFromFilePath(int filePathId) const
+{
+    QSqlQuery q;
+    q.prepare("DELETE FROM mediaimagecontainer_filepath "
+        "WHERE filepathid=:filepathid");
+    q.bindValue(":filepathid", filePathId);
+    return q.exec();
+}