2 // Copyright 2010 Mikko Keinänen
4 // This file is part of EmuFront.
7 // EmuFront is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
12 // EmuFront is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with EmuFront. If not, see <http://www.gnu.org/licenses/>.
23 #include <QSqlRelationalTableModel>
25 #include "dbmediaimagecontainer.h"
27 DbMediaImageContainer::DbMediaImageContainer(QObject *parent)
28 : DbFile(parent) // DbQueryModelManager(parent)
30 dbMediaImage = new DbMediaImage(parent);
31 //dbFile = new DbFile(parent);
34 bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
40 int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
42 /* "CREATE TABLE IF NOT EXISTS mediaimagecontainer "
43 "(id INTEGER PRIMARY KEY, "
44 "fileid INTEGER REFERENCES file(id), "
45 "filepathid INTEGER REFERENCES filepath(id), "
46 "updatetime NUMERIC)"*/
48 const MediaImageContainer *mic
49 = dynamic_cast<const MediaImageContainer *>(efo);
51 if (!mic->getFilePath())
52 // TODO: note we most surely need to catch the exception
53 // in the calling code block and clean
54 // all the media image and ...containers from
56 throw new EmuFrontException("Cannot install media image "
57 "container to database without a file path object!");
59 // Insert MediaImageContainer first as a EmuFrontFile object to file table.
60 // File id is used to store the media image container instance to database,
61 // file id is also the media image container id
62 int fileId = DbFile::insertDataObjectToModel(mic);
65 // TODO: note we most surely need to catch the exception
66 // in the calling code block and clean
67 // all the media image and ...containers from
69 throw new EmuFrontException(
70 QString(tr("Inserting media image container %1 to file database failed"))
71 .arg(mic->getName()));
74 // Insert to mediaimagecontainer table
77 q.prepare("INSERT INTO mediaimagecontainer "
78 "(fileid, filepathid, updatetime) "
79 "VALUES (:fileid, :filepathid, :updatetime)");
80 q.bindValue(":fileid", fileId);
81 q.bindValue(":filepathid", mic->getFilePath()->getId());
82 q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
84 // TODO: failed inserting, remove orphaned media images
85 // (this is actually done in the storeContainers catch block
86 // but maybe it should be done here also, if this function is called independently!
87 // TODO: note we most surely need to catch the exception
88 // in the calling code block and clean
89 // all the media image and ...containers from
91 throw new EmuFrontException("Failed inserting media image to database!");
95 bool DbMediaImageContainer::deleteDataObjectFromModel(QModelIndex *i)
101 int DbMediaImageContainer::countDataObjectRefs(int id) const
107 QString DbMediaImageContainer::constructSelect(QString whereClause) const
113 QString DbMediaImageContainer::constructFilterById(int id) const
119 QString DbMediaImageContainer::constructSelectById(int id) const
125 EmuFrontObject* DbMediaImageContainer::recordToDataObject(const QSqlRecord *)
131 QSqlQueryModel* DbMediaImageContainer::getData()
137 int DbMediaImageContainer::getMediaImageContainer(QString checksum) const
145 * Stores media image containers, including the media images included
148 void DbMediaImageContainer::storeContainers(QList<MediaImageContainer *> lst, FilePathObject *fpo)
150 qDebug() << "Storing media image containers to database.";
151 foreach(MediaImageContainer *mic, lst)
153 qDebug() << "Media image container " << mic->getName();
154 QList<MediaImage*> images = mic->getMediaImages();
156 /* If media image container is already in the db, continue */
157 if (getMediaImageContainer(mic->getCheckSum()) >= 0)
160 // this is a new media image container, lets build a list
161 // of media image id's for this container
162 QList<int> ids = dbMediaImage->storeMediaImages(images);
167 // mediaimagecontainer table: id, fileid, filepathid, updatetime
169 // insert the media image container file to file table
170 int micFileId = insertDataObjectToModel(mic);
172 // TODO: note we most surely need to catch the exception
173 // in the calling code block and clean
174 // all the media image and ...containers from
176 throw new EmuFrontException(
177 QString(tr("Inserting media image container %1 to file database failed"))
178 .arg(mic->getName()));
180 // link all the media image ids in list to media image container id
181 linkMediaImagesWithContainer(micFileId, ids);
182 } catch (EmuFrontException e) {
183 // need to remove the media images without media image container in list 'ids'
185 // all the media image and ...containers from
186 // the memory! (maybe throw another exception on calling code block for this)
188 dbMediaImage->removeOrphanedMediaImages(ids);
194 void DbMediaImageContainer::linkMediaImagesWithContainer(int micId, QList<int> miIds)