From 5cad728431855047ce58f8be4d0743d2cee0a263 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mikko=20Kein=C3=A4nen?= Date: Sun, 10 Oct 2010 11:54:57 +0300 Subject: [PATCH] Added counting of reference dependencies. Added also new triggers for deleteing dependencies automatically. --- doc/er.dia | Bin 4475 -> 4485 bytes doc/uml-db_layer.dia | Bin 5950 -> 5706 bytes src/db/databasemanager.cpp | 14 ++++++++++++++ src/db/databasemanager.h | 3 ++- src/db/dbcreator.cpp | 23 ++++++++++++++++++++--- src/db/dbemufrontfileobject.cpp | 6 ------ src/db/dbemufrontfileobject.h | 1 - src/db/dbexecutable.cpp | 12 ++++++------ src/db/dbexecutable.h | 2 +- src/db/dbfile.cpp | 25 +++++++++++++++++++------ src/db/dbfile.h | 3 ++- src/db/dbfilepath.cpp | 14 +++++++++----- src/db/dbfilepath.h | 2 +- src/db/dbmediaimage.cpp | 14 ++++++++++++++ src/db/dbmediaimage.h | 5 +++-- src/db/dbmediaimagecontainer.cpp | 22 ++++++++++++++++------ src/db/dbmediaimagecontainer.h | 2 +- src/db/dbmediatype.cpp | 7 +++++++ src/db/dbmediatype.h | 3 +++ src/db/dbplatform.cpp | 10 ++++++++++ src/db/dbplatform.h | 2 ++ src/db/dbsetup.cpp | 19 +++++++++++++------ src/db/dbsetup.h | 2 +- src/emulauncher.cpp | 2 +- 24 files changed, 145 insertions(+), 48 deletions(-) diff --git a/doc/er.dia b/doc/er.dia index 2df0a3bc01435b0ba1965e49e5978219bfe3a5c5..400ce37530ad13365ad9505d7dbb1a7f5a0d0c9b 100644 GIT binary patch delta 1285 zcmV+g1^W8?B84NcbPRuKGBUj;Z`xIZupFo+I=V7aNE-pG%Nrd}=B-4>i=Hmg@k5G^ z7aOzd@OW~`rE#SDgNW3Raqe#G8vP8Am@Kk&EbSSrC>3+zRLvq(s;lD3UtBe6l5Yr6cm%PIs{$O3qdItp$vrF zqmjos9bRjdv%Rp^XDu2gHE*;rOv)K& zp<>cO`#!?2woNB*43I`S9kfU$=)NvV>Vqq{#3ZZ_`@u)a)s|q_bzLTB#TrwI6>G*< z5QK?%AF>v#B{R0!*nQ^;B02^{)J_W$DoE(vA)(}o=U9IXv2Y$7=B(LgO43-Sgc_Z$ zqK22TKHh%>m%V0xl+$6`V>pw{X3zQK3KgN*S9TbaYeVDlK>Zn@Ib)tesYpgTth_+Q z$5iDVB%91wNe>rvRMNwxF!Y$glHI`>cZTjZ9>l3IXIjk(hh8xuZuaJR<;FV87Qmp& ze%|O9o6naz;WcW{H>N!t)p?_cZ{OjF$@QRTNGN}J5(@xwLL?$%A{C95wjA(s$-3E{tIGm>1i9Oo!02EI0H)HBkFE+{%OBjkx{R_02QBW;Q=($R@sMXj&nM&)(D5-T_3@MgUbbD%2-%*`)Pr( z$$bM6pD3iS%?t1*XJG@Aa@r{-WjvBFqtM{2<`>XxJ8*4tX&z;DI7k{iXA)?wu?H8h z$8d zMc=5y>*;zyBKMkrddXw8$u-Md3(t{3jR%U4syusv8HpkiN{I^ zD&RwyX^Q`P4F2olHa^hBg)J`ZyK`Y-2h|PAc?+!Ooko+l!ht}(b4<#j)xCYO*2NNp zkQ;v_jdMEa?#h6^ug5q%57wHW4)ebbl9EfA8HXbTMlUWe+*h(EW07z^8ZKwHnVa9! znJYp40*bzaB7Q0hA}WaJ-60~I9yvk>fnzCF7#*_ahlQ3dc&4N=gh~nvz#U%^5SfrY zY&62@P*Pba<2k-{poj<$5D}%9E|Wd?$T@i%pY_N>&PAC>#|5mkFp4fThg-5jqIB-c zM4*C@-k_Sf;G}|+em0zxUW~1Ubc%CaG0mS9C}~0;0d-&eKwfu*BRr*tmA}tE5@?*& vL8PRmvav41E31ww!Df?@QhzchWt}9?!ii2K#-hr~Ij1}NtfdAfs z|NISrzbbVx1@{kPrLc>k`z|;hP^o>^W^|^c9PrR`>9k|mA5=dY(|~=8vHOF34w@xT zCS%eM5(i6c7T&z&{A}`)gW^A+3ApUVa z)|Q0qF~I%1+bO}%t}Sy6%W#nQ2lO$y*b)ewaCf#B*7|>}MZ=`#jW&i!IpZu;Ogd=a z2ly4_4)Bk1I%tvT&ic9}sSmE)5|gk#><1quS6hNz*L9hk6>Cf-R;(FcK@cY5eaKp{ zmdw~@WA~jai0Bv)Q9CV2s34(thlG+Vo@4zn#KL)SSxX(5k~Eenp+={xsNrR-k2k?( zuh}2vbl89Pm=NMpaQ?VLMQHYw9meF^(0Dvhe+FpIn5R%Gl93K8FHrF@Re1-=CNoyj z!v!6c^l+&QJ!Y_EcW}m?p}UO-aVpH2R&&CkS4@bTy?I`_vCgsuFsQPhH#)}V^QBIB zjoR~#X%9zr-YDYRcQ|5lIp|qzFo^{KIUy2}F_C48#!B);L2icCSrcmMoNbm-OX8wL zj1C49HNQ6(cU^s64rnaLo(!qtm&>e=)7dK_ z{GyOc2)~5z-?JG>E?SPQgNlK#%^LOWTNIfNlU@%oeM26GN^I3rq8T7r-v z3b3{Te=06NP!NS?>&oDb<$0Xh!MX@3Llk|Z4zH){1&Q2i0_r7?)h5?0b1gha29b}n z$|=fTcn*Am2(Ax&>NvoNGRi`)1>7ZBeNpt~yr`o13H@H|*+emczmI!H<` zWo8_X5E#9p*h@=6%wU$S0(}#g!Bg0%mpVEobSNy;{|7)#S=)9y0RW{|U(Nsk diff --git a/doc/uml-db_layer.dia b/doc/uml-db_layer.dia index 2605b898bec5df5815bda125765bf32e63da9e90..906b5e2c68c9ba42c02215af82f8747ed3b64fd1 100644 GIT binary patch literal 5706 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 literal 5950 zcmb7HcQD-jw-zP375zo@PKbo8E_#U?tl&k6)ork=t`e*+iA3+LAZpar34-WE^s);QI<99>!UB+51-f#w>{a@ONer7&U=Znv>jCXa?uz}YH9jy(S=ennsBJPCZ zr;%(rfpDW;-k!ZIJGx*?Ztraln)MfvJA~@mcu# z(KipS*;WwRG(n`h2fCFLvHDt?A*_N|L<18>np9G!dv>ihp;Z>OqN1>y#A?YT|Blt+ zpsS-fQFdLEv*+tuUyE{kweh#|WkluQ$WnJ5(Bh_2w0BN^wESTENxCA$^ZvP|K?A`^ijP+G;Fr%0U0$ul>lk#?WaCk1Wx;Xqr|KDW0`&a!HSh0v0ISF( zW0#j%WH`hixqbFNp!vfD?S7c;6Zk-sG?q6h!=(s&x`irD-Zz7m4{DuYG9q|tTiw;% zmd2gpM7)+<93i~>EpyjLpXJ)OuA_7w@vmnk?K&0IK+$i1opmfIQOGu7iq8l=P>HL3 z+`C-&7ZkfU#t!2Q1~NrXk?0p5=UZE+jcNyrbJ=Urg#;?%2Al_3iMe7i)Jj+J zL&&|(>^b7xmu{|lpqxk4DF73p$$0%#Brv1<3oh!ceG3~`)AchY>BG?Eti6M6$zic` z!vsV~c7~_(K#^s#tBWBj$;F_*fE8)zbX; z`6e7*KRS4#JYitP-lSH<_bcqwF z2Di&L+(2-3#&PiVYS-_}0XkcHQqQW`h+T~uFp;8U;Nc8#5jmraE}pBy8)}6cu_6>0 z0CVq{Uv>7FOD%l-mAC(3utR@2k}vBL&b90lYzxKQ(?KHwjyr00{Rd`J!gB(FM7dVz ztz}>2DWSmO!weWA^{Vbv-`e=BcEdocH5DCtt<7c8J>ZzX0E|C(OYLJVcrm9XGyd*< z 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 diff --git a/src/db/databasemanager.cpp b/src/db/databasemanager.cpp index 8834cb1..d0b4b86 100644 --- a/src/db/databasemanager.cpp +++ b/src/db/databasemanager.cpp @@ -151,3 +151,17 @@ EmuFrontObject* DatabaseManager::getDataObjectFromModel(QModelIndex *index) int DatabaseManager::getCurrentTimeStamp() { return QDateTime::currentDateTime().toTime_t(); } + +int DatabaseManager::countDataObjectRefs(int id) const +{ + int ret = 0; + QSqlQuery q; + q.prepare(getCountRefsSelect(id)); + q.exec(); + QSqlRecord rec; + if (q.next()) { + rec = q.record(); + ret = rec.value(0).toInt(); + } + return ret; +} diff --git a/src/db/databasemanager.h b/src/db/databasemanager.h index 579ba13..0d6f16d 100644 --- a/src/db/databasemanager.h +++ b/src/db/databasemanager.h @@ -43,7 +43,7 @@ public: virtual bool updateDataObjectToModel(const EmuFrontObject*) = 0; virtual int insertDataObjectToModel(const EmuFrontObject*) = 0; virtual bool deleteDataObjectFromModel(QModelIndex*) = 0; - virtual int countDataObjectRefs(int id) const = 0; + int countDataObjectRefs(int id) const; static int getCurrentTimeStamp(); static bool openDB(); void resetModel(); @@ -76,6 +76,7 @@ private: virtual QSqlQueryModel* getData() = 0; static QString getDbPath(); EmuFrontObject* getFilteredDataObject(); + virtual QString getCountRefsSelect(int) const = 0; }; diff --git a/src/db/dbcreator.cpp b/src/db/dbcreator.cpp index 745b1a4..23202e0 100644 --- a/src/db/dbcreator.cpp +++ b/src/db/dbcreator.cpp @@ -157,17 +157,34 @@ bool DbCreator::createDB() "CREATE TRIGGER IF NOT EXISTS trg_onsetupdelete " "AFTER DELETE ON setup " "BEGIN " - " DELETE FROM filepath WHERE filepath.setupid = old.id;" + " DELETE FROM filepath WHERE filepath.setupid = old.id; " + " DELETE FROM executable WHERE executable.setupid = old.id; " "END;" ); query.exec( + "CREATE TRIGGER IF NOT EXISTS trg_onmediaimagecontainerdelete " + "AFTER DELETE ON mediaimagecontainer " + "BEGIN " + " DELETE FROM file WHERE id=old.fileid; " + " DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainerid=old.fileid; " + "END;" + ); + query.exec( + "CREATE TRIGGER IF NOT EXISTS trg_onmediaimagecontainer_mediaimagedelete " + "AFTER DELETE ON mediaimagecontainer_mediaimage " + "BEGIN " + " DELETE FROM file WHERE id=old.mediaimageid; " + " DELETE FROM mediaimagecontainer WHERE fileid=old.mediaimagecontainerid; " + ); + query.exec( "CREATE TRIGGER IF NOT EXISTS trg_onfiledelete " "AFTER DELETE ON file " "BEGIN " - " UPDATE platform SET platform.fileid=NULL WHERE platform.fileid = old.id;" + " UPDATE platform SET platform.fileid=NULL WHERE platform.fileid = old.id;." " UPDATE mediatype SET mediatype.fileid=NULL WHERE mediatype.fileid = old.id;" " DELETE FROM mediaimagecontainer WHERE fileid = old.id;" - " DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainer_mediaimage.fileid = old.id;" + " DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainer_mediaimage.mediaimageid = old.id;" + " DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainer_mediaimage.mediaimagecontainerid = old.id;" "END;" ); } diff --git a/src/db/dbemufrontfileobject.cpp b/src/db/dbemufrontfileobject.cpp index 9245323..9922313 100644 --- a/src/db/dbemufrontfileobject.cpp +++ b/src/db/dbemufrontfileobject.cpp @@ -99,12 +99,6 @@ bool DbEmuFrontFileObject::deleteDataObject(int id) const } -int DbEmuFrontFileObject::countDataObjectRefs(int id) const -{ - return 0; // TODO - // return countRows("imagecontainer", "platformid", id); -} - // WARNING: this will delete also all the databindings to selected platform bool DbEmuFrontFileObject::deleteDataObjectFromModel(QModelIndex *index) { diff --git a/src/db/dbemufrontfileobject.h b/src/db/dbemufrontfileobject.h index 97dddb2..9cd2b1a 100644 --- a/src/db/dbemufrontfileobject.h +++ b/src/db/dbemufrontfileobject.h @@ -31,7 +31,6 @@ DbEmuFrontFileObject(QObject *parent); virtual bool updateDataObjectToModel(const EmuFrontObject*); int insertDataObjectToModel(const EmuFrontObject*); bool deleteDataObjectFromModel(QModelIndex*); -int countDataObjectRefs(int) const; enum { EmuFrontFileObject_Id= 0, EmuFrontFileObject_Name, diff --git a/src/db/dbexecutable.cpp b/src/db/dbexecutable.cpp index 44ca513..58ebe38 100644 --- a/src/db/dbexecutable.cpp +++ b/src/db/dbexecutable.cpp @@ -104,12 +104,6 @@ bool DbExecutable::deleteDataObjectFromModel(QModelIndex*) return false; } -int DbExecutable::countDataObjectRefs(int) const -{ - // TODO - return 0; -} - QString DbExecutable::constructSelectById(int id) const { return constructSelect( @@ -162,3 +156,9 @@ QSqlQueryModel* DbExecutable::getData() return model; } +QString DbExecutable::getCountRefsSelect(int id) const +{ + // These objects don't have references from other objects + // currently. + return QString("SELECT 0"); +} diff --git a/src/db/dbexecutable.h b/src/db/dbexecutable.h index cf1f3af..aa4bb59 100644 --- a/src/db/dbexecutable.h +++ b/src/db/dbexecutable.h @@ -31,7 +31,6 @@ public: virtual bool updateDataObjectToModel(const EmuFrontObject*); int insertDataObjectToModel(const EmuFrontObject*); bool deleteDataObjectFromModel(QModelIndex*); - int countDataObjectRefs(int) const; enum { Executable_Id = 0, Executable_Name, @@ -49,6 +48,7 @@ protected: virtual bool deleteDataObject(int id) const; private: virtual QSqlQueryModel* getData(); + virtual QString getCountRefsSelect(int) const; DbSetup *dbSetup; }; diff --git a/src/db/dbfile.cpp b/src/db/dbfile.cpp index 321c4dc..b9ab3dd 100644 --- a/src/db/dbfile.cpp +++ b/src/db/dbfile.cpp @@ -98,12 +98,6 @@ int DbFile::insertDataObjectToModel(const EmuFrontObject *ob) }*/ -int DbFile::countDataObjectRefs(int id) const -{ - return 0; // TODO - // return countRows("imagecontainer", "platformid", id); -} - // WARNING: this will delete also all the databindings to selected platform // the delete must be confirmed in the UI bool DbFile::deleteDataObjectFromModel(QModelIndex *index) @@ -183,3 +177,22 @@ EmuFrontObject* DbFile::getFileByChecksum(QString checksum) { return getDataObject(QString("checksum LIKE '%1'").arg(checksum)); } + +QString DbFile::getCountRefsSelect(int id) const +{ + /* files are referenced from platform, mediatype, mediaimagecontainer_mediaimage and mediaimagecontainer. */ + return QString("SELECT count(*) FROM (" + "SELECT file.id FROM file " + "INNER JOIN platform ON file.id=platform.fileid " + "WHERE file.id=%1 " + "UNION ALL " + "SELECT file.id FROM file " + "INNER JOIN mediatype ON file.id=mediatype.fileid " + "WHERE file.id=%1 " + "UNION ALL " + "SELECT file.id FROM file " + "INNER JOIN mediaimagecontainer_mediaimage " + "ON (mediaimagecontainerid=file.id OR mediaimageid=file.id) " + "WHERE file.id=%1 " + ")").arg(id); +} diff --git a/src/db/dbfile.h b/src/db/dbfile.h index 12e067b..24cd60a 100644 --- a/src/db/dbfile.h +++ b/src/db/dbfile.h @@ -30,7 +30,6 @@ public: virtual bool updateDataObjectToModel(const EmuFrontObject*); int insertDataObjectToModel(const EmuFrontObject*); bool deleteDataObjectFromModel(QModelIndex*); - int countDataObjectRefs(int) const; EmuFrontObject* getFileByChecksum(QString checksum); //int insertFile(const EmuFrontFile *); @@ -50,6 +49,8 @@ protected: virtual bool deleteDataObject(int id) const; int type; virtual QSqlQueryModel* getData(); +private: + virtual QString getCountRefsSelect(int) const; }; #endif // DBFILE_H diff --git a/src/db/dbfilepath.cpp b/src/db/dbfilepath.cpp index e124b65..24e62fe 100644 --- a/src/db/dbfilepath.cpp +++ b/src/db/dbfilepath.cpp @@ -78,11 +78,6 @@ int DbFilePath::insertDataObjectToModel(const EmuFrontObject *ob) return id; } -int DbFilePath::countDataObjectRefs(int id) const -{ - return 0; -} - // WARNING: this will delete also all the databindings to selected media image path bool DbFilePath::deleteDataObjectFromModel(QModelIndex *index) { @@ -140,3 +135,12 @@ QSqlQueryModel* DbFilePath::getData() model->setHeaderData(FilePath_SetupName, Qt::Horizontal, tr("Set up")); return model; } + +QString DbFilePath::getCountRefsSelect(int id) const +{ + /* filepath is referenced from mediaimagecontainer */ + return QString("SELECT count(*) FROM filepath" + "INNER JOIN mediaimagecontainer " + "ON filepath.id=mediaimagecontainer.filepathid" + "WHERE filepath.id=%1").arg(id); +} diff --git a/src/db/dbfilepath.h b/src/db/dbfilepath.h index 84848d8..682d393 100644 --- a/src/db/dbfilepath.h +++ b/src/db/dbfilepath.h @@ -31,7 +31,6 @@ public: virtual bool updateDataObjectToModel(const EmuFrontObject*); int insertDataObjectToModel(const EmuFrontObject*); bool deleteDataObjectFromModel(QModelIndex*); - int countDataObjectRefs(int) const; enum { FilePath_Id = 0, FilePath_Name, FilePath_LastScanned, @@ -47,6 +46,7 @@ protected: private: virtual QSqlQueryModel* getData(); + virtual QString getCountRefsSelect(int) const; DbSetup *dbSetup; }; diff --git a/src/db/dbmediaimage.cpp b/src/db/dbmediaimage.cpp index a45a276..c741dd2 100644 --- a/src/db/dbmediaimage.cpp +++ b/src/db/dbmediaimage.cpp @@ -157,3 +157,17 @@ QList DbMediaImage::getMediaImages(int micId) const } return list; } + +QString DbMediaImage::getCountRefsSelect(int id) const +{ + + /* nothing will be removed if a mediaimage file is removed + from the db. TODO: if all the mediaimages from + mediaimagecontainer are removed + the mediaimagecontainer should be removed! */ + return QString("SELECT 0"); + /*return QString("SELECT count(*) FROM file " + "INNER JOIN mediaimagecontainer_mediaimage " + "ON file.id=mediaimagecontainer_mediaimage.mediaimageid " + "WHERE file.id=%1").arg(id);*/ +} diff --git a/src/db/dbmediaimage.h b/src/db/dbmediaimage.h index 910d1a4..cedc3a6 100644 --- a/src/db/dbmediaimage.h +++ b/src/db/dbmediaimage.h @@ -33,15 +33,16 @@ public: /*virtual bool updateDataObjectToModel(const EmuFrontObject *); virtual bool insertDataObjectToModel(const EmuFrontObject *); virtual bool deleteDataObjectFromModel(QModelIndex *); - virtual int countDataObjectRefs(int id) const; int getMediaImage(QString checksum) const; int insertMediaImage(const MediaImage*); protected: virtual QString constructSelect(QString whereClause) const; virtual QString constructSelectById(int id) const; virtual EmuFrontObject* recordToDataObject(const QSqlRecord *); + */ private: - virtual QSqlQueryModel* getData();*/ + /*virtual QSqlQueryModel* getData();*/ + virtual QString getCountRefsSelect(int) const; }; #endif // DBMEDIAIMAGE_H diff --git a/src/db/dbmediaimagecontainer.cpp b/src/db/dbmediaimagecontainer.cpp index b353995..2d54917 100644 --- a/src/db/dbmediaimagecontainer.cpp +++ b/src/db/dbmediaimagecontainer.cpp @@ -120,12 +120,6 @@ bool DbMediaImageContainer::deleteDataObjectFromModel(QModelIndex *i) return false; } -int DbMediaImageContainer::countDataObjectRefs(int id) const -{ - // TODO - return -1; -} - QString DbMediaImageContainer::constructSelect(QString whereClause) const { // TODO, for a usual search we need a "light" version of this select @@ -263,3 +257,19 @@ void DbMediaImageContainer::filter(int mediaTypeId, int platformId) filterDataObjects(filters); } +QString DbMediaImageContainer::getCountRefsSelect(int id) const +{ + /* we need to count file references to give media image container */ + /* example: + select count(*) from mediaimagecontainer + INNER JOIN mediaimagecontainer_mediaimage + ON mediaimagecontainer_mediaimage.mediaimagecontainerid + = mediaimagecontainer.fileid + WHERE mediaimagecontainer.fileid=589; + */ + return QString("SELECT count(*) FROM mediaimagecontainer " + "INNER JOIN mediaimagecontainer_mediaimage " + "ON mediaimagecontainer_mediaimage.mediaimagecontainerid " + " =mediaimagecontainer.fileid " + "WHERE mediaimagecontainer.fileid=%1").arg(id); +} diff --git a/src/db/dbmediaimagecontainer.h b/src/db/dbmediaimagecontainer.h index 9a94c2d..fa6488e 100644 --- a/src/db/dbmediaimagecontainer.h +++ b/src/db/dbmediaimagecontainer.h @@ -38,7 +38,6 @@ public: virtual bool updateDataObjectToModel(const EmuFrontObject *); virtual int insertDataObjectToModel(const EmuFrontObject *); virtual bool deleteDataObjectFromModel(QModelIndex *); - virtual int countDataObjectRefs(int id) const; void storeContainers(QList, FilePathObject*); int getMediaImageContainer(QString checksum) const; void filter(int mediaTypeId, int platformId); @@ -67,6 +66,7 @@ private: void linkMediaImagesWithContainer(int, QList); DbMediaImage *dbMediaImage; DbFilePath *dbFilePath; + virtual QString getCountRefsSelect(int) const; // DbSetup *dbSetup; // DbFile *dbFile; }; diff --git a/src/db/dbmediatype.cpp b/src/db/dbmediatype.cpp index 758ed2f..3c1bd87 100644 --- a/src/db/dbmediatype.cpp +++ b/src/db/dbmediatype.cpp @@ -28,3 +28,10 @@ tableName = DbMediaType::DB_TABLE_NAME_MEDIATYPE; EmuFrontObject* DbMediaType::createEmuFrontFileObject(int id, QString name, EmuFrontFile *f) { return new MediaType(id, name, f); } + +QString DbMediaType::getCountRefsSelect(int id) const +{ + return QString("SELECT count(*) FROM mediatype " + "INNER JOIN setup ON mediatype.id=setup.mediatypeid " + "WHERE mediatype.id=%1").arg(id); +} diff --git a/src/db/dbmediatype.h b/src/db/dbmediatype.h index 2bfd700..fe4b483 100644 --- a/src/db/dbmediatype.h +++ b/src/db/dbmediatype.h @@ -30,6 +30,9 @@ public: protected: virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f); + +private: + QString getCountRefsSelect(int) const; }; #endif // DBMEDIATYPE_H diff --git a/src/db/dbplatform.cpp b/src/db/dbplatform.cpp index a7dd5f4..6bfa595 100644 --- a/src/db/dbplatform.cpp +++ b/src/db/dbplatform.cpp @@ -18,6 +18,9 @@ // along with EmuFront. If not, see . #include "dbplatform.h" +#include +#include +#include //QString DbPlatform::tableName = DbPlatform::DB_TABLE_NAME_PLATFORM; @@ -28,3 +31,10 @@ DbPlatform::DbPlatform(QObject *parent) : DbEmuFrontFileObject(parent) EmuFrontObject* DbPlatform::createEmuFrontFileObject(int id, QString name, EmuFrontFile *f) { return new Platform(id, name, f); } + +QString DbPlatform::getCountRefsSelect(int id) const +{ + return QString("SELECT count(*) FROM platform " + "INNER JOIN setup ON platform.id=setup.platformid " + "WHERE platform.id=%1").arg(id); +} diff --git a/src/db/dbplatform.h b/src/db/dbplatform.h index 20c6961..3c701fa 100644 --- a/src/db/dbplatform.h +++ b/src/db/dbplatform.h @@ -33,6 +33,8 @@ public: protected: virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f); +private: + virtual QString getCountRefsSelect(int) const; }; #endif // DBPLATFORM_H diff --git a/src/db/dbsetup.cpp b/src/db/dbsetup.cpp index b174a86..443e963 100644 --- a/src/db/dbsetup.cpp +++ b/src/db/dbsetup.cpp @@ -91,12 +91,6 @@ int DbSetup::insertDataObjectToModel(const EmuFrontObject *ob) return id; } -int DbSetup::countDataObjectRefs(int ) const -{ - // TODO - return -1; -} - QString DbSetup::constructSelect(QString where) const { /*QString where = whereClause.isEmpty() @@ -158,3 +152,16 @@ QSqlQueryModel* DbSetup::getData() model->setHeaderData(Setup_Name, Qt::Horizontal, tr("Name")); return model; } + +QString DbSetup::getCountRefsSelect(int id) const +{ + /* setups are referenced by executable and filepath */ + return QString("SELECT count(*) FROM " + "(SELECT setup.id FROM setup " + "INNER JOIN executable ON setup.id=executable.setupid " + "WHERE setup.id=%1 " + "UNION ALL " + "SELECT setup.id FROM setup " + "INNER JOIN filepath ON setup.id=filepath.setupid " + "WHERE setup.id=%1)").arg(id); +} diff --git a/src/db/dbsetup.h b/src/db/dbsetup.h index f4cea9d..83b9d9d 100644 --- a/src/db/dbsetup.h +++ b/src/db/dbsetup.h @@ -32,7 +32,6 @@ public: virtual bool updateDataObjectToModel(const EmuFrontObject*); int insertDataObjectToModel(const EmuFrontObject*); bool deleteDataObjectFromModel(QModelIndex*); - int countDataObjectRefs(int) const; enum { Setup_Id = 0, Setup_PlatformId, Setup_MediaTypeId, @@ -49,6 +48,7 @@ protected: private: virtual QSqlQueryModel* getData(); + virtual QString getCountRefsSelect(int) const; DbPlatform *dbPlatform; DbMediaType *dbMediaType; }; diff --git a/src/emulauncher.cpp b/src/emulauncher.cpp index 896d199..5991a36 100644 --- a/src/emulauncher.cpp +++ b/src/emulauncher.cpp @@ -139,8 +139,8 @@ void EmuLauncher::launchEmu() << mic->getName() << " and emulator " << obExe->getName() << "."; if (mic->getMediaImages().count() > 0) { - // TODO // 1. Launch media image + // TODO // 2. If 2 or more media images in container // show a diaglog for choosing the boot image // 3. If 2 or more media image containers selected -- 1.7.9.5