00001 #include <QFile>
00002
00003 #include <mythdb.h>
00004 #include <mythcontext.h>
00005
00006 #include "rominfo.h"
00007 #include "romedit.h"
00008
00009 #define LOC_ERR QString("MythGame:ROMINFO Error: ")
00010 #define LOC QString("MythGame:ROMINFO: ")
00011
00012 bool operator==(const RomInfo& a, const RomInfo& b)
00013 {
00014 if (a.Romname() == b.Romname())
00015 return true;
00016 return false;
00017 }
00018
00019 void RomInfo::SaveToDatabase()
00020 {
00021 MSqlQuery query(MSqlQuery::InitCon());
00022
00023 bool inserting = false;
00024
00025 if (id == 0)
00026 inserting = true;
00027
00028 if (inserting)
00029 {
00030 LOG(VB_GENERAL, LOG_INFO, LOC + QString("Adding %1 - %2").arg(Rompath())
00031 .arg(Romname()));
00032
00033 query.prepare("INSERT INTO gamemetadata "
00034 "(system, romname, gamename, genre, year, gametype, "
00035 "rompath, country, crc_value, diskcount, display, plot, "
00036 "publisher, version, fanart, boxart, screenshot) "
00037 "VALUES (:SYSTEM, :ROMNAME, :GAMENAME, :GENRE, :YEAR, "
00038 ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PLOT, "
00039 ":PUBLISHER, :VERSION, :FANART, :BOXART, :SCREENSHOT)");
00040
00041 query.bindValue(":SYSTEM",System());
00042 query.bindValue(":ROMNAME",Romname());
00043 query.bindValue(":GAMENAME",Gamename());
00044 query.bindValue(":GENRE",Genre());
00045 query.bindValue(":YEAR",Year());
00046 query.bindValue(":GAMETYPE",GameType());
00047 query.bindValue(":ROMPATH",Rompath());
00048 query.bindValue(":COUNTRY",Country());
00049 query.bindValue(":CRC32", QString());
00050 query.bindValue(":PLOT", Plot());
00051 query.bindValue(":PUBLISHER", Publisher());
00052 query.bindValue(":VERSION", Version());
00053 query.bindValue(":FANART", Fanart());
00054 query.bindValue(":BOXART", Boxart());
00055 query.bindValue(":SCREENSHOT", Screenshot());
00056 }
00057 else
00058 {
00059 query.prepare("UPDATE gamemetadata "
00060 "SET version = 'CUSTOM', "
00061 " gamename = :GAMENAME,"
00062 " genre = :GENRE,"
00063 " year = :YEAR,"
00064 " country = :COUNTRY,"
00065 " plot = :PLOT,"
00066 " publisher = :PUBLISHER,"
00067 " favorite = :FAVORITE,"
00068 " screenshot = :SCREENSHOT,"
00069 " fanart = :FANART,"
00070 " boxart = :BOXART, "
00071 " inetref = :INETREF "
00072 "WHERE gametype = :GAMETYPE AND "
00073 " romname = :ROMNAME");
00074 query.bindValue(":GAMENAME", Gamename());
00075 query.bindValue(":GENRE", Genre());
00076 query.bindValue(":YEAR", Year());
00077 query.bindValue(":COUNTRY", Country());
00078 query.bindValue(":PLOT", Plot());
00079 query.bindValue(":PUBLISHER", Publisher());
00080 query.bindValue(":FAVORITE", Favorite());
00081 query.bindValue(":SCREENSHOT", Screenshot());
00082 query.bindValue(":FANART", Fanart());
00083 query.bindValue(":BOXART", Boxart());
00084 query.bindValue(":INETREF", Inetref());
00085 query.bindValue(":GAMETYPE", GameType());
00086 query.bindValue(":ROMNAME", Romname());
00087 }
00088
00089 if (!query.exec())
00090 {
00091 MythDB::DBError("RomInfo::SaveToDatabase", query);
00092 return;
00093 }
00094 }
00095
00096 void RomInfo::DeleteFromDatabase()
00097 {
00098 LOG(VB_GENERAL, LOG_INFO, LOC + QString("Removing %1 - %2").arg(Rompath())
00099 .arg(Romname()));
00100
00101 MSqlQuery query(MSqlQuery::InitCon());
00102
00103 query.prepare("DELETE FROM gamemetadata WHERE "
00104 "romname = :ROMNAME AND "
00105 "rompath = :ROMPATH ");
00106
00107 query.bindValue(":ROMNAME",Romname());
00108 query.bindValue(":ROMPATH",Rompath());
00109
00110 if (!query.exec())
00111 MythDB::DBError("purgeGameDB", query);
00112
00113 }
00114
00115
00116 int romInDB(QString rom, QString gametype)
00117 {
00118 MSqlQuery query(MSqlQuery::InitCon());
00119
00120 int count = 0;
00121
00122 query.prepare("SELECT count(*) FROM gamemetadata "
00123 "WHERE gametype = :GAMETYPE "
00124 "AND romname = :ROMNAME");
00125
00126 query.bindValue(":GAMETYPE", gametype);
00127 query.bindValue(":ROMNAME", rom);
00128
00129 if (!query.exec())
00130 {
00131 MythDB::DBError("romInDB", query);
00132 return -1;
00133 }
00134
00135
00136 if (query.next())
00137 count = query.value(0).toInt();
00138
00139 return count;
00140 }
00141
00142
00143 bool RomInfo::FindImage(QString BaseFileName, QString *result)
00144 {
00145 QStringList graphic_formats;
00146 graphic_formats.append("png");
00147 graphic_formats.append("gif");
00148 graphic_formats.append("jpg");
00149 graphic_formats.append("jpeg");
00150 graphic_formats.append("xpm");
00151 graphic_formats.append("bmp");
00152 graphic_formats.append("pnm");
00153 graphic_formats.append("tif");
00154 graphic_formats.append("tiff");
00155
00156 int dotLocation = BaseFileName.lastIndexOf('.');
00157 if (dotLocation == -1)
00158 {
00159 BaseFileName.append('.');
00160 dotLocation = BaseFileName.length();
00161 }
00162
00163
00164 BaseFileName.truncate(dotLocation + 1);
00165 for (QStringList::Iterator i = graphic_formats.begin(); i != graphic_formats.end(); i++)
00166 {
00167 *result = BaseFileName + *i;
00168 if (QFile::exists(*result))
00169 return true;
00170 }
00171 return false;
00172 }
00173
00174 void RomInfo::setField(QString field, QString data)
00175 {
00176 if (field == "system")
00177 system = data;
00178 else if (field == "gamename")
00179 gamename = data;
00180 else if (field == "genre")
00181 genre = data;
00182 else if (field == "year")
00183 year = data;
00184 else if (field == "favorite")
00185 favorite = data.toInt();
00186 else if (field == "rompath")
00187 rompath = data;
00188 else if (field == "screenshot")
00189 screenshot = data;
00190 else if (field == "fanart")
00191 fanart = data;
00192 else if (field == "boxart")
00193 boxart = data;
00194 else if (field == "country")
00195 country = data;
00196 else if (field == "plot")
00197 plot = data;
00198 else if (field == "publisher")
00199 publisher = data;
00200 else if (field == "crc_value")
00201 crc_value = data;
00202 else if (field == "inetref")
00203 inetref = data;
00204 else if (field == "diskcount")
00205 diskcount = data.toInt();
00206 else if (field == "gametype")
00207 gametype = data;
00208 else if (field == "romcount")
00209 romcount = data.toInt();
00210 else
00211 LOG(VB_GENERAL, LOG_ERR, LOC + QString("Invalid field %1").arg(field));
00212
00213 }
00214
00215 void RomInfo::setFavorite(bool updateDatabase)
00216 {
00217 favorite = 1 - favorite;
00218
00219 if (updateDatabase)
00220 {
00221 MSqlQuery query(MSqlQuery::InitCon());
00222
00223 query.prepare("UPDATE gamemetadata SET favorite = :FAV "
00224 "WHERE romname = :ROMNAME");
00225
00226 query.bindValue(":FAV", favorite);
00227 query.bindValue(":ROMNAME",romname);
00228
00229 if (!query.exec())
00230 {
00231 MythDB::DBError("RomInfo::setFavorite", query);
00232 }
00233 }
00234 }
00235
00236 QString RomInfo::getExtension()
00237 {
00238 int pos = Romname().lastIndexOf(".");
00239 if (pos == -1)
00240 return NULL;
00241
00242 pos = Romname().length() - pos;
00243 pos--;
00244
00245 QString ext = Romname().right(pos);
00246 return ext;
00247 }
00248
00249 void RomInfo::fillData()
00250 {
00251 if (gamename == "")
00252 {
00253 return;
00254 }
00255
00256 MSqlQuery query(MSqlQuery::InitCon());
00257
00258 QString systemtype;
00259 if (system != "") {
00260 systemtype += " AND system = :SYSTEM ";
00261 }
00262
00263 QString thequery = "SELECT system,gamename,genre,year,romname,favorite,"
00264 "rompath,country,crc_value,diskcount,gametype,plot,publisher,"
00265 "version,screenshot,fanart,boxart,inetref,intid FROM gamemetadata "
00266 "WHERE gamename = :GAMENAME "
00267 + systemtype + " ORDER BY diskcount DESC";
00268
00269 query.prepare(thequery);
00270 query.bindValue(":SYSTEM", system);
00271 query.bindValue(":GAMENAME", gamename);
00272
00273 if (query.exec() && query.next())
00274 {
00275 setSystem(query.value(0).toString());
00276 setGamename(query.value(1).toString());
00277 setGenre(query.value(2).toString());
00278 setYear(query.value(3).toString());
00279 setRomname(query.value(4).toString());
00280 setField("favorite",query.value(5).toString());
00281 setRompath(query.value(6).toString());
00282 setCountry(query.value(7).toString());
00283 setCRC_VALUE(query.value(8).toString());
00284 setDiskCount(query.value(9).toInt());
00285 setGameType(query.value(10).toString());
00286 setPlot(query.value(11).toString());
00287 setPublisher(query.value(12).toString());
00288 setVersion(query.value(13).toString());
00289 setScreenshot(query.value(14).toString());
00290 setFanart(query.value(15).toString());
00291 setBoxart(query.value(16).toString());
00292 setInetref(query.value(17).toString());
00293 setId(query.value(18).toInt());
00294 }
00295
00296 setRomCount(romInDB(romname,gametype));
00297
00298
00299
00300 if (RomCount() > 1)
00301 {
00302 query.prepare("SELECT DISTINCT system FROM gamemetadata "
00303 "WHERE romname = :ROMNAME");
00304 query.bindValue(":ROMNAME", Romname());
00305 if (!query.exec())
00306 MythDB::DBError("RomInfo::fillData - selecting systems", query);
00307
00308 while (query.next())
00309 {
00310 if (allsystems.isEmpty())
00311 allsystems = query.value(0).toString();
00312 else
00313 allsystems += "," + query.value(0).toString();
00314 }
00315 }
00316 else
00317 {
00318 allsystems = system;
00319 }
00320 }
00321
00322 QList<RomInfo*> RomInfo::GetAllRomInfo()
00323 {
00324 QList<RomInfo*> ret;
00325
00326 MSqlQuery query(MSqlQuery::InitCon());
00327
00328 QString querystr = "SELECT intid,system,romname,gamename,genre,year,publisher,"
00329 "favorite,rompath,screenshot,fanart,plot,boxart,"
00330 "gametype,diskcount,country,crc_value,inetref,display,"
00331 "version FROM gamemetadata ORDER BY diskcount DESC";
00332
00333 query.prepare(querystr);
00334
00335 if (!query.exec())
00336 {
00337 MythDB::DBError("GetAllRomInfo", query);
00338 return ret;
00339 }
00340
00341 while (query.next())
00342 {
00343 RomInfo *add = new RomInfo(
00344 query.value(0).toInt(),
00345 query.value(2).toString(),
00346 query.value(1).toString(),
00347 query.value(3).toString(),
00348 query.value(4).toString(),
00349 query.value(5).toString(),
00350 query.value(7).toBool(),
00351 query.value(8).toString(),
00352 query.value(15).toString(),
00353 query.value(16).toString(),
00354 query.value(14).toInt(),
00355 query.value(13).toString(),
00356 0, QString(),
00357 query.value(11).toString(),
00358 query.value(6).toString(),
00359 query.value(19).toString(),
00360 query.value(9).toString(),
00361 query.value(10).toString(),
00362 query.value(12).toString(),
00363 query.value(17).toString());
00364 ret.append(add);
00365 }
00366
00367 return ret;
00368 }
00369
00370 RomInfo *RomInfo::GetRomInfoById(int id)
00371 {
00372 RomInfo *ret = new RomInfo();
00373
00374 MSqlQuery query(MSqlQuery::InitCon());
00375
00376 QString querystr = "SELECT intid,system,romname,gamename,genre,year,publisher,"
00377 "favorite,rompath,screenshot,fanart,plot,boxart,"
00378 "gametype,diskcount,country,crc_value,inetref,display,"
00379 "version FROM gamemetadata WHERE intid = :INTID";
00380
00381 query.prepare(querystr);
00382 query.bindValue(":INTID", id);
00383
00384 if (!query.exec())
00385 {
00386 MythDB::DBError("GetRomInfoById", query);
00387 return ret;
00388 }
00389
00390 if (query.next())
00391 {
00392 ret = new RomInfo(
00393 query.value(0).toInt(),
00394 query.value(2).toString(),
00395 query.value(1).toString(),
00396 query.value(3).toString(),
00397 query.value(4).toString(),
00398 query.value(5).toString(),
00399 query.value(7).toBool(),
00400 query.value(8).toString(),
00401 query.value(15).toString(),
00402 query.value(16).toString(),
00403 query.value(14).toInt(),
00404 query.value(13).toString(),
00405 0, QString(),
00406 query.value(11).toString(),
00407 query.value(6).toString(),
00408 query.value(19).toString(),
00409 query.value(9).toString(),
00410 query.value(10).toString(),
00411 query.value(12).toString(),
00412 query.value(17).toString());
00413 }
00414
00415 return ret;
00416 }
00417
00418 QString RomInfo::toString()
00419 {
00420 return QString ("Rom Info:\n"
00421 "ID: %1\n"
00422 "Game Name: %2\n"
00423 "Rom Name: %3\n"
00424 "Rom Path: %4")
00425 .arg(Id()).arg(Gamename())
00426 .arg(Romname()).arg(Rompath());
00427 }