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