Added some exception handling. Marked all the functions throwing
[emufront] / src / db / dbmediaimagecontainer.cpp
index cbe3821..738fd19 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,45 +41,24 @@ bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
     return false;
 }
 
-
+/* Throws EmuFrontException */
 int DbMediaImageContainer::storeMediaImageContainer(EmuFrontObject *efo)
 {
     MediaImageContainer *mic
         = dynamic_cast<MediaImageContainer *>(efo);
 
     if (!mic->getFilePath())
-        throw new EmuFrontException("Cannot install media image "
+        throw EmuFrontException("Cannot install media image "
             "container to database without a file path object!");
 
-    // check if this media image container is already in the database
-
     // multiple media image containers with matching checksum will be stored
     //       if each instance is in a different file path
 
-    EmuFrontObject *o = getMediaImageContainerByChecksum(mic->getCheckSum());
-    int fileId = o ? o->getId() : -1;
-    if (fileId >= 0) {
-        qDebug() << "Media image container already in db with id " << fileId << ".";
-        // ok, we have a matching file
-        MediaImageContainer *tmpMic = dynamic_cast<MediaImageContainer*>(o);
-        // this will test if media image container is already in given path (media image container has a path spesific name!)
-        QString name = getMediaImageContainerName(mic->getFilePath()->getId(), mic->getId());
-        if (name.isEmpty()) {
-            // if file path differs, link the existing media image container to this file path with mic->getName() name
-            linkMediaImageContainerToPath(mic);
-        }
-        else if (name != mic->getName()) {
-            // if the file path is same but the file name differs update the mediaimagecontainer_filepath table entry
-            updateMediaImageContainerToPath(mic);
-        }
-        delete tmpMic;
-        return fileId;
-   }
-
+    int fileId = -1;
     QMap<QString, EmuFrontObject*> images = mic->getMediaImages();
     QList<int> ids = dbMediaImage->storeMediaImages(images);
 
-    qDebug() << "Stored " << ids.count() << " media images.";
+    //qDebug() << "Stored " << ids.count() << " media images.";
 
     if (ids.count() <= 0)
         return -1;
@@ -98,14 +75,14 @@ int DbMediaImageContainer::storeMediaImageContainer(EmuFrontObject *efo)
 
         fileId = insertDataObjectToModel(mic);
 
-        qDebug() << "Inserted media image container to file table with id " << fileId << ".";
+        //qDebug() << "Inserted media image container to file table with id " << fileId << ".";
 
         if (fileId < 0) {
             // TODO: note we most surely need to catch the exception
             // in the calling code block and clean
             // all the media image and ...containers from
             // the memory!
-            throw new EmuFrontException(
+            throw EmuFrontException(
                     QString(tr("Inserting media image container %1 to file database failed"))
                     .arg(mic->getName()));
         }
@@ -114,11 +91,11 @@ int DbMediaImageContainer::storeMediaImageContainer(EmuFrontObject *efo)
 
         if (!linkMediaImageContainerToPath(mic)){
             DbFile::deleteDataObject(fileId);
-            throw new EmuFrontException("Failed inserting media image to database!");
+            throw EmuFrontException("Failed inserting media image to database!");
         }
-        qDebug() << "Inserted media image container " << fileId << " to mediaimagecontainer table.";
+        //qDebug() << "Inserted media image container " << fileId << " to mediaimagecontainer table.";
         linkMediaImagesWithContainer(fileId, images.values());
-        qDebug() << "Linked media image container with media images.";
+        //qDebug() << "Linked media image container with media images.";
     } catch (EmuFrontException e) {
         dbMediaImage->removeOrphanedMediaImages(ids);
         throw e;
@@ -137,7 +114,7 @@ QString DbMediaImageContainer::constructSelect(QString whereClause) const
 {
     // TODO, for a usual search we need a "light" version of this select
     // and MediaImageContainer (only id, name)
-    QString select = QString("SELECT file.id, mediaimagecontainer_filepath.mediaimagecontainername, file.checksum, file.size, "
+    QString select = QString("SELECT file.id, file.name, file.checksum, file.size, "
                 "        filepath.id, filepath.name, "
                 "        setup.id, "
                 "        platform.id, platform.name, "
@@ -150,7 +127,7 @@ QString DbMediaImageContainer::constructSelect(QString whereClause) const
                 "INNER JOIN mediatype ON setup.mediatypeid = mediatype.id "
                 "%1 "
                 "ORDER BY file.name").arg(whereClause);
-    qDebug() << select;
+    //qDebug() << select;
     return select;
 }
 
@@ -166,6 +143,7 @@ QString DbMediaImageContainer::constructSelectById(int id) const
         );
 }
 
+/* Throws EmuFrontException */
 EmuFrontObject* DbMediaImageContainer::recordToDataObject(const QSqlRecord *rec)
 {
     // TODO: checks!
@@ -177,7 +155,7 @@ EmuFrontObject* DbMediaImageContainer::recordToDataObject(const QSqlRecord *rec)
     int size = rec->value(MIC_FileSize).toInt();
     int fpId = rec->value(MIC_FilePathId).toInt();
     FilePathObject *fpo
-        = dynamic_cast<FilePathObject*>(dbFilePath->getDataObject(fpId));
+        = dynamic_cast<FilePathObject*>(dbFilePath->getDataObject(fpId)); /* Throws EmuFrontException */
     //int supId = rec->value(MIC_SetupId).toInt();
     //Setup *sup = dbSetup->getDataObject(supId)
     QMap<QString, EmuFrontObject*> images = dbMediaImage->getMediaImages(id);
@@ -229,14 +207,14 @@ int DbMediaImageContainer::getMediaImageContainer(QString checksum) const
 */
 void DbMediaImageContainer::storeContainers(QList<MediaImageContainer *> lst, FilePathObject *fpo)
 {
-    qDebug() << "Storing media image containers to database.";
     foreach(MediaImageContainer *mic, lst)
     {
-        qDebug() << "Media image container " << mic->getName();
+        //qDebug() << "Media image container " << mic->getName();
         int micFileId = storeMediaImageContainer(mic);
     }
 }
 
+/* Throws EmuFrontException */
 void DbMediaImageContainer::linkMediaImagesWithContainer(int micId, QList<EmuFrontObject*> mediaImages)
 {
     if (micId < 0 || mediaImages.count() <= 0)
@@ -245,25 +223,19 @@ void DbMediaImageContainer::linkMediaImagesWithContainer(int micId, QList<EmuFro
     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() << ".";
-        QString name = getMediaImageContainerName(micId, mi->getId());
-        if (name.isEmpty() && !linkMediaImageToMediaImageContainer(mi, micId)) {
-                throw new EmuFrontException(QString("Failed linking media "
+        /*qDebug() << "Linking media image container " << micId
+            << " to media image " << mi->getId()  << ", " << mi->getName() << ".";*/
+        if (!linkMediaImageToMediaImageContainer(mi, micId)) {
+                throw EmuFrontException(QString("Failed linking media "
                                                     "image container %1 to a media image %2").arg(micId).arg(mi->getId()));
         }
-        else if (name != mi->getName() && !updateMediaImageToMediaImageContainer(mi, micId)) {
-                throw new EmuFrontException(QString("Failed updating media "
-                                                    "image container %1 to a media image %2").arg(micId).arg(mi->getId()));
-        }
-        // else already linked and name is up to date.
     }
 }
 
 void DbMediaImageContainer::filter(int mediaTypeId, int platformId)
 {
-    qDebug() << "Filtering media images with media type " << mediaTypeId
-        << " and platform " << platformId;
+    /*qDebug() << "Filtering media images with media type " << mediaTypeId
+        << " and platform " << platformId;*/
     QList<QString> filters;
     if (mediaTypeId >= 0)
         filters.append(QString("mediatype.id=%1").arg(mediaTypeId));
@@ -301,6 +273,7 @@ QString DbMediaImageContainer::getDeleteObjectSql() const
        return QString("DELETE FROM file WHERE id=:id");
 }
 
+/* Throws EmuFrontException */
 EmuFrontObject* DbMediaImageContainer::getMediaImageContainerByChecksum(QString checksum)
 {
     return getDataObject(QString("file.checksum LIKE '%1'").arg(checksum));
@@ -310,63 +283,30 @@ bool DbMediaImageContainer::linkMediaImageContainerToPath(const MediaImageContai
 {
     QSqlQuery q;
     q.prepare("INSERT INTO mediaimagecontainer_filepath "
-              "(fileid, filepathid, mediaimagecontainername, updatetime) "
-              "VALUES (:fileid, :filepathid, :mediaimagecontainername, :updatetime)");
+              "(fileid, filepathid, updatetime) "
+              "VALUES (:fileid, :filepathid, :updatetime)");
     q.bindValue(":fileid", mic->getId());
     q.bindValue(":filepathid", mic->getFilePath()->getId());
-    q.bindValue(":mediaimagecontainername", mic->getName());
     q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
     return q.exec();
 }
 
-bool DbMediaImageContainer::updateMediaImageContainerToPath(const MediaImageContainer *mic) const
-{
-    QSqlQuery q;
-    q.prepare("UPDATE mediaimagecontainer_filepath "
-                "SET mediaimagecontainername=:mediaimagecontainername, "
-                "updatetime=:updatetime "
-                "WHERE fileid=:fileid AND filepathid=:filepathid");
-    q.bindValue(":fileid", mic->getId());
-    q.bindValue(":filepathid", mic->getFilePath()->getId());
-    q.bindValue(":mediaimagecontainername", mic->getName());
-    q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
-    return q.exec();
-}
-
-QString DbMediaImageContainer::getMediaImageContainerName(int filePathId, int micId) const
-{
-    QString name = "";
-    QSqlQuery q;
-    q.prepare("SELECT mediaimagecontainername FROM mediaimagecontainer_filepath "
-        "WHERE fileid=:fileid AND filepathid=:filepathid");
-    q.bindValue(":fileid", micId);
-    q.bindValue(":filepathid", filePathId);
-    q.exec();
-    if (q.next())
-        name = q.value(0).toString();
-    return name;
-}
-
 bool DbMediaImageContainer::linkMediaImageToMediaImageContainer(const MediaImage *mi, int micId) const
 {
     QSqlQuery q;
     q.prepare("INSERT INTO mediaimagecontainer_mediaimage "
-        "(mediaimagecontainerid, mediaimageid, mediaimagename) "
-        "VALUES (:micid, :miid, :miname) ");
+        "(mediaimagecontainerid, mediaimageid) "
+        "VALUES (:micid, :miid) ");
     q.bindValue(":micid", micId);
     q.bindValue(":miid", mi->getId());
-    q.bindValue(":miname", mi->getName());
     return q.exec();
 }
 
-bool DbMediaImageContainer::updateMediaImageToMediaImageContainer(const MediaImage *mi, int micId) const
+bool DbMediaImageContainer::removeFromFilePath(int filePathId) const
 {
     QSqlQuery q;
-    q.prepare("UPDATE mediaimagecontainer_mediaimage "
-        " SET mediaimagename=:miname "
-        " WHERE mediaimagecontainerid=:micid AND mediaimageid=:miid");
-    q.bindValue(":micid", micId);
-    q.bindValue(":miid", mi->getId());
-    q.bindValue(":miname", mi->getName());
+    q.prepare("DELETE FROM mediaimagecontainer_filepath "
+        "WHERE filepathid=:filepathid");
+    q.bindValue(":filepathid", filePathId);
     return q.exec();
 }