Implemented initial deleteDataObject(id) in Db-layer. Implemented
[emufront] / src / db / dbmediaimagecontainer.cpp
index 84d2aba..0705f3c 100644 (file)
 // along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <QDebug>
+#include <QSqlRecord>
+#include <QSqlQuery>
+#include <QSqlRelationalTableModel>
+#include <QSqlError>
 #include "dbmediaimagecontainer.h"
 
 DbMediaImageContainer::DbMediaImageContainer(QObject *parent)
-    : DbQueryModelManager(parent)
+    : DbFile(parent) // DbQueryModelManager(parent)
 {
     dbMediaImage = new DbMediaImage(parent);
+    //dbFile = new DbFile(parent);
 }
 
 bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
@@ -34,8 +39,65 @@ bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
 
 int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
 {
-    // TODO
-    return -1;
+    const MediaImageContainer *mic
+        = dynamic_cast<const MediaImageContainer *>(efo);
+
+    // check if this media image container is already in the database
+    int fileId = -1;
+    if ((fileId = getMediaImageContainer(mic->getCheckSum())) >= 0)
+        return fileId;
+
+    if (!mic->getFilePath())
+        throw new EmuFrontException("Cannot install media image "
+            "container to database without a file path object!");
+
+    QList<MediaImage*> images = mic->getMediaImages();
+    QList<int> ids = dbMediaImage->storeMediaImages(images);
+
+    if (ids.count() <= 0)
+        return -1;
+
+    /* Contained Media images successfully stored to db,
+        storing media image container also */
+
+    try {
+
+        // Insert MediaImageContainer first as a EmuFrontFile object to file table.
+
+        // 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);
+
+        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(
+                    QString(tr("Inserting media image container %1 to file database failed"))
+                    .arg(mic->getName()));
+        }
+
+        // Insert to mediaimagecontainer table
+
+        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()){
+            DbFile::deleteDataObject(fileId);
+            throw new EmuFrontException("Failed inserting media image to database!");
+        }
+        linkMediaImagesWithContainer(fileId, ids);
+    } catch (EmuFrontException e) {
+        dbMediaImage->removeOrphanedMediaImages(ids);
+        throw e;
+    }
+
+    return fileId;
 }
 
 bool DbMediaImageContainer::deleteDataObjectFromModel(QModelIndex *i)
@@ -80,6 +142,7 @@ QSqlQueryModel* DbMediaImageContainer::getData()
     return 0;
 }
 
+/* Returns the id of a media image container with a given cheksum or -1 if not found */
 int DbMediaImageContainer::getMediaImageContainer(QString checksum) const
 {
     // TODO
@@ -91,29 +154,32 @@ int DbMediaImageContainer::getMediaImageContainer(QString checksum) const
 * Stores media image containers, including the media images included
 * to database.
 */
-void DbMediaImageContainer::storeContainers(QList<MediaImageContainer *> lst)
+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();
-        QList<MediaImage*> images = mic->getMediaImages();
-
-        /* If media image container is already in the db, continue */
-        if (getMediaImageContainer(mic->getCheckSum()) >= 0)
-            continue;
-
-        // this is a new media image container, lets build a list
-        // of media image id's for this container
-        QList<int> ids = dbMediaImage->storeMediaImages(images);
-
-        if (ids.count() > 0)
-        {
-            // store media image to db
-
-            // get last insert id of stored media image
+        int micFileId = insertDataObjectToModel(mic);
+    }
+}
 
-            // link all the media image ids in list to media image container id
+void DbMediaImageContainer::linkMediaImagesWithContainer(int micId, QList<int> miIds)
+{
+    if (micId < 0 || miIds.count() <= 0)
+        return;
+
+    QSqlQuery q;
+    q.prepare("INSERT INTO mediaimagecontainer_mediaimage "
+        "(mediaimagecontainerid, mediaimageid) "
+        "VALUES (:micid, :miid) ");
+    q.bindValue(":micid", micId);
+
+    foreach(int miid, miIds) {
+        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));
         }
     }
 }