Cleaning up.
[emufront] / src / db / databasemanager.cpp
index ecaa155..64ed170 100644 (file)
@@ -1,24 +1,63 @@
+// EmuFront
+// Copyright 2010 Mikko Keinänen
+//
+// This file is part of EmuFront.
+//
+//
+// EmuFront is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EmuFront is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
+
 #include "databasemanager.h"
 #include <QObject>
 #include <QSqlDatabase>
 #include <QSqlTableModel>
 #include <QSqlError>
 #include <QSqlQuery>
+#include <QSqlRecord>
 #include <QFile>
 #include <QDir>
 #include <QVariant>
-#include <iostream>
+#include <QDebug>
+#include <QDateTime>
 
 const QString DatabaseManager::DB_FILENAME = QString("my.db.sqlite");
-
-//QSqlDatabase DatabaseManager::db = QSqlDatabase::addDatabase("QSQLITE");
+const QString DatabaseManager::DATABASE = QString("QSQLITE");
+const QString DatabaseManager::DB_TABLE_NAME_MEDIATYPE = QString("mediatype");
+const QString DatabaseManager::DB_TABLE_NAME_PLATFORM = QString("platform");
+const QString DatabaseManager::DB_TABLE_NAME_FILE= QString("file");
+const QString DatabaseManager::DB_TABLE_NAME_FILEPATH = QString("filepath");
+const QString DatabaseManager::DB_TABLE_NAME_SETUP = QString("setup");
+const QString DatabaseManager::DB_TABLE_MEDIAIMAGECONTAINER = QString("mediaimagecontainer");
+const QString DatabaseManager::DB_TABLE_MEDIAIMAGECONTAINER_MEDIAIMAGE = QString("mediaimagecontainer_mediaimage");
 
 DatabaseManager::DatabaseManager(QObject *parent)
        : QObject(parent)
-{}
+{
+    sqlTableModel = 0;
+}
 
 DatabaseManager::~DatabaseManager()
-{}
+{
+    // no need to explicitily destroy sqlTableModel
+    // because it is parented QObject and will
+    // be destroyed when parent is destroyed
+}
+
+QSqlQueryModel* DatabaseManager::getDataModel()
+{
+    if (!sqlTableModel) sqlTableModel = getData();
+    return sqlTableModel;
+}
 
 bool DatabaseManager::openDB()
 {
@@ -27,17 +66,6 @@ bool DatabaseManager::openDB()
     return db.open();
 }
 
-/*QSqlError DatabaseManager::lastError()
-{
-       return db.lastError();
-}*/
-
-/*bool DatabaseManager::deleteDB()
-{
-       db.close();
-       return QFile::remove(getDbPath());
-}*/
-
 QString DatabaseManager::getDbPath()
 {
        QString path;
@@ -50,84 +78,71 @@ QString DatabaseManager::getDbPath()
        return path;
 }
 
-/**
- * Check if database already exists.
- * Returns false if doesn't or we don't have a connection.
-*/ 
-bool DatabaseManager::dbExists()
+void DatabaseManager::resetModel()
 {
-       QSqlQuery query;
-    query.exec("SELECT name FROM sqlite_master WHERE name='platform'");
-    return query.next();
+    if (!sqlTableModel) return;
+    clearFilters();
 }
 
-bool DatabaseManager::createDB()
+// sql must return a count(*) value
+int DatabaseManager::countRows(QString tableName, QString columnName, int id) const
 {
-       bool ret = false;
-    /*if (db.isOpen())
-    {*/
-               QSqlQuery query;
-
-               ret = query.exec("create table platform "
-                               "(id integer primary key, "
-                               "name varchar(30), "
-                               "filename varchar(125))");
-               /*ret = query.exec("create table media "
-                                               "(id integer primary key, "
-                                               "name varchar(30), "
-                                               "filename varchar(125))");*/
-    //}
-       return ret;
+    QString sql = QString("SELECT COUNT(*) FROM %1 WHERE %2 = %3")
+        .arg(tableName).arg(columnName).arg(id);
+    int numEntries = 0;
+    QSqlQuery query(sql);
+    if (query.next())
+        numEntries = query.value(0).toInt();
+    return numEntries;
 }
 
-/*int DatabaseManager::insertPlatform(QString name, QString filename)
+EmuFrontObject* DatabaseManager::getDataObject(int id)
 {
-       int newId = -1;
-    bool ret = false;*/
-    /*if (db.isOpen())
-    {*/
-               //http://www.sqlite.org/autoinc.html
-               // NULL = is the keyword for the autoincrement to generate next value
-        /*QSqlQuery query;
-               query.prepare("insert into platform (id, name, filename) "
-                                               "values (NULL, :name, :filename)");
-               query.bindValue(":name", name);
-               query.bindValue(":filename", filename);
-        ret = query.exec();*/
-
-               /*ret = query.exec(QString("insert into person values(NULL,'%1','%2',%3)")
-                               .arg(firstname).arg(lastname).arg(age));*/
-               // Get database given autoincrement value
-        /*if (ret)
-               {
-                       // http://www.sqlite.org/c3ref/last_insert_rowid.html  
-                       QVariant var = query.lastInsertId();
-                       if (var.isValid()) newId = var.toInt();
-               }
-    //}
-       return newId;
-}*/
+    filterById(id);
+    return getFilteredDataObject();
+    /*EmuFrontObject *plf = 0;
+    if (sqlTableModel->rowCount() == 1)
+    {
+        QSqlRecord record = sqlTableModel->record(0);
+        if (record.isEmpty())
+        {
+            throw new EmuFrontException(tr("No data available for id %1").arg(id));
+        }
+        else plf = recordToDataObject(&record);
+    }
+    return plf;*/
+}
 
-/*QString DatabaseManager::getPlatform(int id)
+EmuFrontObject* DatabaseManager::getDataObject(QString filter)
 {
-       QString name;
-       QSqlQuery query(QString("select firstname, lastname from person where id = %1").arg(id));
+    qDebug() << "Filtering data object" << filter;
+    filterDataObjects(filter);
+    qDebug() << "...done filtering.";
+    return getFilteredDataObject();
+}
 
-    if (query.next())
-       {
-               name.append(query.value(0).toString());
-               name.append(query.value(1).toString());
-       }
-       return name;
+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;
 }
 
-QSqlTableModel* DatabaseManager::getPlatforms()
+EmuFrontObject* DatabaseManager::getDataObjectFromModel(QModelIndex *index)
 {
-    QSqlTableModel *model = new QSqlTableModel(this);
-    model->setTable(DB_TABLE_NAME_PLATFORM);
-    model->setSort(Platform_Name, Qt::AscendingOrder);
-    model->setHeaderData(Platform_Name, Qt::Horizontal, tr("Name"));
-    model->select();
-    return model;
-}*/
+    if (!sqlTableModel) sqlTableModel = getDataModel();
+    QSqlRecord record = sqlTableModel->record(index->row());
+    return recordToDataObject(&record);
+}
 
+int DatabaseManager::getCurrentTimeStamp() {
+    return QDateTime::currentDateTime().toTime_t();
+}