Refactoring the project, new folders for view and model classes. Added
[emufront] / src / db / dbcreator.cpp
index 936601d..a3cf2b3 100644 (file)
 // along with EmuFront.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <QObject>
+#include <QDir>
 #include <QSqlDatabase>
 #include <QSqlQuery>
+#include <QSqlRecord>
+#include <QSqlTableModel>
 #include <QSqlError>
 #include <QDebug>
 #include <exception>
 #include "dbcreator.h"
+#include "emufrontexception.h"
 
 using namespace std;
 
-const int DbCreator::TABLES_COUNT = 3;
-const QString DbCreator::TABLES[] = {"platform", "mediatype", "filepath", "mediaimagecontainer", "mediaimage", "mediaimagecontainer_mediaimage"};
+const int DbCreator::DB_VERSION = 1;
+//const int DbCreator::TABLES_COUNT = 3;
+//const QString DbCreator::TABLES[] = {"platform", "mediatype", "filepath", "mediaimagecontainer_filepath", "mediaimage", "mediaimagecontainer_mediaimage"};
 
 DbCreator::DbCreator(QObject *parent) : QObject(parent)
 {
@@ -42,25 +47,60 @@ bool DbCreator::createDB()
 
     try
     {
-        query.exec("DROP TABLE IF EXISTS mediaimagecontainer_file");
-        query.exec("DROP TABLE IF EXISTS mediaimagecontainer");
+
+        /*
+
+            N O T I C E
+            -----------
+
+            When adding a new table, remember to add a drop table
+            clause also!
+
+            When changing the database structure, increase
+            also the version number and create a sql command
+            for updating from last version to new version.
+
+            Update those version upgrade "patches" here as a version history:
+            -----------------------------------------------------------------
+
+        */
+
+        query.exec("DROP TABLE IF EXISTS mediaimagecontainer_mediaimage");
+        query.exec("DROP TABLE IF EXISTS mediaimagecontainer_filepath");
         query.exec("DROP TABLE IF EXISTS filepath");
         query.exec("DROP TABLE IF EXISTS setup");
         query.exec("DROP TABLE IF EXISTS mediatype");
         query.exec("DROP TABLE IF EXISTS platform");
-        query.exec("DROP TABLE IF EXISTS file");
+        query.exec("DROP TABLE IF EXISTS file") ;
         query.exec("DROP TABLE IF EXISTS executable");
+        query.exec("DROP TABLE IF EXISTS config");
 
         qDebug() << "Creating TABLE file";
 
+        ret = query.exec("CREATE TABLE IF NOT EXISTS config"
+                "(tmpdirpath TEXT, "
+                "dbversion INTEGER)"
+            );
+
+        if (ret) {
+            query.prepare("INSERT INTO config "
+                "(tmpdirpath, dbversion) "
+                "VALUES (:tmpdir, :dbversion)");
+            query.bindValue(":tmpdir", QDir::homePath());
+            query.bindValue(":dbversion", DbCreator::DB_VERSION);
+            ret = query.exec();
+        }
+
+        if (!ret) throw QString("tbl config");
+
         ret = query.exec("CREATE TABLE IF NOT EXISTS file"
                         "(id INTEGER PRIMARY KEY, "
-                        "name TEXT, "   // TODO: optional here! -> mediaimagecontainer has filepath spesific name and media image has mediaimagecontainer specific name
-                                        // so no name here for those file types
+                        "name TEXT, "
                         "type INTEGER, "
                         "checksum TEXT, "
                         "size INTEGER, "
-                        "updatetime NUMERIC)");
+                        "updatetime NUMERIC, "
+                        "extname TEXT)");
 
         if (!ret) throw QString("tbl file");
 
@@ -116,24 +156,21 @@ bool DbCreator::createDB()
 
         if (!ret) throw QString("tbl filepath");
 
-        qDebug() << "Creating TABLE mediaimagecontainer";
+        qDebug() << "Creating TABLE mediaimagecontainer_filepath";
 
         ret = query.exec("CREATE TABLE IF NOT EXISTS mediaimagecontainer_filepath "
                         "(fileid INTEGER REFERENCES file(id), "
                         "filepathid INTEGER REFERENCES filepath(id), "
-                        "mediaimagecontainername TEXT, " // filepath specific name for media image container
                         "updatetime NUMERIC)");
 
-        if (!ret) throw QString("tbl mediaimagecontainer");
+        if (!ret) throw QString("tbl mediaimagecontainer_filepath");
 
 
         qDebug() << "Creating TABLE mediaimagecontainer_mediaimage";
 
         ret = query.exec("CREATE TABLE IF NOT EXISTS mediaimagecontainer_mediaimage "
                         "(mediaimagecontainerid INTEGER REFERENCES file(id), "
-                        "mediaimageid INTEGER REFERENCES file(id), "
-                        "mediaimagename TEXT " // mediaimagecontainer specific name for media image
-                        ")");
+                        "mediaimageid INTEGER REFERENCES file(id))");
 
         if (!ret) throw QString("tbl mediaimagecontainer_mediaimage");
 
@@ -172,7 +209,7 @@ bool DbCreator::createDB()
             "CREATE TRIGGER IF NOT EXISTS trg_onfilepathdelete "
             "AFTER DELETE ON filepath "
             "BEGIN "
-            "   DELETE FROM mediaimagecontainer WHERE mediaimagecontainer.filepathid=old.id; "
+            "   DELETE FROM mediaimagecontainer_filepath WHERE mediaimagecontainer_filepath.filepathid=old.id; "
             "END;"
         );
 
@@ -180,7 +217,7 @@ bool DbCreator::createDB()
 
         query.exec(
             "CREATE TRIGGER IF NOT EXISTS trg_onmediaimagecontainerdelete "
-            "AFTER DELETE ON mediaimagecontainer "
+            "AFTER DELETE ON mediaimagecontainer_filepath "
             "BEGIN "
             "   DELETE FROM mediaimagecontainer_mediaimage WHERE mediaimagecontainer_mediaimage.mediaimagecontainerid=old.fileid;"
             "END;"
@@ -202,18 +239,31 @@ bool DbCreator::createDB()
     catch (QString tbl)
     {
         QString err = query.lastError().text();
-        throw QString("Couldn't CREATE '%1'!").arg(tbl).append(err);
+        throw EmuFrontException(QString("Couldn't CREATE '%1'!").arg(tbl).append(err));
     }
     return ret;
 }
 
 /**
  * Check if database already exists.
- * Returns false if doesn't or we don't have a connection.
+ *
+ * Returns  0 if database doesn't exist
+ *          or database version number 1 if database exists
+ *
 */
-bool DbCreator::dbExists()
+int DbCreator::dbExists()
 {
-    for (int i = 0; i < TABLES_COUNT; ++i)
+    int ret = 0;
+    QString sql("SELECT dbversion FROM config");
+    QSqlQuery q;
+    q.exec(sql);
+    if (q.next()) {
+        ret = q.value(0).toInt();
+        qDebug() << "Database version is " << ret
+            << " the application requires " << DB_VERSION;
+    }
+    return ret;
+    /*for (int i = 0; i < TABLES_COUNT; ++i)
     {
         if (!tableExists(TABLES[i]))
         {
@@ -222,7 +272,7 @@ bool DbCreator::dbExists()
         }
        qDebug() << "Table " << TABLES[i] << " exists.";
     }
-    return true;
+    return true;*/
 }
 
 bool DbCreator::tableExists(QString TABLE)