Initial implementation of setup editor. Some refactoring and bug hunting
[emufront] / src / db / databasemanager.cpp
1 // EmuFront
2 // Copyright 2010 Mikko Keinänen
3 //
4 // This file is part of EmuFront.
5 //
6 //
7 // EmuFront is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // Foobar is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
19
20 #include "databasemanager.h"
21 #include <QObject>
22 #include <QSqlDatabase>
23 #include <QSqlTableModel>
24 #include <QSqlError>
25 #include <QSqlQuery>
26 #include <QSqlRecord>
27 #include <QFile>
28 #include <QDir>
29 #include <QVariant>
30
31 const QString DatabaseManager::DB_FILENAME = QString("my.db.sqlite");
32 const QString DatabaseManager::DATABASE = QString("QSQLITE");
33 const QString DatabaseManager::DB_TABLE_NAME_MEDIATYPE = QString("mediatype");
34 const QString DatabaseManager::DB_TABLE_NAME_PLATFORM = QString("platform");
35 const QString DatabaseManager::DB_TABLE_NAME_FILEPATH = QString("filepath");
36 const QString DatabaseManager::DB_TABLE_NAME_SETUP = QString("setup");
37
38 DatabaseManager::DatabaseManager(QObject *parent)
39         : QObject(parent)
40 {}
41
42 DatabaseManager::~DatabaseManager()
43 {
44     // no need to explicitily destroy sqlTableModel
45     // because it is parented QObject and will
46     // be destroyed when parent is destroyed
47 }
48
49 QSqlQueryModel* DatabaseManager::getDataModel()
50 {
51     if (!sqlTableModel) sqlTableModel = getData();
52     return sqlTableModel;
53 }
54
55 bool DatabaseManager::openDB()
56 {
57     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
58     db.setDatabaseName(DatabaseManager::getDbPath());
59     return db.open();
60 }
61
62 QString DatabaseManager::getDbPath()
63 {
64         QString path;
65 #ifdef Q_OS_LINUX
66         path.append(QDir::home().path());
67         path.append(QDir::separator()).append(DB_FILENAME);
68 #else
69         path.append(DB_FILENAME);       
70 #endif
71         return path;
72 }
73
74 void DatabaseManager::resetModel()
75 {
76     if (!sqlTableModel) return;
77     clearFilters();
78 }
79
80 // sql must return a count(*) value
81 int DatabaseManager::countRows(QString tableName, QString columnName, int id) const
82 {
83     QString sql = QString("SELECT COUNT(*) FROM %1 WHERE %2 = %3")
84         .arg(tableName).arg(columnName).arg(id);
85     int numEntries = 0;
86     QSqlQuery query(sql);
87     if (query.next())
88         numEntries = query.value(0).toInt();
89     return numEntries;
90 }
91
92 EmuFrontObject* DatabaseManager::getDataObject(int id)
93 {
94     filterById(id);
95     EmuFrontObject *plf = 0;
96     if (sqlTableModel->rowCount() == 1)
97     {
98         QSqlRecord record = sqlTableModel->record(0);
99         plf = recordToDataObject(&record);
100     }
101     return plf;
102 }
103
104 EmuFrontObject* DatabaseManager::getDataObjectFromModel(QModelIndex *index)
105 {
106     QSqlRecord record = sqlTableModel->record(index->row());
107     return recordToDataObject(&record);
108 }