From 625f4330c96bf8cb13e3249a93be6d7d37185d06 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mikko=20Kein=C3=A4nen?= Date: Mon, 27 Sep 2010 23:01:17 +0300 Subject: [PATCH] Implemented initial deleteDataObject(id) in Db-layer. Implemented linking of media image container with media images. Refactored code in DbMediaImageContainer. NOT TESTED yet. --- doc/uml-db_layer.dia | Bin 5503 -> 5518 bytes src/db/dbemufrontfileobject.cpp | 17 ++++- src/db/dbemufrontfileobject.h | 3 +- src/db/dbfile.cpp | 11 +++ src/db/dbfile.h | 1 + src/db/dbfilepath.cpp | 11 +++ src/db/dbfilepath.h | 1 + src/db/dbmediaimagecontainer.cpp | 146 +++++++++++++++++--------------------- src/db/dbquerymodelmanager.h | 1 + src/db/dbsetup.cpp | 11 +++ src/db/dbsetup.h | 1 + 11 files changed, 121 insertions(+), 82 deletions(-) diff --git a/doc/uml-db_layer.dia b/doc/uml-db_layer.dia index aa2bcbccc23f09fa78439a51690e9c0ddf5125d7..7191859403ab4519946db1a039fcddab602b798d 100644 GIT binary patch literal 5518 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 literal 5503 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 QSqlQuery query; - query.prepare(QString("INSERT INTO %1 (id, name, fileid) " - "VALUES (NULL, :name, :fileid) ").arg(tableName)); + query.prepare(QString("INSERT INTO :table (id, name, fileid) " + "VALUES (NULL, :name, :fileid) ")); + query.bindValue(":table", tableName); query.bindValue(":name", plf->getName()); if (plf->getFile()) query.bindValue(":fileid", plf->getFile()->getId()); @@ -87,6 +88,18 @@ int DbEmuFrontFileObject::insertDataObjectToModel(const EmuFrontObject *ob) return id; } +bool DbEmuFrontFileObject::deleteDataObject(int id) const +{ + if (countDataObjectRefs(id) > 0) + // TODO + return false; + QSqlQuery q; + q.prepare(QString("DELETE FROM :table WHERE id=:id")); + q.bindValue(":table", tableName); + q.bindValue(":id", id); + return q.exec(); +} + int DbEmuFrontFileObject::countDataObjectRefs(int id) const { return 0; // TODO diff --git a/src/db/dbemufrontfileobject.h b/src/db/dbemufrontfileobject.h index e9535d4..ae981ff 100644 --- a/src/db/dbemufrontfileobject.h +++ b/src/db/dbemufrontfileobject.h @@ -49,7 +49,8 @@ protected: virtual QString constructFilterById(int id) const; virtual EmuFrontObject* recordToDataObject(const QSqlRecord* ); QString tableName; - virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f) = 0; + virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f) = 0; + virtual bool deleteDataObject(int id) const; private: virtual QSqlQueryModel* getData(); diff --git a/src/db/dbfile.cpp b/src/db/dbfile.cpp index 7bf64e3..950a0c3 100644 --- a/src/db/dbfile.cpp +++ b/src/db/dbfile.cpp @@ -130,6 +130,17 @@ bool DbFile::deleteDataObjectFromModel(QModelIndex *index) //return QSqlDatabase::database().commit(); } +bool DbFile::deleteDataObject(int id) const +{ + if (countDataObjectRefs(id) > 0) + // TODO + return false; + QSqlQuery q; + q.prepare(QString("DELETE FROM file WHERE id=:id")); + q.bindValue(":id", id); + return q.exec(); +} + QString DbFile::constructSelect(QString whereClause) const { QString where = whereClause.isEmpty() diff --git a/src/db/dbfile.h b/src/db/dbfile.h index 2ce3172..80144b3 100644 --- a/src/db/dbfile.h +++ b/src/db/dbfile.h @@ -47,6 +47,7 @@ protected: virtual QString constructSelectById(int id) const; virtual QString constructFilterById(int id) const; virtual QString constructSelect(QString whereClause = "") const; + virtual bool deleteDataObject(int id) const; int type; private: diff --git a/src/db/dbfilepath.cpp b/src/db/dbfilepath.cpp index a86da93..0c4285a 100644 --- a/src/db/dbfilepath.cpp +++ b/src/db/dbfilepath.cpp @@ -89,6 +89,17 @@ bool DbFilePath::deleteDataObjectFromModel(QModelIndex *index) return false; } +bool DbFilePath::deleteDataObject(int id) const +{ + if (countDataObjectRefs(id) > 0) + // TODO + return false; + QSqlQuery q; + q.prepare(QString("DELETE FROM filepath WHERE id=:id")); + q.bindValue(":id", id); + return q.exec(); +} + QString DbFilePath::constructSelect(QString whereClause) const { QString where = whereClause.isEmpty() diff --git a/src/db/dbfilepath.h b/src/db/dbfilepath.h index 50d0cae..9448074 100644 --- a/src/db/dbfilepath.h +++ b/src/db/dbfilepath.h @@ -43,6 +43,7 @@ protected: virtual QString constructSelectById(int id) const; virtual QString constructFilterById(int id) const; virtual QString constructSelect(QString whereClause = "") const; + virtual bool deleteDataObject(int id) const; private: virtual QSqlQueryModel* getData(); diff --git a/src/db/dbmediaimagecontainer.cpp b/src/db/dbmediaimagecontainer.cpp index 0f68a96..0705f3c 100644 --- a/src/db/dbmediaimagecontainer.cpp +++ b/src/db/dbmediaimagecontainer.cpp @@ -39,56 +39,64 @@ bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo) int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo) { - /* "CREATE TABLE IF NOT EXISTS mediaimagecontainer " - "(id INTEGER PRIMARY KEY, " - "fileid INTEGER REFERENCES file(id), " - "filepathid INTEGER REFERENCES filepath(id), " - "updatetime NUMERIC)"*/ - const MediaImageContainer *mic = dynamic_cast(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()) - // 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("Cannot install media image " "container to database without a file path object!"); - // 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 - int 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())); - } + QList images = mic->getMediaImages(); + QList ids = dbMediaImage->storeMediaImages(images); - // Insert to mediaimagecontainer table + 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; + } - 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()) - // TODO: failed inserting, remove orphaned media images - // (this is actually done in the storeContainers catch block - // but maybe it should be done here also, if this function is called independently! - // 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("Failed inserting media image to database!"); return fileId; } @@ -134,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 @@ -151,47 +160,26 @@ void DbMediaImageContainer::storeContainers(QList lst, Fi foreach(MediaImageContainer *mic, lst) { qDebug() << "Media image container " << mic->getName(); - QList 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 ids = dbMediaImage->storeMediaImages(images); - - if (ids.count() > 0) - { - try { - // mediaimagecontainer table: id, fileid, filepathid, updatetime - - // insert the media image container file to file table - int micFileId = insertDataObjectToModel(mic); - if (micFileId < 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())); - } - // link all the media image ids in list to media image container id - linkMediaImagesWithContainer(micFileId, ids); - } catch (EmuFrontException e) { - // need to remove the media images without media image container in list 'ids' - // TODO: clean - // all the media image and ...containers from - // the memory! (maybe throw another exception on calling code block for this) - - dbMediaImage->removeOrphanedMediaImages(ids); - } - } + int micFileId = insertDataObjectToModel(mic); } } void DbMediaImageContainer::linkMediaImagesWithContainer(int micId, QList miIds) { - // TODO + 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)); + } + } } diff --git a/src/db/dbquerymodelmanager.h b/src/db/dbquerymodelmanager.h index 5fe95f4..66c1e92 100644 --- a/src/db/dbquerymodelmanager.h +++ b/src/db/dbquerymodelmanager.h @@ -33,6 +33,7 @@ protected: virtual QString constructSelectById(int id) const = 0; virtual QString constructFilterById(int id) const = 0; virtual QString constructSelect(QString whereClause = "") const = 0; + virtual bool deleteDataObject(int id) const = 0; }; #endif // DBQUERYMODELMANAGER_H diff --git a/src/db/dbsetup.cpp b/src/db/dbsetup.cpp index a8e7e75..443fb44 100644 --- a/src/db/dbsetup.cpp +++ b/src/db/dbsetup.cpp @@ -131,6 +131,17 @@ bool DbSetup::deleteDataObjectFromModel(QModelIndex */*index*/) return false; } +bool DbSetup::deleteDataObject(int id) const +{ + if (countDataObjectRefs(id) > 0) + // TODO + return false; + QSqlQuery q; + q.prepare(QString("DELETE FROM setup WHERE id=:id")); + q.bindValue(":id", id); + return q.exec(); +} + QSqlQueryModel* DbSetup::getData() { QSqlQueryModel *model = new QSqlQueryModel; diff --git a/src/db/dbsetup.h b/src/db/dbsetup.h index b0c558e..775fdab 100644 --- a/src/db/dbsetup.h +++ b/src/db/dbsetup.h @@ -45,6 +45,7 @@ protected: virtual QString constructSelectById(int id) const; virtual QString constructFilterById(int id) const; virtual QString constructSelect(QString whereClause = "") const; + virtual bool deleteDataObject(int id) const; private: virtual QSqlQueryModel* getData(); -- 1.7.9.5