MythTV master
rominfo.cpp
Go to the documentation of this file.
1// Qt
2#include <QFile>
3
4// MythTV
7
8// MythGame
9#include "romedit.h"
10#include "rominfo.h"
11
12#define LOC_ERR QString("MythGame:ROMINFO Error: ")
13#define LOC QString("MythGame:ROMINFO: ")
14
15bool operator==(const RomInfo& a, const RomInfo& b)
16{
17 return a.Romname() == b.Romname();
18}
19
21{
23
24 bool inserting = false;
25
26 if (m_id == 0)
27 inserting = true;
28
29 if (inserting)
30 {
31 LOG(VB_GENERAL, LOG_INFO, LOC + QString("Adding %1 - %2")
32 .arg(Rompath(), Romname()));
33
34 query.prepare("INSERT INTO gamemetadata "
35 "(`system`, romname, gamename, genre, year, gametype, "
36 "rompath, country, crc_value, diskcount, display, plot, "
37 "publisher, version, fanart, boxart, screenshot) "
38 "VALUES (:SYSTEM, :ROMNAME, :GAMENAME, :GENRE, :YEAR, "
39 ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PLOT, "
40 ":PUBLISHER, :VERSION, :FANART, :BOXART, :SCREENSHOT)");
41
42 query.bindValue(":SYSTEM",System());
43 query.bindValue(":ROMNAME",Romname());
44 query.bindValue(":GAMENAME",Gamename());
45 query.bindValue(":GENRE",Genre());
46 query.bindValue(":YEAR",Year());
47 query.bindValue(":GAMETYPE",GameType());
48 query.bindValue(":ROMPATH",Rompath());
49 query.bindValue(":COUNTRY",Country());
50 query.bindValue(":CRC32", QString());
51 query.bindValue(":PLOT", Plot());
52 query.bindValue(":PUBLISHER", Publisher());
53 query.bindValue(":VERSION", Version());
54 query.bindValue(":FANART", Fanart());
55 query.bindValue(":BOXART", Boxart());
56 query.bindValue(":SCREENSHOT", Screenshot());
57 }
58 else
59 {
60 query.prepare("UPDATE gamemetadata "
61 "SET version = 'CUSTOM', "
62 " gamename = :GAMENAME,"
63 " genre = :GENRE,"
64 " year = :YEAR,"
65 " country = :COUNTRY,"
66 " plot = :PLOT,"
67 " publisher = :PUBLISHER,"
68 " favorite = :FAVORITE,"
69 " screenshot = :SCREENSHOT,"
70 " fanart = :FANART,"
71 " boxart = :BOXART, "
72 " inetref = :INETREF "
73 "WHERE gametype = :GAMETYPE AND "
74 " romname = :ROMNAME");
75 query.bindValue(":GAMENAME", Gamename());
76 query.bindValue(":GENRE", Genre());
77 query.bindValue(":YEAR", Year());
78 query.bindValue(":COUNTRY", Country());
79 query.bindValue(":PLOT", Plot());
80 query.bindValue(":PUBLISHER", Publisher());
81 query.bindValue(":FAVORITE", Favorite());
82 query.bindValue(":SCREENSHOT", Screenshot());
83 query.bindValue(":FANART", Fanart());
84 query.bindValue(":BOXART", Boxart());
85 query.bindValue(":INETREF", Inetref());
86 query.bindValue(":GAMETYPE", GameType());
87 query.bindValue(":ROMNAME", Romname());
88 }
89
90 if (!query.exec())
91 {
92 MythDB::DBError("RomInfo::SaveToDatabase", query);
93 return;
94 }
95}
96
98{
99 LOG(VB_GENERAL, LOG_INFO, LOC + QString("Removing %1 - %2")
100 .arg(Rompath(), Romname()));
101
103
104 query.prepare("DELETE FROM gamemetadata WHERE "
105 "romname = :ROMNAME AND "
106 "rompath = :ROMPATH ");
107
108 query.bindValue(":ROMNAME",Romname());
109 query.bindValue(":ROMPATH",Rompath());
110
111 if (!query.exec())
112 MythDB::DBError("purgeGameDB", query);
113
114}
115
116// Return the count of how many times this appears in the db already
117int romInDB(const QString& rom, const QString& gametype)
118{
120
121 int count = 0;
122
123 query.prepare("SELECT count(*) FROM gamemetadata "
124 "WHERE gametype = :GAMETYPE "
125 "AND romname = :ROMNAME");
126
127 query.bindValue(":GAMETYPE", gametype);
128 query.bindValue(":ROMNAME", rom);
129
130 if (!query.exec())
131 {
132 MythDB::DBError("romInDB", query);
133 return -1;
134 }
135
136
137 if (query.next())
138 count = query.value(0).toInt();
139
140 return count;
141}
142
143
144bool RomInfo::FindImage(QString BaseFileName, QString *result)
145{
146 QStringList graphic_formats;
147 graphic_formats.append("png");
148 graphic_formats.append("gif");
149 graphic_formats.append("jpg");
150 graphic_formats.append("jpeg");
151 graphic_formats.append("xpm");
152 graphic_formats.append("bmp");
153 graphic_formats.append("pnm");
154 graphic_formats.append("tif");
155 graphic_formats.append("tiff");
156
157 int dotLocation = BaseFileName.lastIndexOf('.');
158 if (dotLocation == -1)
159 {
160 BaseFileName.append('.');
161 dotLocation = BaseFileName.length();
162 }
163
164
165 BaseFileName.truncate(dotLocation + 1);
166 return std::any_of(graphic_formats.cbegin(), graphic_formats.cend(),
167 [BaseFileName,result](const auto & format)
168 { *result = BaseFileName + format;
169 return QFile::exists(*result); } );
170}
171
172void RomInfo::setField(const QString& field, const QString& data)
173{
174 if (field == "system")
175 m_system = data;
176 else if (field == "gamename")
177 m_gamename = data;
178 else if (field == "genre")
179 m_genre = data;
180 else if (field == "year")
181 m_year = data;
182 else if (field == "favorite")
183 m_favorite = (data.toInt() != 0);
184 else if (field == "rompath")
185 m_rompath = data;
186 else if (field == "screenshot")
187 m_screenshot = data;
188 else if (field == "fanart")
189 m_fanart = data;
190 else if (field == "boxart")
191 m_boxart = data;
192 else if (field == "country")
193 m_country = data;
194 else if (field == "plot")
195 m_plot = data;
196 else if (field == "publisher")
197 m_publisher = data;
198 else if (field == "crc_value")
199 m_crcValue = data;
200 else if (field == "inetref")
201 m_inetref = data;
202 else if (field == "diskcount")
203 m_diskcount = data.toInt();
204 else if (field == "gametype")
205 m_gametype = data;
206 else if (field == "romcount")
207 m_romcount = data.toInt();
208 else
209 LOG(VB_GENERAL, LOG_ERR, LOC + QString("Invalid field %1").arg(field));
210
211}
212
213void RomInfo::setFavorite(bool updateDatabase)
214{
216
217 if (updateDatabase)
218 {
220
221 query.prepare("UPDATE gamemetadata SET favorite = :FAV "
222 "WHERE romname = :ROMNAME");
223
224 query.bindValue(":FAV", m_favorite);
225 query.bindValue(":ROMNAME",m_romname);
226
227 if (!query.exec())
228 {
229 MythDB::DBError("RomInfo::setFavorite", query);
230 }
231 }
232}
233
235{
236 int pos = Romname().lastIndexOf(".");
237 if (pos == -1)
238 return nullptr;
239
240 pos = Romname().length() - pos;
241 pos--;
242
243 QString ext = Romname().right(pos);
244 return ext;
245}
246
248{
249 if (m_gamename == "")
250 {
251 return;
252 }
253
255
256 QString systemtype;
257 if (m_system != "") {
258 systemtype += " AND `system` = :SYSTEM ";
259 }
260
261 QString thequery = "SELECT `system`,gamename,genre,year,romname,favorite,"
262 "rompath,country,crc_value,diskcount,gametype,plot,publisher,"
263 "version,screenshot,fanart,boxart,inetref,intid FROM gamemetadata "
264 "WHERE gamename = :GAMENAME "
265 + systemtype + " ORDER BY diskcount DESC";
266
267 query.prepare(thequery);
268 query.bindValue(":SYSTEM", m_system);
269 query.bindValue(":GAMENAME", m_gamename);
270
271 if (query.exec() && query.next())
272 {
273 setSystem(query.value(0).toString());
274 setGamename(query.value(1).toString());
275 setGenre(query.value(2).toString());
276 setYear(query.value(3).toString());
277 setRomname(query.value(4).toString());
278 setField("favorite",query.value(5).toString());
279 setRompath(query.value(6).toString());
280 setCountry(query.value(7).toString());
281 setCRC_VALUE(query.value(8).toString());
282 setDiskCount(query.value(9).toInt());
283 setGameType(query.value(10).toString());
284 setPlot(query.value(11).toString());
285 setPublisher(query.value(12).toString());
286 setVersion(query.value(13).toString());
287 setScreenshot(query.value(14).toString());
288 setFanart(query.value(15).toString());
289 setBoxart(query.value(16).toString());
290 setInetref(query.value(17).toString());
291 setId(query.value(18).toInt());
292 }
293
295
296 // If we have more than one instance of this rom in the DB fill in all
297 // systems available to play it.
298 if (RomCount() > 1)
299 {
300 query.prepare("SELECT DISTINCT `system` FROM gamemetadata "
301 "WHERE romname = :ROMNAME");
302 query.bindValue(":ROMNAME", Romname());
303 if (!query.exec())
304 MythDB::DBError("RomInfo::fillData - selecting systems", query);
305
306 while (query.next())
307 {
308 if (m_allsystems.isEmpty())
309 m_allsystems = query.value(0).toString();
310 else
311 m_allsystems += "," + query.value(0).toString();
312 }
313 }
314 else
315 {
317 }
318}
319
320QList<RomInfo*> RomInfo::GetAllRomInfo()
321{
322 QList<RomInfo*> ret;
323
325
326 QString querystr = "SELECT intid,`system`,romname,gamename,genre,year,publisher,"
327 "favorite,rompath,screenshot,fanart,plot,boxart,"
328 "gametype,diskcount,country,crc_value,inetref,display,"
329 "version FROM gamemetadata ORDER BY diskcount DESC";
330
331 query.prepare(querystr);
332
333 if (!query.exec())
334 {
335 MythDB::DBError("GetAllRomInfo", query);
336 return ret;
337 }
338
339 while (query.next())
340 {
341 auto *add = new RomInfo(
342 query.value(0).toInt(),
343 query.value(2).toString(),
344 query.value(1).toString(),
345 query.value(3).toString(),
346 query.value(4).toString(),
347 query.value(5).toString(),
348 query.value(7).toBool(),
349 query.value(8).toString(),
350 query.value(15).toString(),
351 query.value(16).toString(),
352 query.value(14).toInt(),
353 query.value(13).toString(),
354 0, QString(),
355 query.value(11).toString(),
356 query.value(6).toString(),
357 query.value(19).toString(),
358 query.value(9).toString(),
359 query.value(10).toString(),
360 query.value(12).toString(),
361 query.value(17).toString());
362 ret.append(add);
363 }
364
365 return ret;
366}
367
369{
370 RomInfo *ret = nullptr;
371
373
374 QString querystr = "SELECT intid,`system`,romname,gamename,genre,year,publisher,"
375 "favorite,rompath,screenshot,fanart,plot,boxart,"
376 "gametype,diskcount,country,crc_value,inetref,display,"
377 "version FROM gamemetadata WHERE intid = :INTID";
378
379 query.prepare(querystr);
380 query.bindValue(":INTID", id);
381
382 if (!query.exec())
383 MythDB::DBError("GetRomInfoById", query);
384
385 if (query.next())
386 {
387 ret = new RomInfo(
388 query.value(0).toInt(),
389 query.value(2).toString(),
390 query.value(1).toString(),
391 query.value(3).toString(),
392 query.value(4).toString(),
393 query.value(5).toString(),
394 query.value(7).toBool(),
395 query.value(8).toString(),
396 query.value(15).toString(),
397 query.value(16).toString(),
398 query.value(14).toInt(),
399 query.value(13).toString(),
400 0, QString(),
401 query.value(11).toString(),
402 query.value(6).toString(),
403 query.value(19).toString(),
404 query.value(9).toString(),
405 query.value(10).toString(),
406 query.value(12).toString(),
407 query.value(17).toString());
408 }
409
410 if (!ret)
411 ret = new RomInfo();
412
413 return ret;
414}
415
416QString RomInfo::toString() const
417{
418 return QString ("Rom Info:\n"
419 "ID: %1\n"
420 "Game Name: %2\n"
421 "Rom Name: %3\n"
422 "Rom Path: %4")
423 .arg(QString::number(Id()), Gamename(), Romname(), Rompath());
424}
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:128
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:837
QVariant value(int i) const
Definition: mythdbcon.h:204
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:618
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:888
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:812
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:550
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
int m_romcount
Definition: rominfo.h:142
int Id() const
Definition: rominfo.h:57
int m_diskcount
Definition: rominfo.h:143
QString Screenshot() const
Definition: rominfo.h:63
QString Country() const
Definition: rominfo.h:84
QString Plot() const
Definition: rominfo.h:102
void setGameType(const QString &lgametype)
Definition: rominfo.h:88
QString Gamename() const
Definition: rominfo.h:78
void setVersion(const QString &lversion)
Definition: rominfo.h:109
QString m_boxart
Definition: rominfo.h:149
void setBoxart(const QString &lboxart)
Definition: rominfo.h:70
QString m_system
Definition: rominfo.h:132
QString m_country
Definition: rominfo.h:135
void setRomCount(int lromcount)
Definition: rominfo.h:91
QString m_rompath
Definition: rominfo.h:146
QString Fanart() const
Definition: rominfo.h:66
QString m_inetref
Definition: rominfo.h:150
void setId(int lid)
Definition: rominfo.h:58
void setFavorite(bool updateDatabase=false)
Definition: rominfo.cpp:213
int RomCount() const
Definition: rominfo.h:90
QString m_romname
Definition: rominfo.h:131
void setCRC_VALUE(const QString &lcrc_value)
Definition: rominfo.h:100
QString m_gametype
Definition: rominfo.h:137
static bool FindImage(QString BaseFileName, QString *result)
Definition: rominfo.cpp:144
void setRompath(const QString &lrompath)
Definition: rominfo.h:61
int m_id
Definition: rominfo.h:130
void SaveToDatabase() const
Definition: rominfo.cpp:20
void setField(const QString &field, const QString &data)
Definition: rominfo.cpp:172
QString getExtension() const
Definition: rominfo.cpp:234
QString m_fanart
Definition: rominfo.h:148
void setGenre(const QString &lgenre)
Definition: rominfo.h:82
QString m_gamename
Definition: rominfo.h:133
QString System() const
Definition: rominfo.h:75
QString m_year
Definition: rominfo.h:144
QString Boxart() const
Definition: rominfo.h:69
QString Inetref() const
Definition: rominfo.h:114
QString m_crcValue
Definition: rominfo.h:136
void setDiskCount(int ldiskcount)
Definition: rominfo.h:97
void setPlot(const QString &lplot)
Definition: rominfo.h:103
void fillData()
Definition: rominfo.cpp:247
void setCountry(const QString &lcountry)
Definition: rominfo.h:85
RomInfo(int lid=0, QString lromname="", QString lsystem="", QString lgamename="", QString lgenre="", QString lyear="", bool lfavorite=false, QString lrompath="", QString lcountry="", QString lcrc_value="", int ldiskcount=0, QString lgametype="", int lromcount=0, QString lallsystems="", QString lplot="", QString lpublisher="", QString lversion="", QString lscreenshot="", QString lfanart="", QString lboxart="", QString linetref="")
Definition: rominfo.h:20
QString m_screenshot
Definition: rominfo.h:147
void setFanart(const QString &lfanart)
Definition: rominfo.h:67
QString m_plot
Definition: rominfo.h:139
QString toString() const
Definition: rominfo.cpp:416
void DeleteFromDatabase() const
Definition: rominfo.cpp:97
void setYear(const QString &lyear)
Definition: rominfo.h:112
QString Genre() const
Definition: rominfo.h:81
bool m_favorite
Definition: rominfo.h:145
QString m_allsystems
Definition: rominfo.h:138
QString Version() const
Definition: rominfo.h:108
bool Favorite() const
Definition: rominfo.h:117
void setScreenshot(const QString &lscreenshot)
Definition: rominfo.h:64
static QList< RomInfo * > GetAllRomInfo()
Definition: rominfo.cpp:320
void setPublisher(const QString &lpublisher)
Definition: rominfo.h:106
QString Publisher() const
Definition: rominfo.h:105
QString Romname() const
Definition: rominfo.h:72
QString GameType() const
Definition: rominfo.h:87
void setInetref(const QString &linetref)
Definition: rominfo.h:115
QString Rompath() const
Definition: rominfo.h:60
QString m_genre
Definition: rominfo.h:134
void setSystem(const QString &lsystem)
Definition: rominfo.h:76
void setGamename(const QString &lgamename)
Definition: rominfo.h:79
QString Year() const
Definition: rominfo.h:111
void setRomname(const QString &lromname)
Definition: rominfo.h:73
QString m_publisher
Definition: rominfo.h:140
static RomInfo * GetRomInfoById(int id)
Definition: rominfo.cpp:368
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
#define LOC
Definition: rominfo.cpp:13
bool operator==(const RomInfo &a, const RomInfo &b)
Definition: rominfo.cpp:15
int romInDB(const QString &rom, const QString &gametype)
Definition: rominfo.cpp:117