DbEmuFrontFileObject is now a DbQueryModelManager instead of
authorMikko Keinänen <mikko.keinanen@gmail.com>
Thu, 23 Sep 2010 21:15:22 +0000 (00:15 +0300)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Thu, 23 Sep 2010 21:15:22 +0000 (00:15 +0300)
DbTableModelManager.

15 files changed:
doc/uml-db_layer.dia
src/db/databasemanager.h
src/db/dbemufrontfileobject.cpp
src/db/dbemufrontfileobject.h
src/db/dbfile.cpp
src/db/dbfile.h
src/db/dbfilepath.cpp
src/db/dbfilepath.h
src/db/dbmediaimagecontainer.cpp
src/db/dbmediaimagecontainer.h
src/db/dbquerymodelmanager.cpp
src/db/dbquerymodelmanager.h
src/db/dbsetup.cpp
src/db/dbsetup.h
src/dialogs/setupeditdialog.cpp

index a37397d..4479ecc 100644 (file)
Binary files a/doc/uml-db_layer.dia and b/doc/uml-db_layer.dia differ
index 77ac619..7dd2855 100644 (file)
@@ -41,7 +41,7 @@ public:
     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();
index a36cc00..48e3ea2 100644 (file)
 
 #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);
 }
@@ -48,6 +49,18 @@ bool DbEmuFrontFileObject::updateDataObjectToModel(const EmuFrontObject *ob)
 {
     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();
@@ -60,15 +73,34 @@ bool DbEmuFrontFileObject::updateDataObjectToModel(const EmuFrontObject *ob)
         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);
@@ -78,7 +110,10 @@ bool DbEmuFrontFileObject::insertDataObjectToModel(const EmuFrontObject *ob)
     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
@@ -90,8 +125,9 @@ 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;
@@ -106,14 +142,44 @@ bool DbEmuFrontFileObject::deleteDataObjectFromModel(QModelIndex *index)
             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:
@@ -121,6 +187,16 @@ QSqlQueryModel* DbEmuFrontFileObject::getData()
     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;
 }
index 8e3109c..e9535d4 100644 (file)
 #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:
index b0079f6..451c024 100644 (file)
@@ -77,7 +77,7 @@ bool DbFile::updateDataObjectToModel(const EmuFrontObject *ob)
     return ret;
 }
 
-bool DbFile::insertDataObjectToModel(const EmuFrontObject *ob)
+int DbFile::insertDataObjectToModel(const EmuFrontObject *ob)
 {
     const EmuFrontFile *fi = dynamic_cast<const EmuFrontFile*>(ob);
     QSqlQuery q;
@@ -175,9 +175,14 @@ QString DbFile::constructSelect(QString whereClause) const
                    "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()
index 20eb5b1..2ce3172 100644 (file)
@@ -28,7 +28,7 @@ class DbFile : public DbQueryModelManager
 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);
@@ -45,6 +45,7 @@ public:
 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;
 
index 021b121..a86da93 100644 (file)
@@ -61,7 +61,7 @@ bool DbFilePath::updateDataObjectToModel(const EmuFrontObject *ob)
     return ret;
 }
 
-bool DbFilePath::insertDataObjectToModel(const EmuFrontObject *ob)
+int DbFilePath::insertDataObjectToModel(const EmuFrontObject *ob)
 {
     const FilePathObject *fpo = dynamic_cast<const FilePathObject*>(ob);
     QSqlQuery query;
@@ -72,7 +72,10 @@ bool DbFilePath::insertDataObjectToModel(const EmuFrontObject *ob)
     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
@@ -104,9 +107,14 @@ QString DbFilePath::constructSelect(QString whereClause) 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()
index 71369c0..50d0cae 100644 (file)
@@ -29,7 +29,7 @@ class DbFilePath : public DbQueryModelManager
 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,
@@ -41,6 +41,7 @@ public:
 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:
index 949f233..84d2aba 100644 (file)
@@ -32,10 +32,10 @@ bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
     return false;
 }
 
-bool DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
+int DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
 {
     // TODO
-    return false;
+    return -1;
 }
 
 bool DbMediaImageContainer::deleteDataObjectFromModel(QModelIndex *i)
@@ -56,6 +56,12 @@ QString DbMediaImageContainer::constructSelect(QString whereClause) const
     return "";
 }
 
+QString DbMediaImageContainer::constructFilterById(int id) const
+{
+    // TODO
+    return "";
+}
+
 QString DbMediaImageContainer::constructSelectById(int id) const
 {
     // TODO
index 9ffef65..0387ffa 100644 (file)
@@ -29,7 +29,7 @@ class DbMediaImageContainer : public DbQueryModelManager
 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*>);
@@ -37,6 +37,7 @@ public:
 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();
index 1fb7b75..3f1c101 100644 (file)
@@ -27,7 +27,7 @@ DbQueryModelManager::DbQueryModelManager(QObject *parent)
 
 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) */
index 281697c..5fe95f4 100644 (file)
@@ -31,6 +31,7 @@ protected:
     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;
 };
 
index 87c475b..a8e7e75 100644 (file)
@@ -69,7 +69,7 @@ bool DbSetup::updateDataObjectToModel(const EmuFrontObject *ob)
     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);
@@ -83,9 +83,12 @@ bool DbSetup::insertDataObjectToModel(const EmuFrontObject *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
@@ -110,9 +113,15 @@ QString DbSetup::constructSelect(QString whereClause) 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
index 7bc89cb..b0c558e 100644 (file)
@@ -30,7 +30,7 @@ class DbSetup : public DbQueryModelManager
 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,
@@ -43,6 +43,7 @@ public:
 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:
index e074ca9..4508a28 100644 (file)
@@ -154,16 +154,23 @@ Platform* SetupEditDialog::getSelectedPlatform() const
 {
     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;
@@ -174,7 +181,7 @@ MediaType* SetupEditDialog::getSelectedMediaType() const
     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");