deleteing dependencies automatically.
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;
+}
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();
virtual QSqlQueryModel* getData() = 0;
static QString getDbPath();
EmuFrontObject* getFilteredDataObject();
+ virtual QString getCountRefsSelect(int) const = 0;
};
"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;"
);
}
}
-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)
{
virtual bool updateDataObjectToModel(const EmuFrontObject*);
int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
-int countDataObjectRefs(int) const;
enum {
EmuFrontFileObject_Id= 0,
EmuFrontFileObject_Name,
return false;
}
-int DbExecutable::countDataObjectRefs(int) const
-{
- // TODO
- return 0;
-}
-
QString DbExecutable::constructSelectById(int id) const
{
return constructSelect(
return model;
}
+QString DbExecutable::getCountRefsSelect(int id) const
+{
+ // These objects don't have references from other objects
+ // currently.
+ return QString("SELECT 0");
+}
virtual bool updateDataObjectToModel(const EmuFrontObject*);
int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
- int countDataObjectRefs(int) const;
enum {
Executable_Id = 0,
Executable_Name,
virtual bool deleteDataObject(int id) const;
private:
virtual QSqlQueryModel* getData();
+ virtual QString getCountRefsSelect(int) const;
DbSetup *dbSetup;
};
}*/
-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)
{
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);
+}
virtual bool updateDataObjectToModel(const EmuFrontObject*);
int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
- int countDataObjectRefs(int) const;
EmuFrontObject* getFileByChecksum(QString checksum);
//int insertFile(const EmuFrontFile *);
virtual bool deleteDataObject(int id) const;
int type;
virtual QSqlQueryModel* getData();
+private:
+ virtual QString getCountRefsSelect(int) const;
};
#endif // DBFILE_H
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)
{
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);
+}
virtual bool updateDataObjectToModel(const EmuFrontObject*);
int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
- int countDataObjectRefs(int) const;
enum { FilePath_Id = 0,
FilePath_Name,
FilePath_LastScanned,
private:
virtual QSqlQueryModel* getData();
+ virtual QString getCountRefsSelect(int) const;
DbSetup *dbSetup;
};
}
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);*/
+}
/*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
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
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);
+}
virtual bool updateDataObjectToModel(const EmuFrontObject *);
virtual int insertDataObjectToModel(const EmuFrontObject *);
virtual bool deleteDataObjectFromModel(QModelIndex *);
- virtual int countDataObjectRefs(int id) const;
void storeContainers(QList<MediaImageContainer*>, FilePathObject*);
int getMediaImageContainer(QString checksum) const;
void filter(int mediaTypeId, int platformId);
void linkMediaImagesWithContainer(int, QList<int>);
DbMediaImage *dbMediaImage;
DbFilePath *dbFilePath;
+ virtual QString getCountRefsSelect(int) const;
// DbSetup *dbSetup;
// DbFile *dbFile;
};
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);
+}
protected:
virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f);
+
+private:
+ QString getCountRefsSelect(int) const;
};
#endif // DBMEDIATYPE_H
// along with EmuFront. If not, see <http://www.gnu.org/licenses/>.
#include "dbplatform.h"
+#include <QSqlQuery>
+#include <QSqlRecord>
+#include <QVariant>
//QString DbPlatform::tableName = DbPlatform::DB_TABLE_NAME_PLATFORM;
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);
+}
protected:
virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f);
+private:
+ virtual QString getCountRefsSelect(int) const;
};
#endif // DBPLATFORM_H
return id;
}
-int DbSetup::countDataObjectRefs(int ) const
-{
- // TODO
- return -1;
-}
-
QString DbSetup::constructSelect(QString where) const
{
/*QString where = whereClause.isEmpty()
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);
+}
virtual bool updateDataObjectToModel(const EmuFrontObject*);
int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
- int countDataObjectRefs(int) const;
enum { Setup_Id = 0,
Setup_PlatformId,
Setup_MediaTypeId,
private:
virtual QSqlQueryModel* getData();
+ virtual QString getCountRefsSelect(int) const;
DbPlatform *dbPlatform;
DbMediaType *dbMediaType;
};
<< 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