MythTV  0.26-pre
dbcheck.cpp
Go to the documentation of this file.
00001 #include <iostream>
00002 using namespace std;
00003 
00004 #include <QString>
00005 #include <QSqlError>
00006 
00007 #include <mythcontext.h>
00008 #include <mythdb.h>
00009 
00010 #include "dbcheck.h"
00011 #include "gamesettings.h"
00012 
00013 const QString currentDatabaseVersion = "1018";
00014 
00015 static bool UpdateDBVersionNumber(const QString &newnumber)
00016 {
00017 
00018     if (!gCoreContext->SaveSettingOnHost("GameDBSchemaVer",newnumber,NULL))
00019     {
00020         LOG(VB_GENERAL, LOG_ERR,
00021             QString("DB Error (Setting new DB version number): %1\n")
00022                 .arg(newnumber));
00023 
00024         return false;
00025     }
00026 
00027     return true;
00028 }
00029 
00030 static bool performActualUpdate(const QString updates[], QString version,
00031                                 QString &dbver)
00032 {
00033     MSqlQuery query(MSqlQuery::InitCon());
00034 
00035     LOG(VB_GENERAL, LOG_NOTICE,
00036         QString("Upgrading to MythGame schema version ") + version);
00037 
00038     int counter = 0;
00039     QString thequery = updates[counter];
00040 
00041     while (thequery != "")
00042     {
00043         if (!query.exec(thequery))
00044         {
00045             QString msg =
00046                 QString("DB Error (Performing database upgrade): \n"
00047                         "Query was: %1 \nError was: %2 \nnew version: %3")
00048                 .arg(thequery)
00049                 .arg(MythDB::DBErrorMessage(query.lastError()))
00050                 .arg(version);
00051             LOG(VB_GENERAL, LOG_ERR, msg);
00052             return false;
00053         }
00054 
00055         counter++;
00056         thequery = updates[counter];
00057     }
00058 
00059     if (!UpdateDBVersionNumber(version))
00060         return false;
00061 
00062     dbver = version;
00063     return true;
00064 }
00065 
00066 static bool InitializeDatabase(void)
00067 {
00068     LOG(VB_GENERAL, LOG_NOTICE,
00069         "Inserting MythGame initial database information.");
00070 
00071     const QString updates[] = {
00072 "CREATE TABLE gamemetadata ("
00073 "  system varchar(128) NOT NULL default '',"
00074 "  romname varchar(128) NOT NULL default '',"
00075 "  gamename varchar(128) NOT NULL default '',"
00076 "  genre varchar(128) NOT NULL default '',"
00077 "  year varchar(10) NOT NULL default '',"
00078 "  publisher varchar(128) NOT NULL default '',"
00079 "  favorite tinyint(1) default NULL,"
00080 "  rompath varchar(255) NOT NULL default '',"
00081 "  gametype varchar(64) NOT NULL default '',"
00082 "  diskcount tinyint(1) NOT NULL default '1',"
00083 "  country varchar(128) NOT NULL default '',"
00084 "  crc_value varchar(64) NOT NULL default '',"
00085 "  display tinyint(1) NOT NULL default '1',"
00086 "  version varchar(64) NOT NULL default '',"
00087 "  KEY system (system),"
00088 "  KEY year (year),"
00089 "  KEY romname (romname),"
00090 "  KEY gamename (gamename),"
00091 "  KEY genre (genre)"
00092 ");",
00093 "CREATE TABLE gameplayers ("
00094 "  gameplayerid int(10) unsigned NOT NULL auto_increment,"
00095 "  playername varchar(64) NOT NULL default '',"
00096 "  workingpath varchar(255) NOT NULL default '',"
00097 "  rompath varchar(255) NOT NULL default '',"
00098 "  screenshots varchar(255) NOT NULL default '',"
00099 "  commandline text NOT NULL,"
00100 "  gametype varchar(64) NOT NULL default '',"
00101 "  extensions varchar(128) NOT NULL default '',"
00102 "  spandisks tinyint(1) NOT NULL default '0',"
00103 "  PRIMARY KEY  (gameplayerid),"
00104 "  UNIQUE KEY playername (playername)"
00105 ");",
00106 "CREATE TABLE romdb ("
00107 "  crc varchar(64) NOT NULL default '',"
00108 "  name varchar(128) NOT NULL default '',"
00109 "  description varchar(128) NOT NULL default '',"
00110 "  category varchar(128) NOT NULL default '',"
00111 "  year varchar(10) NOT NULL default '',"
00112 "  manufacturer varchar(128) NOT NULL default '',"
00113 "  country varchar(128) NOT NULL default '',"
00114 "  publisher varchar(128) NOT NULL default '',"
00115 "  platform varchar(64) NOT NULL default '',"
00116 "  filesize int(12) default NULL,"
00117 "  flags varchar(64) NOT NULL default '',"
00118 "  version varchar(64) NOT NULL default '',"
00119 "  KEY crc (crc),"
00120 "  KEY year (year),"
00121 "  KEY category (category),"
00122 "  KEY name (name),"
00123 "  KEY description (description),"
00124 "  KEY platform (platform)"
00125 ");",
00126 ""
00127 };
00128     QString dbver = "";
00129     if (!performActualUpdate(updates, "1011", dbver))
00130         return false;
00131 
00132     return true;
00133 }
00134 
00135 bool UpgradeGameDatabaseSchema(void)
00136 {
00137     QString dbver = gCoreContext->GetSetting("GameDBSchemaVer");
00138     MSqlQuery query(MSqlQuery::InitCon());
00139 
00140     if (dbver == currentDatabaseVersion)
00141         return true;
00142 
00143     if (dbver.isEmpty())
00144     {
00145         if (!InitializeDatabase())
00146             return false;
00147         dbver = "1011";
00148     }
00149 
00150     if (dbver == "1000")
00151     {
00152         const QString updates[] = {
00153 "ALTER TABLE gamemetadata ADD COLUMN favorite BOOL NULL;",
00154 ""
00155 };
00156         if (!performActualUpdate(updates, "1001", dbver))
00157             return false;
00158     }
00159 
00160     if ((((dbver == "1004")
00161       || (dbver == "1003"))
00162       || (dbver == "1002"))
00163       || (dbver == "1001"))
00164     {
00165         const QString updates[] = {
00166 
00167 "CREATE TABLE gameplayers ("
00168 "  gameplayerid int(10) unsigned NOT NULL auto_increment,"
00169 "  playername varchar(64) NOT NULL default '',"
00170 "  workingpath varchar(255) NOT NULL default '',"
00171 "  rompath varchar(255) NOT NULL default '',"
00172 "  screenshots varchar(255) NOT NULL default '',"
00173 " commandline varchar(255) NOT NULL default '',"
00174 "  gametype varchar(64) NOT NULL default '',"
00175 "  extensions varchar(128) NOT NULL default '',"
00176 "  PRIMARY KEY (gameplayerid),"
00177 "  UNIQUE KEY playername (playername)"
00178 ");",
00179 "ALTER TABLE gamemetadata ADD COLUMN rompath varchar(255) NOT NULL default ''; ",
00180 "ALTER TABLE gamemetadata ADD COLUMN gametype varchar(64) NOT NULL default ''; ",
00181 ""
00182 };
00183         if (!performActualUpdate(updates, "1005", dbver))
00184             return false;
00185     }
00186 
00187     if (dbver == "1005")
00188     {
00189         const QString updates[] = {
00190 "ALTER TABLE gameplayers ADD COLUMN spandisks tinyint(1) NOT NULL default 0; ",
00191 "ALTER TABLE gamemetadata ADD COLUMN diskcount tinyint(1) NOT NULL default 1; ",
00192 ""
00193 };
00194         if (!performActualUpdate(updates, "1006", dbver))
00195             return false;
00196     }
00197 
00198     if (dbver == "1006")
00199     {
00200 
00201         if (!gCoreContext->GetSetting("GameAllTreeLevels").isEmpty())
00202             if (!query.exec("UPDATE settings SET data = 'system gamename' "
00203                             "WHERE value = 'GameAllTreeLevels'; "))
00204                 MythDB::DBError("update GameAllTreeLevels", query);
00205 
00206         QString updates[] = {
00207 "ALTER TABLE gamemetadata ADD COLUMN country varchar(128) NOT NULL default ''; ",
00208 "ALTER TABLE gamemetadata ADD COLUMN crc_value varchar(64) NOT NULL default ''; ",
00209 "ALTER TABLE gamemetadata ADD COLUMN display tinyint(1) NOT NULL default 1; ",
00210 ""
00211 };
00212 
00213         if (!performActualUpdate(updates, "1007", dbver))
00214             return false;
00215     }
00216 
00217     if (dbver == "1007")
00218     {
00219         const QString updates[] = {
00220 "ALTER TABLE gameplayers MODIFY commandline TEXT NOT NULL default ''; ",
00221 ""
00222 };
00223 
00224         if (!performActualUpdate(updates, "1008", dbver))
00225             return false;
00226     }
00227 
00228     if (dbver == "1008")
00229     {
00230         const QString updates[] = {
00231 "CREATE TABLE romdb ("
00232 "  crc varchar(64) NOT NULL default '',"
00233 "  name varchar(128) NOT NULL default '',"
00234 "  description varchar(128) NOT NULL default '',"
00235 "  category varchar(128) NOT NULL default '',"
00236 "  year varchar(10) NOT NULL default '',"
00237 "  manufacturer varchar(128) NOT NULL default '',"
00238 "  country varchar(128) NOT NULL default '',"
00239 "  publisher varchar(128) NOT NULL default '',"
00240 "  platform varchar(64) NOT NULL default '',"
00241 "  filesize int(12) default NULL,"
00242 "  flags varchar(64) NOT NULL default '',"
00243 "  version varchar(64) NOT NULL default '',"
00244 "  KEY crc (crc),"
00245 "  KEY year (year),"
00246 "  KEY category (category),"
00247 "  KEY name (name),"
00248 "  KEY description (description),"
00249 "  KEY platform (platform)"
00250 ");",
00251 ""
00252 };
00253 
00254         if (!performActualUpdate(updates, "1009", dbver))
00255             return false;
00256     }
00257 
00258     if (dbver == "1009")
00259     {
00260         const QString updates[] = {
00261 "ALTER TABLE gamemetadata MODIFY year varchar(10) not null default '';",
00262 ""
00263 };
00264 
00265         if (!performActualUpdate(updates, "1010", dbver))
00266             return false;
00267     }
00268 
00269     if (dbver == "1010")
00270     {
00271         const QString updates[] = {
00272 
00273 "ALTER TABLE gamemetadata ADD COLUMN version varchar(64) NOT NULL default '';",
00274 "ALTER TABLE gamemetadata ADD COLUMN publisher varchar(128) NOT NULL default '';",
00275 ""
00276 };
00277 
00278         if (!performActualUpdate(updates, "1011", dbver))
00279             return false;
00280     }
00281 
00282 
00283     if (dbver == "1011")
00284     {
00285         const QString updates[] = {
00286 "ALTER TABLE romdb ADD COLUMN binfile varchar(64) NOT NULL default ''; ",
00287 ""
00288 };
00289 
00290         if (!performActualUpdate(updates, "1012", dbver))
00291             return false;
00292     }
00293 
00294 
00295     if (dbver == "1012")
00296     {
00297         const QString updates[] = {
00298 QString("ALTER DATABASE %1 DEFAULT CHARACTER SET latin1;")
00299         .arg(gContext->GetDatabaseParams().dbName),
00300 "ALTER TABLE gamemetadata"
00301 "  MODIFY system varbinary(128) NOT NULL default '',"
00302 "  MODIFY romname varbinary(128) NOT NULL default '',"
00303 "  MODIFY gamename varbinary(128) NOT NULL default '',"
00304 "  MODIFY genre varbinary(128) NOT NULL default '',"
00305 "  MODIFY year varbinary(10) NOT NULL default '',"
00306 "  MODIFY publisher varbinary(128) NOT NULL default '',"
00307 "  MODIFY rompath varbinary(255) NOT NULL default '',"
00308 "  MODIFY gametype varbinary(64) NOT NULL default '',"
00309 "  MODIFY country varbinary(128) NOT NULL default '',"
00310 "  MODIFY crc_value varbinary(64) NOT NULL default '',"
00311 "  MODIFY version varbinary(64) NOT NULL default '';",
00312 "ALTER TABLE gameplayers"
00313 "  MODIFY playername varbinary(64) NOT NULL default '',"
00314 "  MODIFY workingpath varbinary(255) NOT NULL default '',"
00315 "  MODIFY rompath varbinary(255) NOT NULL default '',"
00316 "  MODIFY screenshots varbinary(255) NOT NULL default '',"
00317 "  MODIFY commandline blob NOT NULL,"
00318 "  MODIFY gametype varbinary(64) NOT NULL default '',"
00319 "  MODIFY extensions varbinary(128) NOT NULL default '';",
00320 "ALTER TABLE romdb"
00321 "  MODIFY crc varbinary(64) NOT NULL default '',"
00322 "  MODIFY name varbinary(128) NOT NULL default '',"
00323 "  MODIFY description varbinary(128) NOT NULL default '',"
00324 "  MODIFY category varbinary(128) NOT NULL default '',"
00325 "  MODIFY year varbinary(10) NOT NULL default '',"
00326 "  MODIFY manufacturer varbinary(128) NOT NULL default '',"
00327 "  MODIFY country varbinary(128) NOT NULL default '',"
00328 "  MODIFY publisher varbinary(128) NOT NULL default '',"
00329 "  MODIFY platform varbinary(64) NOT NULL default '',"
00330 "  MODIFY flags varbinary(64) NOT NULL default '',"
00331 "  MODIFY version varbinary(64) NOT NULL default '',"
00332 "  MODIFY binfile varbinary(64) NOT NULL default '';",
00333 ""
00334 };
00335 
00336         if (!performActualUpdate(updates, "1013", dbver))
00337             return false;
00338     }
00339 
00340 
00341     if (dbver == "1013")
00342     {
00343         const QString updates[] = {
00344 QString("ALTER DATABASE %1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;")
00345         .arg(gContext->GetDatabaseParams().dbName),
00346 "ALTER TABLE gamemetadata"
00347 "  DEFAULT CHARACTER SET default,"
00348 "  MODIFY system varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00349 "  MODIFY romname varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00350 "  MODIFY gamename varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00351 "  MODIFY genre varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00352 "  MODIFY year varchar(10) CHARACTER SET utf8 NOT NULL default '',"
00353 "  MODIFY publisher varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00354 "  MODIFY rompath varchar(255) CHARACTER SET utf8 NOT NULL default '',"
00355 "  MODIFY gametype varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00356 "  MODIFY country varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00357 "  MODIFY crc_value varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00358 "  MODIFY version varchar(64) CHARACTER SET utf8 NOT NULL default '';",
00359 "ALTER TABLE gameplayers"
00360 "  DEFAULT CHARACTER SET default,"
00361 "  MODIFY playername varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00362 "  MODIFY workingpath varchar(255) CHARACTER SET utf8 NOT NULL default '',"
00363 "  MODIFY rompath varchar(255) CHARACTER SET utf8 NOT NULL default '',"
00364 "  MODIFY screenshots varchar(255) CHARACTER SET utf8 NOT NULL default '',"
00365 "  MODIFY commandline text CHARACTER SET utf8 NOT NULL,"
00366 "  MODIFY gametype varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00367 "  MODIFY extensions varchar(128) CHARACTER SET utf8 NOT NULL default '';",
00368 "ALTER TABLE romdb"
00369 "  DEFAULT CHARACTER SET default,"
00370 "  MODIFY crc varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00371 "  MODIFY name varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00372 "  MODIFY description varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00373 "  MODIFY category varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00374 "  MODIFY year varchar(10) CHARACTER SET utf8 NOT NULL default '',"
00375 "  MODIFY manufacturer varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00376 "  MODIFY country varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00377 "  MODIFY publisher varchar(128) CHARACTER SET utf8 NOT NULL default '',"
00378 "  MODIFY platform varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00379 "  MODIFY flags varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00380 "  MODIFY version varchar(64) CHARACTER SET utf8 NOT NULL default '',"
00381 "  MODIFY binfile varchar(64) CHARACTER SET utf8 NOT NULL default '';",
00382 ""
00383 };
00384 
00385         if (!performActualUpdate(updates, "1014", dbver))
00386             return false;
00387     }
00388 
00389     if (dbver == "1014")
00390     {
00391         const QString updates[] = {
00392 
00393 "ALTER TABLE gamemetadata ADD fanart VARCHAR(255) NOT NULL AFTER rompath,"
00394 "ADD boxart VARCHAR( 255 ) NOT NULL AFTER fanart;",
00395 ""
00396 };
00397 
00398         if (!performActualUpdate(updates, "1015", dbver))
00399             return false;
00400     }
00401 
00402     if (dbver == "1015")
00403     {
00404         const QString updates[] = {
00405 
00406 "ALTER TABLE gamemetadata ADD screenshot VARCHAR(255) NOT NULL AFTER rompath,"
00407 "ADD plot TEXT NOT NULL AFTER fanart;",
00408 ""
00409 };
00410 
00411         if (!performActualUpdate(updates, "1016", dbver))
00412             return false;
00413     }
00414 
00415     if (dbver == "1016")
00416     {
00417         const QString updates[] = {
00418 
00419 "ALTER TABLE gamemetadata ADD inetref TEXT AFTER crc_value;",
00420 ""
00421 };
00422 
00423         if (!performActualUpdate(updates, "1017", dbver))
00424             return false;
00425     }
00426 
00427     if (dbver == "1017")
00428     {
00429         const QString updates[] = {
00430 
00431 "ALTER TABLE gamemetadata ADD intid int(11) NOT NULL AUTO_INCREMENT "
00432 "PRIMARY KEY FIRST;",
00433 ""
00434 };
00435 
00436         if (!performActualUpdate(updates, "1018", dbver))
00437             return false;
00438     }
00439 
00440     return true;
00441 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends