Expanded media image database functionality. Did also some refactoring
authorMikko Keinänen <mikko.keinanen@gmail.com>
Sun, 27 Jun 2010 19:38:04 +0000 (22:38 +0300)
committerMikko Keinänen <mikko.keinanen@gmail.com>
Sun, 27 Jun 2010 19:38:04 +0000 (22:38 +0300)
at the db layer.

12 files changed:
doc/uml-db_layer.dia [new file with mode: 0644]
src/db/databasemanager.cpp
src/db/databasemanager.h
src/db/dbfile.cpp
src/db/dbfile.h
src/db/dbmediaimage.cpp
src/db/dbmediaimage.h
src/db/dbmediaimagecontainer.cpp
src/db/dbquerymodelmanager.cpp
src/db/dbquerymodelmanager.h
src/db/dbtablemodelmanager.cpp
src/db/dbtablemodelmanager.h

diff --git a/doc/uml-db_layer.dia b/doc/uml-db_layer.dia
new file mode 100644 (file)
index 0000000..76be984
Binary files /dev/null and b/doc/uml-db_layer.dia differ
index a4c43f3..ae612b4 100644 (file)
@@ -28,6 +28,7 @@
 #include <QDir>
 #include <QVariant>
 #include <QDebug>
+#include <QDateTime>
 
 const QString DatabaseManager::DB_FILENAME = QString("my.db.sqlite");
 const QString DatabaseManager::DATABASE = QString("QSQLITE");
@@ -98,7 +99,8 @@ int DatabaseManager::countRows(QString tableName, QString columnName, int id) co
 EmuFrontObject* DatabaseManager::getDataObject(int id)
 {
     filterById(id);
-    EmuFrontObject *plf = 0;
+    return getFilteredDataObject();
+    /*EmuFrontObject *plf = 0;
     if (sqlTableModel->rowCount() == 1)
     {
         QSqlRecord record = sqlTableModel->record(0);
@@ -108,7 +110,28 @@ EmuFrontObject* DatabaseManager::getDataObject(int id)
         }
         else plf = recordToDataObject(&record);
     }
-    return plf;
+    return plf;*/
+}
+
+EmuFrontObject* DatabaseManager::getDataObject(QString filter)
+{
+    filterDataObjects(filter);
+    return getFilteredDataObject();
+}
+
+EmuFrontObject* DatabaseManager::getFilteredDataObject()
+{
+    EmuFrontObject *plf = 0;
+    if (sqlTableModel->rowCount() == 1)
+    {
+        QSqlRecord record = sqlTableModel->record(0);
+        if (record.isEmpty())
+        {
+            throw new EmuFrontException(tr("No filtered data available"));
+        }
+        else plf = recordToDataObject(&record);
+    }
+     return plf;
 }
 
 EmuFrontObject* DatabaseManager::getDataObjectFromModel(QModelIndex *index)
@@ -117,3 +140,7 @@ EmuFrontObject* DatabaseManager::getDataObjectFromModel(QModelIndex *index)
     QSqlRecord record = sqlTableModel->record(index->row());
     return recordToDataObject(&record);
 }
+
+int DatabaseManager::getCurrentTimeStamp() {
+    return QDateTime::currentDateTime().toTime_t();
+}
index 94fa4fd..77ac619 100644 (file)
@@ -39,10 +39,12 @@ public:
     QSqlQueryModel* getDataModel();
     EmuFrontObject* getDataObjectFromModel(QModelIndex*);
     EmuFrontObject* getDataObject(int id);
+    EmuFrontObject* getDataObject(QString filter);
     virtual bool updateDataObjectToModel(const EmuFrontObject*) = 0;
     virtual bool insertDataObjectToModel(const EmuFrontObject*) = 0;
     virtual bool deleteDataObjectFromModel(QModelIndex*) = 0;
     virtual int countDataObjectRefs(int id) const = 0;
+    static int getCurrentTimeStamp();
     static bool openDB();
     void resetModel();
     enum {
@@ -55,6 +57,7 @@ protected:
     QSqlQueryModel* sqlTableModel;
     virtual EmuFrontObject* recordToDataObject(const QSqlRecord* ) = 0;
     virtual void filterById(int id) = 0;
+    virtual void filterDataObjects(QString filter) = 0;
     virtual void clearFilters() = 0;
     int countRows(QString tableName, QString columnName, int id) const;
     static const QString DB_TABLE_NAME_FILE;
@@ -71,6 +74,8 @@ private:
     static const QString DATABASE;
     virtual QSqlQueryModel* getData() = 0;
     static QString getDbPath();
+    EmuFrontObject* getFilteredDataObject();
+
 };
 
 #endif
index 57bfb9f..d462e82 100644 (file)
 #include <QSqlRecord>
 #include <QSqlQuery>
 #include <QSqlTableModel>
-#include <QDateTime>
 #include "dbfile.h"
 
 DbFile::DbFile(QObject *parent) : DbTableModelManager(parent)
-{ }
+{
+    type = -1;
+}
 
 EmuFrontObject* DbFile::recordToDataObject(const QSqlRecord *record)
 {
@@ -50,7 +51,7 @@ bool DbFile::updateDataObjectToModel(const EmuFrontObject *ob)
         record.setValue("type", plf->getType());
         record.setValue("checksum", plf->getCheckSum());
         record.setValue("size", plf->getSize());
-        record.setValue("updatetime", QDateTime::currentDateTime().toTime_t());
+        record.setValue("updatetime", getCurrentTimeStamp());
         tmodel->setRecord(0, record);
         ret = tmodel->submitAll();
     }
@@ -71,11 +72,28 @@ bool DbFile::insertDataObjectToModel(const EmuFrontObject *ob)
     tmodel->setData(sqlTableModel->index(row, File_FileType), plf->getType());
     tmodel->setData(sqlTableModel->index(row, File_CheckSum), plf->getCheckSum());
     tmodel->setData(sqlTableModel->index(row, File_FileSize), plf->getSize());
-    tmodel->setData(sqlTableModel->index(row, File_UpdateTime),
-        QDateTime::currentDateTime().toTime_t());
+    tmodel->setData(sqlTableModel->index(row, File_UpdateTime), getCurrentTimeStamp());
     return tmodel->submitAll();
 }
 
+int DbFile::insertFile(const EmuFrontFile *mi)
+{
+    QSqlQuery q;
+    q.prepare("INSERT INTO file "
+        "(id, name, type, checksum, size, updatetime) "
+        "VALUES (NULL, :name, :type, :checksum, :size, :updatetime)");
+    q.bindValue(":name", mi->getName());
+    q.bindValue(":type", mi->getType());
+    q.bindValue(":checksum", mi->getCheckSum());
+    q.bindValue(":size", mi->getSize());
+    q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
+    int id = -1;
+    if (q.exec())
+        id = q.lastInsertId().toInt();
+   return id;
+
+}
+
 int DbFile::countDataObjectRefs(int id) const
 {
     return 0; // TODO
@@ -116,6 +134,12 @@ QSqlQueryModel* DbFile::getData()
     model->setHeaderData(File_CheckSum, Qt::Horizontal, tr("Checksum"));
     model->setHeaderData(File_FileSize, Qt::Horizontal, tr("Size"));
     model->setHeaderData(File_UpdateTime, Qt::Horizontal, tr("Updated"));
+    if (type >= 0) model->setFilter(QString("type=%1").arg(type));
     model->select();
     return model;
 }
+
+EmuFrontObject* DbFile::getFileByChecksum(QString checksum)
+{
+    return getDataObject(QString("checksum LIKE '%1'").arg(checksum));
+}
index 2ec902e..488e7b1 100644 (file)
@@ -31,6 +31,9 @@ public:
     bool insertDataObjectToModel(const EmuFrontObject*);
     bool deleteDataObjectFromModel(QModelIndex*);
     int countDataObjectRefs(int) const;
+    EmuFrontObject* getFileByChecksum(QString checksum);
+    int insertFile(const EmuFrontFile *);
+
     enum {
         File_Id = 0,
         File_Name,
@@ -41,6 +44,7 @@ public:
 
 protected:
     virtual EmuFrontObject* recordToDataObject(const QSqlRecord*);
+    int type;
 
 private:
     virtual QSqlQueryModel* getData();
index b050b42..1741980 100644 (file)
 // along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <QDebug>
+#include <QSqlTableModel>
+#include <QSqlQuery>
 #include "dbmediaimage.h"
 
 DbMediaImage::DbMediaImage(QObject *parent)
-    : DbQueryModelManager(parent)
-{ }
+    : DbFile(parent)
+{
+    type = EmuFrontFile::FileType_MediaImage;
+}
 
-bool DbMediaImage::updateDataObjectToModel(const EmuFrontObject *efo)
+/*bool DbMediaImage::updateDataObjectToModel(const EmuFrontObject *efo)
 {
+    // TODO
     return false;
-}
+}*/
 
-bool DbMediaImage::insertDataObjectToModel(const EmuFrontObject *efo)
+/*bool DbMediaImage::insertDataObjectToModel(const EmuFrontObject *efo)
 {
+    // TODO
     return false;
-}
+}*/
 
-bool DbMediaImage::deleteDataObjectFromModel(QModelIndex *i)
+/*bool DbMediaImage::deleteDataObjectFromModel(QModelIndex *i)
 {
+    // TODO
     return false;
-}
+}*/
 
-int DbMediaImage::countDataObjectRefs(int id) const
+/*int DbMediaImage::countDataObjectRefs(int id) const
 {
+    // TODO
     return -1;
-}
+}*/
 
-QString DbMediaImage::constructSelect(QString whereClause) const
+/*QString DbMediaImage::constructSelect(QString whereClause) const
 {
+    // TODO
     return "";
 }
 
 QString DbMediaImage::constructSelectById(int id) const
 {
+    // TODO
     return "";
-}
+}*/
 
-EmuFrontObject* DbMediaImage::recordToDataObject(const QSqlRecord *)
+/*EmuFrontObject* DbMediaImage::recordToDataObject(const QSqlRecord *)
 {
+    // TODO
     return 0;
-}
+}*/
 
-QSqlQueryModel* DbMediaImage::getData()
+/*QSqlQueryModel* DbMediaImage::getData()
 {
-    return 0;
-}
+    QSqlTableModel *model = new QSqlTableModel;
+    model->setTable(DB_TABLE_NAME_FILE);
+}*/
 
-int DbMediaImage::getMediaImage(QString checksum) const
-{
-    return -1;
 
-}
 
 int DbMediaImage::insertMediaImage(const MediaImage *mi)
 {
-    return -1;
+    return DbFile::insertFile(mi);
 }
 
 QList<int> DbMediaImage::storeMediaImages(QList<MediaImage *> images)
@@ -81,27 +89,22 @@ QList<int> DbMediaImage::storeMediaImages(QList<MediaImage *> images)
     foreach(MediaImage* mi, images)
     {
         QString cksum = mi->getCheckSum();
-        int id = getMediaImage(cksum);
+        EmuFrontObject *o = getFileByChecksum(cksum);
+        int id = o ? o->getId() : -1;
         if (id >= 0)
         {
             // this media image is already in the database
             // TODO: what if the name differs?
-            ids.append(id);
-            continue;
         }
-        if (id < 0)
+        else if (id < 0)
         {
-            // insert new media image to db
             id = insertMediaImage(mi);
             if (id < 0)
             {
                 // TODO: Build an error message of failed inserts
                 qDebug() << "Failed inserting media image" << mi->getName();
             }
-            else
-            {
-                ids.append(id);
-            }
         }
+        ids.append(id);
     }
 }
index b77e942..77032b7 100644 (file)
 #ifndef DBMEDIAIMAGE_H
 #define DBMEDIAIMAGE_H
 
-#include "dbquerymodelmanager.h"
+#include "dbfile.h"
 #include "../dataobjects/mediaimage.h"
 
-class DbMediaImage : public DbQueryModelManager
+class DbMediaImage : public DbFile
 {
 public:
     DbMediaImage(QObject *parent);
     QList<int> storeMediaImages(QList<MediaImage*>);
-    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;
+    //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 *);
+    //virtual QString constructSelect(QString whereClause) const;
+    //virtual QString constructSelectById(int id) const;
+    //virtual EmuFrontObject* recordToDataObject(const QSqlRecord *);
 private:
-    virtual QSqlQueryModel* getData();
+    //virtual QSqlQueryModel* getData();
 };
 
 #endif // DBMEDIAIMAGE_H
index aaea4f0..a0a4569 100644 (file)
@@ -27,46 +27,55 @@ DbMediaImageContainer::DbMediaImageContainer(QObject *parent)
 
 bool DbMediaImageContainer::updateDataObjectToModel(const EmuFrontObject *efo)
 {
+    // TODO
     return false;
 }
 
 bool DbMediaImageContainer::insertDataObjectToModel(const EmuFrontObject *efo)
 {
+    // TODO
     return false;
 }
 
 bool DbMediaImageContainer::deleteDataObjectFromModel(QModelIndex *i)
 {
+    // TODO
     return false;
 }
 
 int DbMediaImageContainer::countDataObjectRefs(int id) const
 {
+    // TODO
     return -1;
 }
 
 QString DbMediaImageContainer::constructSelect(QString whereClause) const
 {
+    // TODO
     return "";
 }
 
 QString DbMediaImageContainer::constructSelectById(int id) const
 {
+    // TODO
     return "";
 }
 
 EmuFrontObject* DbMediaImageContainer::recordToDataObject(const QSqlRecord *)
 {
+    // TODO
     return 0;
 }
 
 QSqlQueryModel* DbMediaImageContainer::getData()
 {
+    // TODO
     return 0;
 }
 
 int DbMediaImageContainer::getMediaImageContainer(QString checksum) const
 {
+    // TODO
     return -1;
 }
 
index 7ba62f4..1fb7b75 100644 (file)
@@ -20,7 +20,6 @@
 #include <QSqlQueryModel>
 #include "dbquerymodelmanager.h"
 
-
 DbQueryModelManager::DbQueryModelManager(QObject *parent)
     : DatabaseManager(parent)
 {
@@ -28,8 +27,14 @@ DbQueryModelManager::DbQueryModelManager(QObject *parent)
 
 void DbQueryModelManager::filterById(int id)
 {
-    if (!sqlTableModel) sqlTableModel = getDataModel();
-    QString query = constructSelectById(id);
+    return filterDataObjects(QString("setup.id = %1").arg(id));
+}
+
+/* filter must be in SQL where clause format (without the WHERE word) */
+void DbQueryModelManager::filterDataObjects(QString filter)
+{
+   if (!sqlTableModel) sqlTableModel = getDataModel();
+    QString query = constructSelect(filter);
     sqlTableModel->setQuery(query);
 }
 
index f1b37f8..281697c 100644 (file)
@@ -28,6 +28,7 @@ public:
     DbQueryModelManager(QObject *parent);
 protected:
     void filterById(int id);
+    void filterDataObjects(QString filter);
     void clearFilters();
     virtual QString constructSelectById(int id) const = 0;
     virtual QString constructSelect(QString whereClause = "") const = 0;
index c34f14a..a34f9fb 100644 (file)
@@ -27,9 +27,14 @@ DbTableModelManager::DbTableModelManager(QObject *parent)
 
 void DbTableModelManager::filterById(int id)
 {
+    return filterDataObjects(QString("id = %1").arg(id));
+}
+
+void DbTableModelManager::filterDataObjects(QString filter)
+{
     if (!sqlTableModel) sqlTableModel = getDataModel(); // throw EmuFrontException("Data model not available!");
     QSqlTableModel *tmodel = dynamic_cast<QSqlTableModel*>(sqlTableModel);
-    tmodel->setFilter(QString("id = %1").arg(id));
+    tmodel->setFilter(filter);
     tmodel->select();
 }
 
index 236c110..337e067 100644 (file)
@@ -28,6 +28,7 @@ public:
     DbTableModelManager(QObject *parent);
 protected:
     void filterById(int id);
+    void filterDataObjects(QString filter);
     void clearFilters();
 };