00001 #include <qstring.h>
00002
00003 #include <iostream>
00004 using namespace std;
00005
00006 #include "dbcheck.h"
00007
00008 #include "mythtv/mythcontext.h"
00009 #include "mythtv/mythdbcon.h"
00010
00011 #include "gamesettings.h"
00012
00013 const QString currentDatabaseVersion = "1012";
00014
00015 static bool UpdateDBVersionNumber(const QString &newnumber)
00016 {
00017
00018 if (!gContext->SaveSettingOnHost("GameDBSchemaVer",newnumber,NULL))
00019 {
00020 VERBOSE(VB_IMPORTANT, QString("DB Error (Setting new DB version number): %1\n")
00021 .arg(newnumber));
00022
00023 return false;
00024 }
00025
00026 return true;
00027 }
00028
00029 static bool performActualUpdate(const QString updates[], QString version,
00030 QString &dbver)
00031 {
00032 MSqlQuery query(MSqlQuery::InitCon());
00033
00034 VERBOSE(VB_IMPORTANT, QString("Upgrading to MythGame schema version ") +
00035 version);
00036
00037 int counter = 0;
00038 QString thequery = updates[counter];
00039
00040 while (thequery != "")
00041 {
00042 query.prepare(thequery);
00043 query.exec();
00044
00045 if (query.lastError().type() != QSqlError::None)
00046 {
00047 QString msg =
00048 QString("DB Error (Performing database upgrade): \n"
00049 "Query was: %1 \nError was: %2 \nnew version: %3")
00050 .arg(thequery)
00051 .arg(MythContext::DBErrorMessage(query.lastError()))
00052 .arg(version);
00053 VERBOSE(VB_IMPORTANT, msg);
00054 return false;
00055 }
00056
00057 counter++;
00058 thequery = updates[counter];
00059 }
00060
00061 if (!UpdateDBVersionNumber(version))
00062 return false;
00063
00064 dbver = version;
00065 return true;
00066 }
00067
00068 bool InitializeDatabase(void)
00069 {
00070 VERBOSE(VB_IMPORTANT, "Inserting MythGame initial database information.");
00071
00072 const QString updates[] = {
00073 "CREATE TABLE gamemetadata ("
00074 " system varchar(128) NOT NULL default '',"
00075 " romname varchar(128) NOT NULL default '',"
00076 " gamename varchar(128) NOT NULL default '',"
00077 " genre varchar(128) NOT NULL default '',"
00078 " year varchar(10) NOT NULL default '',"
00079 " publisher varchar(128) NOT NULL default '',"
00080 " favorite tinyint(1) default NULL,"
00081 " rompath varchar(255) NOT NULL default '',"
00082 " gametype varchar(64) NOT NULL default '',"
00083 " diskcount tinyint(1) NOT NULL default '1',"
00084 " country varchar(128) NOT NULL default '',"
00085 " crc_value varchar(64) NOT NULL default '',"
00086 " display tinyint(1) NOT NULL default '1',"
00087 " version varchar(64) NOT NULL default '',"
00088 " KEY system (system),"
00089 " KEY year (year),"
00090 " KEY romname (romname),"
00091 " KEY gamename (gamename),"
00092 " KEY genre (genre)"
00093 ");",
00094 "CREATE TABLE gameplayers ("
00095 " gameplayerid int(10) unsigned NOT NULL auto_increment,"
00096 " playername varchar(64) NOT NULL default '',"
00097 " workingpath varchar(255) NOT NULL default '',"
00098 " rompath varchar(255) NOT NULL default '',"
00099 " screenshots varchar(255) NOT NULL default '',"
00100 " commandline text NOT NULL,"
00101 " gametype varchar(64) NOT NULL default '',"
00102 " extensions varchar(128) NOT NULL default '',"
00103 " spandisks tinyint(1) NOT NULL default '0',"
00104 " PRIMARY KEY (gameplayerid),"
00105 " UNIQUE KEY playername (playername)"
00106 ");",
00107 "CREATE TABLE romdb ("
00108 " crc varchar(64) NOT NULL default '',"
00109 " name varchar(128) NOT NULL default '',"
00110 " description varchar(128) NOT NULL default '',"
00111 " category varchar(128) NOT NULL default '',"
00112 " year varchar(10) NOT NULL default '',"
00113 " manufacturer varchar(128) NOT NULL default '',"
00114 " country varchar(128) NOT NULL default '',"
00115 " publisher varchar(128) NOT NULL default '',"
00116 " platform varchar(64) NOT NULL default '',"
00117 " filesize int(12) default NULL,"
00118 " flags varchar(64) NOT NULL default '',"
00119 " version varchar(64) NOT NULL default '',"
00120 " KEY crc (crc),"
00121 " KEY year (year),"
00122 " KEY category (category),"
00123 " KEY name (name),"
00124 " KEY description (description),"
00125 " KEY platform (platform)"
00126 ");",
00127 ""
00128 };
00129 QString dbver = "";
00130 if (!performActualUpdate(updates, "1011", dbver))
00131 return false;
00132
00133 return true;
00134 }
00135
00136 bool UpgradeGameDatabaseSchema(void)
00137 {
00138 QString dbver = gContext->GetSetting("GameDBSchemaVer");
00139 MSqlQuery query(MSqlQuery::InitCon());
00140
00141 if (dbver == currentDatabaseVersion)
00142 return true;
00143
00144 if (dbver == "")
00145 {
00146 if (!InitializeDatabase())
00147 return false;
00148 dbver = "1011";
00149 }
00150
00151 if (dbver == "1000")
00152 {
00153 const QString updates[] = {
00154 "ALTER TABLE gamemetadata ADD COLUMN favorite BOOL NULL;",
00155 ""
00156 };
00157 if (!performActualUpdate(updates, "1001", dbver))
00158 return false;
00159 }
00160
00161 if ((((dbver == "1004")
00162 || (dbver == "1003"))
00163 || (dbver == "1002"))
00164 || (dbver == "1001"))
00165 {
00166 const QString updates[] = {
00167
00168 "CREATE TABLE gameplayers ("
00169 " gameplayerid int(10) unsigned NOT NULL auto_increment,"
00170 " playername varchar(64) NOT NULL default '',"
00171 " workingpath varchar(255) NOT NULL default '',"
00172 " rompath varchar(255) NOT NULL default '',"
00173 " screenshots varchar(255) NOT NULL default '',"
00174 " commandline varchar(255) NOT NULL default '',"
00175 " gametype varchar(64) NOT NULL default '',"
00176 " extensions varchar(128) NOT NULL default '',"
00177 " PRIMARY KEY (gameplayerid),"
00178 " UNIQUE KEY playername (playername)"
00179 ");",
00180 "ALTER TABLE gamemetadata ADD COLUMN rompath varchar(255) NOT NULL default ''; ",
00181 "ALTER TABLE gamemetadata ADD COLUMN gametype varchar(64) NOT NULL default ''; ",
00182 ""
00183 };
00184 if (!performActualUpdate(updates, "1005", dbver))
00185 return false;
00186 }
00187
00188 if (dbver == "1005")
00189 {
00190 const QString updates[] = {
00191 "ALTER TABLE gameplayers ADD COLUMN spandisks tinyint(1) NOT NULL default 0; ",
00192 "ALTER TABLE gamemetadata ADD COLUMN diskcount tinyint(1) NOT NULL default 1; ",
00193 ""
00194 };
00195 if (!performActualUpdate(updates, "1006", dbver))
00196 return false;
00197 }
00198
00199 if (dbver == "1006")
00200 {
00201
00202 if (gContext->GetSetting("GameAllTreeLevels"))
00203 query.exec("UPDATE settings SET data = 'system gamename' WHERE value = 'GameAllTreeLevels'; ");
00204
00205 QString updates[] = {
00206 "ALTER TABLE gamemetadata ADD COLUMN country varchar(128) NOT NULL default ''; ",
00207 "ALTER TABLE gamemetadata ADD COLUMN crc_value varchar(64) NOT NULL default ''; ",
00208 "ALTER TABLE gamemetadata ADD COLUMN display tinyint(1) NOT NULL default 1; ",
00209 ""
00210 };
00211
00212 if (!performActualUpdate(updates, "1007", dbver))
00213 return false;
00214 }
00215
00216 if (dbver == "1007")
00217 {
00218 const QString updates[] = {
00219 "ALTER TABLE gameplayers MODIFY commandline TEXT NOT NULL default ''; ",
00220 ""
00221 };
00222
00223 if (!performActualUpdate(updates, "1008", dbver))
00224 return false;
00225 }
00226
00227 if (dbver == "1008")
00228 {
00229 const QString updates[] = {
00230 "CREATE TABLE romdb ("
00231 " crc varchar(64) NOT NULL default '',"
00232 " name varchar(128) NOT NULL default '',"
00233 " description varchar(128) NOT NULL default '',"
00234 " category varchar(128) NOT NULL default '',"
00235 " year varchar(10) NOT NULL default '',"
00236 " manufacturer varchar(128) NOT NULL default '',"
00237 " country varchar(128) NOT NULL default '',"
00238 " publisher varchar(128) NOT NULL default '',"
00239 " platform varchar(64) NOT NULL default '',"
00240 " filesize int(12) default NULL,"
00241 " flags varchar(64) NOT NULL default '',"
00242 " version varchar(64) NOT NULL default '',"
00243 " KEY crc (crc),"
00244 " KEY year (year),"
00245 " KEY category (category),"
00246 " KEY name (name),"
00247 " KEY description (description),"
00248 " KEY platform (platform)"
00249 ");",
00250 ""
00251 };
00252
00253 if (!performActualUpdate(updates, "1009", dbver))
00254 return false;
00255 }
00256
00257 if (dbver == "1009")
00258 {
00259 const QString updates[] = {
00260 "ALTER TABLE gamemetadata MODIFY year varchar(10) not null default '';",
00261 ""
00262 };
00263
00264 if (!performActualUpdate(updates, "1010", dbver))
00265 return false;
00266 }
00267
00268 if (dbver == "1010")
00269 {
00270 const QString updates[] = {
00271
00272 "ALTER TABLE gamemetadata ADD COLUMN version varchar(64) NOT NULL default '';",
00273 "ALTER TABLE gamemetadata ADD COLUMN publisher varchar(128) NOT NULL default '';",
00274 ""
00275 };
00276
00277 if (!performActualUpdate(updates, "1011", dbver))
00278 return false;
00279 }
00280
00281
00282 if (dbver == "1011")
00283 {
00284 const QString updates[] = {
00285 "ALTER TABLE romdb ADD COLUMN binfile varchar(64) NOT NULL default ''; ",
00286 ""
00287 };
00288
00289 if (!performActualUpdate(updates, "1012", dbver))
00290 return false;
00291 }
00292
00293
00294 return true;
00295 }