Tracking down error with storing media image files to database.
[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 // EmuFront 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 EmuFront.  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 #include <QDebug>
31 #include <QDateTime>
32
33 const QString DatabaseManager::DB_FILENAME = QString("my.db.sqlite");
34 const QString DatabaseManager::DATABASE = QString("QSQLITE");
35 const QString DatabaseManager::DB_TABLE_NAME_MEDIATYPE = QString("mediatype");
36 const QString DatabaseManager::DB_TABLE_NAME_PLATFORM = QString("platform");
37 const QString DatabaseManager::DB_TABLE_NAME_FILE= QString("file");
38 const QString DatabaseManager::DB_TABLE_NAME_FILEPATH = QString("filepath");
39 const QString DatabaseManager::DB_TABLE_NAME_SETUP = QString("setup");
40 const QString DatabaseManager::DB_TABLE_MEDIAIMAGECONTAINER = QString("mediaimagecontainer");
41 const QString DatabaseManager::DB_TABLE_MEDIAIMAGECONTAINER_MEDIAIMAGE = QString("mediaimagecontainer_mediaimage");
42
43 DatabaseManager::DatabaseManager(QObject *parent)
44         : QObject(parent)
45 {
46     sqlTableModel = 0;
47 }
48
49 DatabaseManager::~DatabaseManager()
50 {
51     // no need to explicitily destroy sqlTableModel
52     // because it is parented QObject and will
53     // be destroyed when parent is destroyed
54 }
55
56 QSqlQueryModel* DatabaseManager::getDataModel()
57 {
58     if (!sqlTableModel) sqlTableModel = getData();
59     return sqlTableModel;
60 }
61
62 bool DatabaseManager::openDB()
63 {
64     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
65     db.setDatabaseName(DatabaseManager::getDbPath());
66     return db.open();
67 }
68
69 QString DatabaseManager::getDbPath()
70 {
71         QString path;
72 #ifdef Q_OS_LINUX
73         path.append(QDir::home().path());
74         path.append(QDir::separator()).append(DB_FILENAME);
75 #else
76         path.append(DB_FILENAME);       
77 #endif
78         return path;
79 }
80
81 void DatabaseManager::resetModel()
82 {
83     if (!sqlTableModel) return;
84     clearFilters();
85 }
86
87 // sql must return a count(*) value
88 int DatabaseManager::countRows(QString tableName, QString columnName, int id) const
89 {
90     QString sql = QString("SELECT COUNT(*) FROM %1 WHERE %2 = %3")
91         .arg(tableName).arg(columnName).arg(id);
92     int numEntries = 0;
93     QSqlQuery query(sql);
94     if (query.next())
95         numEntries = query.value(0).toInt();
96     return numEntries;
97 }
98
99 EmuFrontObject* DatabaseManager::getDataObject(int id)
100 {
101     filterById(id);
102     return getFilteredDataObject();
103     /*EmuFrontObject *plf = 0;
104     if (sqlTableModel->rowCount() == 1)
105     {
106         QSqlRecord record = sqlTableModel->record(0);
107         if (record.isEmpty())
108         {
109             throw new EmuFrontException(tr("No data available for id %1").arg(id));
110         }
111         else plf = recordToDataObject(&record);
112     }
113     return plf;*/
114 }
115
116 EmuFrontObject* DatabaseManager::getDataObject(QString filter)
117 {
118     qDebug() << "Filtering data object" << filter;
119     filterDataObjects(filter);
120     qDebug() << "...done filtering.";
121     return getFilteredDataObject();
122 }
123
124 EmuFrontObject* DatabaseManager::getFilteredDataObject()
125 {
126     EmuFrontObject *plf = 0;
127     if (sqlTableModel->rowCount() == 1)
128     {
129         QSqlRecord record = sqlTableModel->record(0);
130         if (record.isEmpty())
131         {
132             throw new EmuFrontException(tr("No filtered data available"));
133         }
134         else plf = recordToDataObject(&record);
135     }
136      return plf;
137 }
138
139 EmuFrontObject* DatabaseManager::getDataObjectFromModel(QModelIndex *index)
140 {
141     if (!sqlTableModel) sqlTableModel = getDataModel();
142     QSqlRecord record = sqlTableModel->record(index->row());
143     return recordToDataObject(&record);
144 }
145
146 int DatabaseManager::getCurrentTimeStamp() {
147     return QDateTime::currentDateTime().toTime_t();
148 }