MythTV  master
rominfo.cpp
Go to the documentation of this file.
1 // Qt
2 #include <QFile>
3 
4 // MythTV
5 #include <libmyth/mythcontext.h>
6 #include <libmythbase/mythdb.h>
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 
15 bool 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 
102  MSqlQuery query(MSqlQuery::InitCon());
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
117 int romInDB(const QString& rom, const QString& gametype)
118 {
119  MSqlQuery query(MSqlQuery::InitCon());
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 
144 bool 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 
172 void 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 
213 void RomInfo::setFavorite(bool updateDatabase)
214 {
216 
217  if (updateDatabase)
218  {
219  MSqlQuery query(MSqlQuery::InitCon());
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 
234 QString RomInfo::getExtension() const
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 
254  MSqlQuery query(MSqlQuery::InitCon());
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 
320 QList<RomInfo*> RomInfo::GetAllRomInfo()
321 {
322  QList<RomInfo*> ret;
323 
324  MSqlQuery query(MSqlQuery::InitCon());
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 
372  MSqlQuery query(MSqlQuery::InitCon());
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 
416 QString 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 }
RomInfo::m_favorite
bool m_favorite
Definition: rominfo.h:145
RomInfo::Boxart
QString Boxart() const
Definition: rominfo.h:69
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:813
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:127
RomInfo::setGameType
void setGameType(const QString &lgametype)
Definition: rominfo.h:88
RomInfo::m_id
int m_id
Definition: rominfo.h:130
RomInfo::m_publisher
QString m_publisher
Definition: rominfo.h:140
mythdb.h
RomInfo::Id
int Id() const
Definition: rominfo.h:57
RomInfo::Plot
QString Plot() const
Definition: rominfo.h:102
RomInfo::FindImage
static bool FindImage(QString BaseFileName, QString *result)
Definition: rominfo.cpp:144
RomInfo::Country
QString Country() const
Definition: rominfo.h:84
RomInfo::Gamename
QString Gamename() const
Definition: rominfo.h:78
RomInfo::Favorite
bool Favorite() const
Definition: rominfo.h:117
RomInfo::RomCount
int RomCount() const
Definition: rominfo.h:90
RomInfo::setBoxart
void setBoxart(const QString &lboxart)
Definition: rominfo.h:70
romedit.h
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:204
RomInfo::setCountry
void setCountry(const QString &lcountry)
Definition: rominfo.h:85
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:619
RomInfo::GetAllRomInfo
static QList< RomInfo * > GetAllRomInfo()
Definition: rominfo.cpp:320
RomInfo::Genre
QString Genre() const
Definition: rominfo.h:81
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
RomInfo::Version
QString Version() const
Definition: rominfo.h:108
RomInfo::setSystem
void setSystem(const QString &lsystem)
Definition: rominfo.h:76
RomInfo::System
QString System() const
Definition: rominfo.h:75
RomInfo::m_country
QString m_country
Definition: rominfo.h:135
RomInfo::setId
void setId(int lid)
Definition: rominfo.h:58
RomInfo::m_crcValue
QString m_crcValue
Definition: rominfo.h:136
RomInfo::m_plot
QString m_plot
Definition: rominfo.h:139
RomInfo::m_romname
QString m_romname
Definition: rominfo.h:131
RomInfo::Screenshot
QString Screenshot() const
Definition: rominfo.h:63
RomInfo::m_inetref
QString m_inetref
Definition: rominfo.h:150
RomInfo::fillData
void fillData()
Definition: rominfo.cpp:247
RomInfo::m_screenshot
QString m_screenshot
Definition: rominfo.h:147
RomInfo::setInetref
void setInetref(const QString &linetref)
Definition: rominfo.h:115
RomInfo::setGamename
void setGamename(const QString &lgamename)
Definition: rominfo.h:79
RomInfo::Rompath
QString Rompath() const
Definition: rominfo.h:60
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:551
RomInfo::setVersion
void setVersion(const QString &lversion)
Definition: rominfo.h:109
MythDB::DBError
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
RomInfo::m_rompath
QString m_rompath
Definition: rominfo.h:146
RomInfo::setPublisher
void setPublisher(const QString &lpublisher)
Definition: rominfo.h:106
RomInfo::setFavorite
void setFavorite(bool updateDatabase=false)
Definition: rominfo.cpp:213
RomInfo::m_year
QString m_year
Definition: rominfo.h:144
rominfo.h
RomInfo::setFanart
void setFanart(const QString &lfanart)
Definition: rominfo.h:67
RomInfo::m_gamename
QString m_gamename
Definition: rominfo.h:133
RomInfo::setPlot
void setPlot(const QString &lplot)
Definition: rominfo.h:103
RomInfo::m_genre
QString m_genre
Definition: rominfo.h:134
RomInfo::GetRomInfoById
static RomInfo * GetRomInfoById(int id)
Definition: rominfo.cpp:368
RomInfo::setDiskCount
void setDiskCount(int ldiskcount)
Definition: rominfo.h:97
RomInfo::Publisher
QString Publisher() const
Definition: rominfo.h:105
RomInfo::setRomname
void setRomname(const QString &lromname)
Definition: rominfo.h:73
RomInfo::setRompath
void setRompath(const QString &lrompath)
Definition: rominfo.h:61
operator==
bool operator==(const RomInfo &a, const RomInfo &b)
Definition: rominfo.cpp:15
RomInfo
Definition: rominfo.h:14
RomInfo::setCRC_VALUE
void setCRC_VALUE(const QString &lcrc_value)
Definition: rominfo.h:100
LOC
#define LOC
Definition: rominfo.cpp:13
RomInfo::m_gametype
QString m_gametype
Definition: rominfo.h:137
RomInfo::m_boxart
QString m_boxart
Definition: rominfo.h:149
RomInfo::Fanart
QString Fanart() const
Definition: rominfo.h:66
RomInfo::setRomCount
void setRomCount(int lromcount)
Definition: rominfo.h:91
MSqlQuery::bindValue
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:889
RomInfo::getExtension
QString getExtension() const
Definition: rominfo.cpp:234
RomInfo::setYear
void setYear(const QString &lyear)
Definition: rominfo.h:112
RomInfo::toString
QString toString() const
Definition: rominfo.cpp:416
RomInfo::DeleteFromDatabase
void DeleteFromDatabase() const
Definition: rominfo.cpp:97
mythcontext.h
RomInfo::SaveToDatabase
void SaveToDatabase() const
Definition: rominfo.cpp:20
romInDB
int romInDB(const QString &rom, const QString &gametype)
Definition: rominfo.cpp:117
RomInfo::RomInfo
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
RomInfo::setField
void setField(const QString &field, const QString &data)
Definition: rominfo.cpp:172
RomInfo::m_allsystems
QString m_allsystems
Definition: rominfo.h:138
RomInfo::m_diskcount
int m_diskcount
Definition: rominfo.h:143
RomInfo::setScreenshot
void setScreenshot(const QString &lscreenshot)
Definition: rominfo.h:64
RomInfo::GameType
QString GameType() const
Definition: rominfo.h:87
RomInfo::m_fanart
QString m_fanart
Definition: rominfo.h:148
RomInfo::Inetref
QString Inetref() const
Definition: rominfo.h:114
RomInfo::Year
QString Year() const
Definition: rominfo.h:111
RomInfo::Romname
QString Romname() const
Definition: rominfo.h:72
RomInfo::m_system
QString m_system
Definition: rominfo.h:132
RomInfo::setGenre
void setGenre(const QString &lgenre)
Definition: rominfo.h:82
RomInfo::m_romcount
int m_romcount
Definition: rominfo.h:142
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:838