DbTableModelManager.
EmuFrontObject* getDataObject(int id);
EmuFrontObject* getDataObject(QString filter);
virtual bool updateDataObjectToModel(const EmuFrontObject*) = 0;
- virtual bool insertDataObjectToModel(const EmuFrontObject*) = 0;
+ virtual int insertDataObjectToModel(const EmuFrontObject*) = 0;
virtual bool deleteDataObjectFromModel(QModelIndex*) = 0;
virtual int countDataObjectRefs(int id) const = 0;
static int getCurrentTimeStamp();
#include <QSqlRecord>
#include <QSqlQuery>
+#include <QSqlError>
#include <QSqlRelationalTableModel>
#include <QDebug>
#include "dbemufrontfileobject.h"
DbEmuFrontFileObject::DbEmuFrontFileObject(QObject *parent)
- : DbTableModelManager(parent)
+ : DbQueryModelManager(parent)
{
dbFile = new DbFile(this);
}
{
const EmuFrontFileObject *plf = dynamic_cast<const EmuFrontFileObject*>(ob);
bool ret = false;
+ QSqlQuery query;
+ query.prepare(QString("UPDATE %1 SET "
+ "name=:name, "
+ "fileid=:fileid "
+ "WHERE id=:id").arg(tableName));
+ query.bindValue(":name", plf->getName());
+ query.bindValue(":fileid",
+ plf->getFile() ? QString(plf->getFile()->getId()) : "NULL");
+ query.bindValue(":id", plf->getId());
+ ret = query.exec();
+
+ /*
QSqlTableModel *tmodel = dynamic_cast<QSqlTableModel*>(sqlTableModel);
tmodel->setFilter(QString("id = %1").arg(plf->getId()));
tmodel->select();
else record.setNull("fileid");
tmodel->setRecord(0, record);
ret = tmodel->submitAll();
- }
- resetModel();
+ }*/
+ if (ret) resetModel();
+ else
+ qDebug() << "Failed updating " << tableName
+ << " " << query.lastError().text()
+ << " " << query.executedQuery() ;
return ret;
}
-bool DbEmuFrontFileObject::insertDataObjectToModel(const EmuFrontObject *ob)
+int DbEmuFrontFileObject::insertDataObjectToModel(const EmuFrontObject *ob)
{
const EmuFrontFileObject *plf = dynamic_cast<const EmuFrontFileObject *>(ob);
- int row = 0;
+ QSqlQuery query;
+ query.prepare(QString("INSERT INTO %1 (id, name, fileid) "
+ "VALUES (NULL, :name, :fileid) ").arg(tableName));
+ query.bindValue(":name", plf->getName());
+ if (plf->getFile())
+ query.bindValue(":fileid", plf->getFile()->getId());
+ else query.bindValue(":fileid", "NULL");
+ int id = -1;
+ if (query.exec())
+ id = query.lastInsertId().toInt();
+ else
+ qDebug() << "Failed inserting to " << tableName << " "
+ << query.lastError().text() << " " << query.executedQuery() ;
+ return id;
+
+ /*int row = 0;
if (!sqlTableModel) sqlTableModel = getDataModel();
QSqlTableModel *tmodel = dynamic_cast<QSqlTableModel*>(sqlTableModel);
tmodel->insertRows(row, 1);
tmodel->setData(sqlTableModel->index(row, EmuFrontFileObject_Name), plf->getName());
if (plf->getFile())
tmodel->setData(sqlTableModel->index(row, EmuFrontFileObject_FileId), plf->getFile()->getId());
- return tmodel->submitAll();
+ if (tmodel->submitAll())
+ return ... // TODO: update to use dbquerymodelmanager instead of tablemodelmanager
+ // TODO: and return the last insert id
+ */
}
int DbEmuFrontFileObject::countDataObjectRefs(int id) const
// WARNING: this will delete also all the databindings to selected platform
bool DbEmuFrontFileObject::deleteDataObjectFromModel(QModelIndex *index)
{
+ return false;
//QSqlDatabase::database().transaction();
- QSqlTableModel *tmodel = dynamic_cast<QSqlTableModel*>(sqlTableModel);
+ //QSqlTableModel *tmodel = dynamic_cast<QSqlTableModel*>(sqlTableModel);
/*QSqlRecord record = tmodel->record(index->row());
int id = record.value(EmuFrontFileObject_Id).toInt();
qDebug() << "Deleting platform " << id;
return false;
}
}*/
- tmodel->removeRow(index->row());
+ /*tmodel->removeRow(index->row());
tmodel->submitAll();
return QSqlDatabase::database().commit();
+ */
+}
+
+QString DbEmuFrontFileObject::constructSelect(QString whereClause) const
+{
+ QString where = whereClause.isEmpty()
+ ? "" : QString("WHERE ").append(whereClause);
+
+ return QString("SELECT maintbl.id AS FileObjectId, "
+ "maintbl.name AS Name, "
+ "file.id AS FileId, "
+ "file.name AS FileName, "
+ "file.type AS FileType, "
+ "file.checksum AS FileChecksum, "
+ "file.size AS FileSize, "
+ "file.updatetime AS FileUpdateTime "
+ "FROM %1 AS maintbl "
+ "LEFT OUTER JOIN file ON maintbl.fileid=file.id "
+ "%2 "
+ "ORDER BY Name").arg(tableName).arg(where);
+}
+
+QString DbEmuFrontFileObject::constructSelectById(int id) const
+{
+ return constructSelect(constructFilterById(id));
+}
+
+QString DbEmuFrontFileObject::constructFilterById(int id) const
+{
+ return QString("maintbl.id = %1").arg(id);
}
QSqlQueryModel* DbEmuFrontFileObject::getData()
{
- QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
+ /*QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
model->setTable(tableName);
// TODO: table realtion model seems not to be suitable for this
// since not always does data object have a file relation:
model->setSort(EmuFrontFileObject_Name, Qt::AscendingOrder);
model->setHeaderData(EmuFrontFileObject_Name, Qt::Horizontal, tr("Name"));
model->setHeaderData(EmuFrontFileObject_FileId, Qt::Horizontal, tr("Icon"));
- model->select();
+ model->select();*/
+ QSqlQueryModel *model = new QSqlQueryModel;
+ model->setQuery(constructSelect());
+ model->setHeaderData(EmuFrontFileObject_Id, Qt::Horizontal, tr("Id"));
+ model->setHeaderData(EmuFrontFileObject_Name, Qt::Horizontal, tr("Name"));
+ /*model->setHeaderData(EmuFrontFileObject_FileId, Qt::Horizontal, tr("File id"));
+ model->setHeaderData(EmuFrontFileObject_FileName, Qt::Horizontal, tr("File name"));
+ model->setHeaderData(EmuFrontFileObject_FileType, Qt::Horizontal, tr("File type"));
+ model->setHeaderData(EmuFrontFileObject_FileCheckSum, Qt::Horizontal, tr("File checksum"));
+ model->setHeaderData(EmuFrontFileObject_FileSize, Qt::Horizontal, tr("File size"));
+ model->setHeaderData(EmuFrontFileObject_FileUpdateTime, Qt::Horizontal, tr("File update time"));*/
return model;
}
#ifndef DBEMUFRONTFILEOBJECT_H
#define DBEMUFRONTFILEOBJECT_H
-#include "dbtablemodelmanager.h"
+#include "dbquerymodelmanager.h"
#include "dbfile.h"
#include "../dataobjects/emufrontfileobject.h"
-class DbEmuFrontFileObject : public DbTableModelManager
+class DbEmuFrontFileObject : public DbQueryModelManager
{
public:
- DbEmuFrontFileObject(QObject *parent);
- virtual bool updateDataObjectToModel(const EmuFrontObject*);
- bool insertDataObjectToModel(const EmuFrontObject*);
- bool deleteDataObjectFromModel(QModelIndex*);
- int countDataObjectRefs(int) const;
- enum {
- EmuFrontFileObject_Id= 0,
- EmuFrontFileObject_Name,
- EmuFrontFileObject_FileId };
+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,
+ EmuFrontFileObject_FileId,
+ EmuFrontFileObject_FileName,
+ EmuFrontFileObject_FileType,
+ EmuFrontFileObject_FileCheckSum,
+ EmuFrontFileObject_FileSize,
+ EmuFrontFileObject_FileUpdateTime
+};
protected:
- virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
- QString tableName;
+ virtual QString constructSelect(QString whereClause = "") const;
+ virtual QString constructSelectById(int id) const;
+ virtual QString constructFilterById(int id) const;
+ virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
+ QString tableName;
virtual EmuFrontObject* createEmuFrontFileObject(int id, QString name, EmuFrontFile *f) = 0;
private:
return ret;
}
-bool DbFile::insertDataObjectToModel(const EmuFrontObject *ob)
+int DbFile::insertDataObjectToModel(const EmuFrontObject *ob)
{
const EmuFrontFile *fi = dynamic_cast<const EmuFrontFile*>(ob);
QSqlQuery q;
"ORDER BY Name").arg(where);
}
+QString DbFile::constructFilterById(int id) const
+{
+ return QString("file.id = %1").arg(id);
+}
+
QString DbFile::constructSelectById(int id) const
{
- return constructSelect(QString("file.id = %1").arg(id));
+ return constructSelect(constructFilterById(id));
}
QSqlQueryModel* DbFile::getData()
public:
DbFile(QObject*);
virtual bool updateDataObjectToModel(const EmuFrontObject*);
- bool insertDataObjectToModel(const EmuFrontObject*);
+ int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
int countDataObjectRefs(int) const;
EmuFrontObject* getFileByChecksum(QString checksum);
protected:
virtual EmuFrontObject* recordToDataObject(const QSqlRecord*);
virtual QString constructSelectById(int id) const;
+ virtual QString constructFilterById(int id) const;
virtual QString constructSelect(QString whereClause = "") const;
int type;
return ret;
}
-bool DbFilePath::insertDataObjectToModel(const EmuFrontObject *ob)
+int DbFilePath::insertDataObjectToModel(const EmuFrontObject *ob)
{
const FilePathObject *fpo = dynamic_cast<const FilePathObject*>(ob);
QSqlQuery query;
if (fpo->getSetup())
query.bindValue(":setupid", fpo->getSetup()->getId());
query.bindValue(":lastscanned", 0); // TODO
- return query.exec();
+ int id = -1;
+ if (query.exec())
+ id = query.lastInsertId().toInt();
+ return id;
}
int DbFilePath::countDataObjectRefs(int id) const
"ORDER BY SetupName").arg(where);
}
+QString DbFilePath::constructFilterById(int id) const
+{
+ return QString("filepath.id = %1").arg(id);
+}
+
QString DbFilePath::constructSelectById(int id) const
{
- return constructSelect(QString("filepath.id = %1").arg(id));
+ return constructSelect(constructFilterById(id));
}
QSqlQueryModel* DbFilePath::getData()
public:
DbFilePath(QObject *);
virtual bool updateDataObjectToModel(const EmuFrontObject*);
- bool insertDataObjectToModel(const EmuFrontObject*);
+ int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
int countDataObjectRefs(int) const;
enum { FilePath_Id = 0,
protected:
virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
virtual QString constructSelectById(int id) const;
+ virtual QString constructFilterById(int id) const;
virtual QString constructSelect(QString whereClause = "") const;
private:
return false;
}
-bool DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
+int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
{
// TODO
- return false;
+ return -1;
}
bool DbMediaImageContainer::deleteDataObjectFromModel(QModelIndex *i)
return "";
}
+QString DbMediaImageContainer::constructFilterById(int id) const
+{
+ // TODO
+ return "";
+}
+
QString DbMediaImageContainer::constructSelectById(int id) const
{
// TODO
public:
DbMediaImageContainer(QObject *parent);
virtual bool updateDataObjectToModel(const EmuFrontObject *);
- virtual bool insertDataObjectToModel(const EmuFrontObject *);
+ virtual int insertDataObjectToModel(const EmuFrontObject *);
virtual bool deleteDataObjectFromModel(QModelIndex *);
virtual int countDataObjectRefs(int id) const;
void storeContainers(QList<MediaImageContainer*>);
protected:
virtual QString constructSelect(QString whereClause) const;
virtual QString constructSelectById(int id) const;
+ virtual QString constructFilterById(int id) const;
virtual EmuFrontObject* recordToDataObject(const QSqlRecord *);
private:
virtual QSqlQueryModel* getData();
void DbQueryModelManager::filterById(int id)
{
- return filterDataObjects(QString("setup.id = %1").arg(id));
+ filterDataObjects(constructFilterById(id));
}
/* filter must be in SQL where clause format (without the WHERE word) */
void filterDataObjects(QString filter);
void clearFilters();
virtual QString constructSelectById(int id) const = 0;
+ virtual QString constructFilterById(int id) const = 0;
virtual QString constructSelect(QString whereClause = "") const = 0;
};
return ret;
}
-bool DbSetup::insertDataObjectToModel(const EmuFrontObject *ob)
+int DbSetup::insertDataObjectToModel(const EmuFrontObject *ob)
{
qDebug() << "Inserting setup to database...";
const Setup *fpo = dynamic_cast<const Setup*>(ob);
query.bindValue(":platformid", plfId);
query.bindValue(":mediatypeid", mtId);
query.bindValue(":filetypeextensions", exts);
- bool ret = query.exec();
- if (!ret) qDebug() << query.lastError().text() << query.executedQuery();
- return ret;
+ int id = -1;
+ if (query.exec())
+ id = query.lastInsertId().toInt();
+ else
+ qDebug() << query.lastError().text() << query.executedQuery();
+ return id;
}
int DbSetup::countDataObjectRefs(int ) const
).arg(where);
}
+QString DbSetup::constructFilterById(int id) const
+{
+ return QString("setup.id = %1").arg(id);
+}
+
+
QString DbSetup::constructSelectById(int id) const
{
- return constructSelect(QString("setup.id = %1").arg(id));
+ return constructSelect(constructFilterById(id));
}
// WARNING: this will delete also all the databindings to selected media image path
public:
DbSetup(QObject *);
virtual bool updateDataObjectToModel(const EmuFrontObject*);
- bool insertDataObjectToModel(const EmuFrontObject*);
+ int insertDataObjectToModel(const EmuFrontObject*);
bool deleteDataObjectFromModel(QModelIndex*);
int countDataObjectRefs(int) const;
enum { Setup_Id = 0,
protected:
virtual EmuFrontObject* recordToDataObject(const QSqlRecord* );
virtual QString constructSelectById(int id) const;
+ virtual QString constructFilterById(int id) const;
virtual QString constructSelect(QString whereClause = "") const;
private:
{
Platform *plf = 0;
int index = platformComBox->currentIndex();
- if (index < 0) return plf;
- QSqlTableModel* platformModel = dynamic_cast<QSqlTableModel*>(platformComBox->model());
+ qDebug() << "Platform from index " << index << " selected";
+ if (index < 0)
+ return plf;
+ QSqlQueryModel* platformModel
+ = dynamic_cast<QSqlQueryModel*>(platformComBox->model());
if (!platformModel)
{
+ qDebug() << "No platform model";
return plf;
}
QSqlRecord rec = platformModel->record(index);
if (!rec.isEmpty())
{
- EmuFrontObject *o = dbPlatform->getDataObject(rec.value(DbPlatform::EmuFrontFileObject_Id).toInt());
+ qDebug() << "Trying to fetch platform with id "
+ << rec.value(DbPlatform::EmuFrontFileObject_Id).toInt() ;
+ EmuFrontObject *o
+ = dbPlatform->getDataObject(rec.value(DbPlatform::EmuFrontFileObject_Id).toInt());
plf = dynamic_cast<Platform*>(o);
}
return plf;
MediaType *mt = 0;
int index = mediaTypeComBox->currentIndex();
if (index < 0) return mt;
- QSqlTableModel* mediaTypeModel = dynamic_cast<QSqlTableModel*>(mediaTypeComBox->model());
+ QSqlQueryModel* mediaTypeModel = dynamic_cast<QSqlQueryModel*>(mediaTypeComBox->model());
if (!mediaTypeModel)
{
qDebug("Media type data model missing");