2 // Copyright 2010 Mikko Keinänen
4 // This file is part of EmuFront.
7 // EmuFront is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License version 2 as published by
9 // the Free Software Foundation and appearing in the file gpl.txt included in the
10 // packaging of this file.
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.
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/>.
23 #include <QSqlRelationalTableModel>
27 DbFile::DbFile(QObject *parent) : DbQueryModelManager(parent)
29 tableName = DbFile::DB_TABLE_NAME_FILE;
33 EmuFrontObject* DbFile::recordToDataObject(const QSqlRecord *record)
35 int id = record->value(File_Id).toInt();
36 QString name = record->value(File_Name).toString();
37 QString checksum = record->value(File_CheckSum).toString();
38 int size = record->value(File_FileSize).toInt();
39 int type = record->value(File_FileType).toInt();
40 return new EmuFrontFile(id, name, checksum, size, type);
43 bool DbFile::updateDataObjectToModel(const EmuFrontObject *ob)
45 const EmuFrontFile *plf = dynamic_cast<const EmuFrontFile*>(ob);
49 query.prepare(QString("UPDATE file SET"
52 "checksum=:checksum, "
54 "updatetime:=updatetime "
56 query.bindValue(":name", plf->getName());
57 query.bindValue(":type", plf->getType());
58 query.bindValue(":checksum", plf->getCheckSum());
59 query.bindValue(":size", plf->getSize());
60 query.bindValue(":updatetime", getCurrentTimeStamp());
62 if (ret) resetModel();
66 int DbFile::insertDataObjectToModel(const EmuFrontObject *ob)
68 const EmuFrontFile *fi = dynamic_cast<const EmuFrontFile*>(ob);
70 q.prepare("INSERT INTO file "
71 "(id, name, type, checksum, size, updatetime) "
72 "VALUES (NULL, :name, :type, :checksum, :size, :updatetime)");
73 q.bindValue(":name", fi->getName());
74 q.bindValue(":type", fi->getType());
75 q.bindValue(":checksum", fi->getCheckSum());
76 q.bindValue(":size", fi->getSize());
77 q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
80 id = q.lastInsertId().toInt();
84 /*int DbFile::insertFile(const EmuFrontFile *mi)
86 qDebug() << "Inserting file " << mi->getName() << " to db.";
88 q.prepare("INSERT INTO file "
89 "(id, name, type, checksum, size, updatetime) "
90 "VALUES (NULL, :name, :type, :checksum, :size, :updatetime)");
91 q.bindValue(":name", mi->getName());
92 q.bindValue(":type", mi->getType());
93 q.bindValue(":checksum", mi->getCheckSum());
94 q.bindValue(":size", mi->getSize());
95 q.bindValue(":updatetime", DatabaseManager::getCurrentTimeStamp());
98 id = q.lastInsertId().toInt();
103 // WARNING: this will delete also all the databindings to selected platform
104 // the delete must be confirmed in the UI
105 bool DbFile::deleteDataObjectFromModel(QModelIndex *index)
109 /*QSqlDatabase::database().transaction();*/
110 //QSqlTableModel *tmodel = dynamic_cast<QSqlTableModel*>(sqlTableModel);
111 /*QSqlRecord record = tmodel->record(index->row());
112 int id = record.value(File_Id).toInt();
113 int count = countDataObjectRefs(id);
117 if (!query.exec(QString("DELETE FROM imagecontainer WHERE platformid = %1").arg(id)))
119 qDebug() << "Deleting data bindings failed!";
120 QSqlDatabase::database().rollback();
124 //tmodel->removeRow(index->row());
125 //tmodel->submitAll();
126 //return QSqlDatabase::database().commit();
129 bool DbFile::deleteDataObject(int id) const
131 if (countDataObjectRefs(id) > 0)
135 q.prepare(QString("DELETE FROM file WHERE id=:id"));
136 q.bindValue(":id", id);
140 QString DbFile::constructSelect(QString where) const
142 /*QString where = whereClause.isEmpty()
143 ? "" : QString("WHERE ").append(whereClause);*/
145 return QString("SELECT file.id AS FileId, "
146 "file.name AS Name, "
147 "file.type AS FileType, "
148 "file.checksum AS Checksum, "
149 "file.size AS FileSize, "
150 "file.updatetime AS UpdateTime "
153 "ORDER BY Name").arg(where);
156 QString DbFile::constructFilterById(int id) const
158 return QString("file.id = %1").arg(id);
161 QString DbFile::constructSelectById(int id) const
163 return constructSelect(QString("WHERE %1").arg(constructFilterById(id)));
166 QSqlQueryModel* DbFile::getData()
168 QSqlQueryModel *model = new QSqlQueryModel(this);
169 model->setQuery(constructSelect());
170 model->setHeaderData(File_Name, Qt::Horizontal, tr("Name"));
171 model->setHeaderData(File_FileType, Qt::Horizontal, tr("Type"));
172 model->setHeaderData(File_CheckSum, Qt::Horizontal, tr("Checksum"));
173 model->setHeaderData(File_FileSize, Qt::Horizontal, tr("Size"));
174 model->setHeaderData(File_UpdateTime, Qt::Horizontal, tr("Updated"));
178 EmuFrontObject* DbFile::getFileByChecksum(QString checksum)
180 return getDataObject(QString("checksum LIKE '%1'").arg(checksum));
183 QString DbFile::getCountRefsSelect(int id) const
185 /* files are referenced from platform, mediatype, mediaimagecontainer_mediaimage and mediaimagecontainer. */
186 return QString("SELECT count(*) FROM ("
187 "SELECT file.id FROM file "
188 "INNER JOIN platform ON file.id=platform.fileid "
191 "SELECT file.id FROM file "
192 "INNER JOIN mediatype ON file.id=mediatype.fileid "
195 "SELECT file.id FROM file "
196 "INNER JOIN mediaimagecontainer_mediaimage "
197 "ON (mediaimagecontainerid=file.id OR mediaimageid=file.id) "