MythTV master
gamedbcheck.cpp
Go to the documentation of this file.
1// C++
2#include <iostream>
3
4// Qt
5#include <QString>
6#include <QSqlError>
7
8// MythTV
10#include <libmythbase/mythdb.h>
13
14// MythGame
15#include "gamedbcheck.h"
16#include "gamesettings.h"
17
18const QString currentDatabaseVersion = "1020";
19const QString MythGameVersionName = "GameDBSchemaVer";
20
21static bool InitializeDatabase(void)
22{
23 LOG(VB_GENERAL, LOG_NOTICE,
24 "Inserting MythGame initial database information.");
25
26 DBUpdates updates {
27"CREATE TABLE gamemetadata ("
28" `system` varchar(128) NOT NULL default '',"
29" romname varchar(128) NOT NULL default '',"
30" gamename varchar(128) NOT NULL default '',"
31" genre varchar(128) NOT NULL default '',"
32" year varchar(10) NOT NULL default '',"
33" publisher varchar(128) NOT NULL default '',"
34" favorite tinyint(1) default NULL,"
35" rompath varchar(255) NOT NULL default '',"
36" gametype varchar(64) NOT NULL default '',"
37" diskcount tinyint(1) NOT NULL default '1',"
38" country varchar(128) NOT NULL default '',"
39" crc_value varchar(64) NOT NULL default '',"
40" display tinyint(1) NOT NULL default '1',"
41" version varchar(64) NOT NULL default '',"
42" KEY `system` (`system`),"
43" KEY year (year),"
44" KEY romname (romname),"
45" KEY gamename (gamename),"
46" KEY genre (genre)"
47");",
48"CREATE TABLE gameplayers ("
49" gameplayerid int(10) unsigned NOT NULL auto_increment,"
50" playername varchar(64) NOT NULL default '',"
51" workingpath varchar(255) NOT NULL default '',"
52" rompath varchar(255) NOT NULL default '',"
53" screenshots varchar(255) NOT NULL default '',"
54" commandline text NOT NULL,"
55" gametype varchar(64) NOT NULL default '',"
56" extensions varchar(128) NOT NULL default '',"
57" spandisks tinyint(1) NOT NULL default '0',"
58" PRIMARY KEY (gameplayerid),"
59" UNIQUE KEY playername (playername)"
60");",
61"CREATE TABLE romdb ("
62" crc varchar(64) NOT NULL default '',"
63" name varchar(128) NOT NULL default '',"
64" description varchar(128) NOT NULL default '',"
65" category varchar(128) NOT NULL default '',"
66" year varchar(10) NOT NULL default '',"
67" manufacturer varchar(128) NOT NULL default '',"
68" country varchar(128) NOT NULL default '',"
69" publisher varchar(128) NOT NULL default '',"
70" platform varchar(64) NOT NULL default '',"
71" filesize int(12) default NULL,"
72" flags varchar(64) NOT NULL default '',"
73" version varchar(64) NOT NULL default '',"
74" KEY crc (crc),"
75" KEY year (year),"
76" KEY category (category),"
77" KEY name (name),"
78" KEY description (description),"
79" KEY platform (platform)"
80");"
81};
82 QString dbver = "";
84 updates, "1011", dbver);
85}
86
88{
89 QString dbver = gCoreContext->GetSetting("GameDBSchemaVer");
91
92 if (dbver == currentDatabaseVersion)
93 return true;
94
95 if (dbver.isEmpty())
96 {
97 if (!InitializeDatabase())
98 return false;
99 dbver = "1011";
100 }
101
102 if (dbver == "1000")
103 {
104 DBUpdates updates {
105"ALTER TABLE gamemetadata ADD COLUMN favorite BOOL NULL;"
106};
108 updates, "1001", dbver))
109 return false;
110 }
111
112 if ((((dbver == "1004")
113 || (dbver == "1003"))
114 || (dbver == "1002"))
115 || (dbver == "1001"))
116 {
117 DBUpdates updates {
118
119"CREATE TABLE gameplayers ("
120" gameplayerid int(10) unsigned NOT NULL auto_increment,"
121" playername varchar(64) NOT NULL default '',"
122" workingpath varchar(255) NOT NULL default '',"
123" rompath varchar(255) NOT NULL default '',"
124" screenshots varchar(255) NOT NULL default '',"
125" commandline varchar(255) NOT NULL default '',"
126" gametype varchar(64) NOT NULL default '',"
127" extensions varchar(128) NOT NULL default '',"
128" PRIMARY KEY (gameplayerid),"
129" UNIQUE KEY playername (playername)"
130");",
131"ALTER TABLE gamemetadata ADD COLUMN rompath varchar(255) NOT NULL default ''; ",
132"ALTER TABLE gamemetadata ADD COLUMN gametype varchar(64) NOT NULL default ''; "
133};
135 updates, "1005", dbver))
136 return false;
137 }
138
139 if (dbver == "1005")
140 {
141 DBUpdates updates {
142"ALTER TABLE gameplayers ADD COLUMN spandisks tinyint(1) NOT NULL default 0; ",
143"ALTER TABLE gamemetadata ADD COLUMN diskcount tinyint(1) NOT NULL default 1; "
144};
146 updates, "1006", dbver))
147 return false;
148 }
149
150 if (dbver == "1006")
151 {
152
153 if (!gCoreContext->GetSetting("GameAllTreeLevels").isEmpty())
154 {
155 if (!query.exec("UPDATE settings SET data = 'system gamename' "
156 "WHERE value = 'GameAllTreeLevels'; "))
157 MythDB::DBError("update GameAllTreeLevels", query);
158 }
159
160 DBUpdates updates = {
161"ALTER TABLE gamemetadata ADD COLUMN country varchar(128) NOT NULL default ''; ",
162"ALTER TABLE gamemetadata ADD COLUMN crc_value varchar(64) NOT NULL default ''; ",
163"ALTER TABLE gamemetadata ADD COLUMN display tinyint(1) NOT NULL default 1; "
164};
165
167 updates, "1007", dbver))
168 return false;
169 }
170
171 if (dbver == "1007")
172 {
173 DBUpdates updates {
174"ALTER TABLE gameplayers MODIFY commandline TEXT NOT NULL default ''; "
175};
176
178 updates, "1008", dbver))
179 return false;
180 }
181
182 if (dbver == "1008")
183 {
184 DBUpdates updates {
185"CREATE TABLE romdb ("
186" crc varchar(64) NOT NULL default '',"
187" name varchar(128) NOT NULL default '',"
188" description varchar(128) NOT NULL default '',"
189" category varchar(128) NOT NULL default '',"
190" year varchar(10) NOT NULL default '',"
191" manufacturer varchar(128) NOT NULL default '',"
192" country varchar(128) NOT NULL default '',"
193" publisher varchar(128) NOT NULL default '',"
194" platform varchar(64) NOT NULL default '',"
195" filesize int(12) default NULL,"
196" flags varchar(64) NOT NULL default '',"
197" version varchar(64) NOT NULL default '',"
198" KEY crc (crc),"
199" KEY year (year),"
200" KEY category (category),"
201" KEY name (name),"
202" KEY description (description),"
203" KEY platform (platform)"
204");"
205};
206
208 updates, "1009", dbver))
209 return false;
210 }
211
212 if (dbver == "1009")
213 {
214 DBUpdates updates {
215"ALTER TABLE gamemetadata MODIFY year varchar(10) not null default '';"
216};
217
219 updates, "1010", dbver))
220 return false;
221 }
222
223 if (dbver == "1010")
224 {
225 DBUpdates updates {
226
227"ALTER TABLE gamemetadata ADD COLUMN version varchar(64) NOT NULL default '';",
228"ALTER TABLE gamemetadata ADD COLUMN publisher varchar(128) NOT NULL default '';"
229};
230
232 updates, "1011", dbver))
233 return false;
234 }
235
236
237 if (dbver == "1011")
238 {
239 DBUpdates updates {
240"ALTER TABLE romdb ADD COLUMN binfile varchar(64) NOT NULL default ''; "
241};
242
244 updates, "1012", dbver))
245 return false;
246 }
247
248
249 if (dbver == "1012")
250 {
251 DBUpdates updates {
252qPrintable(QString("ALTER DATABASE %1 DEFAULT CHARACTER SET latin1;")
253 .arg(GetMythDB()->GetDatabaseName())),
254"ALTER TABLE gamemetadata"
255" MODIFY `system` varbinary(128) NOT NULL default '',"
256" MODIFY romname varbinary(128) NOT NULL default '',"
257" MODIFY gamename varbinary(128) NOT NULL default '',"
258" MODIFY genre varbinary(128) NOT NULL default '',"
259" MODIFY year varbinary(10) NOT NULL default '',"
260" MODIFY publisher varbinary(128) NOT NULL default '',"
261" MODIFY rompath varbinary(255) NOT NULL default '',"
262" MODIFY gametype varbinary(64) NOT NULL default '',"
263" MODIFY country varbinary(128) NOT NULL default '',"
264" MODIFY crc_value varbinary(64) NOT NULL default '',"
265" MODIFY version varbinary(64) NOT NULL default '';",
266"ALTER TABLE gameplayers"
267" MODIFY playername varbinary(64) NOT NULL default '',"
268" MODIFY workingpath varbinary(255) NOT NULL default '',"
269" MODIFY rompath varbinary(255) NOT NULL default '',"
270" MODIFY screenshots varbinary(255) NOT NULL default '',"
271" MODIFY commandline blob NOT NULL,"
272" MODIFY gametype varbinary(64) NOT NULL default '',"
273" MODIFY extensions varbinary(128) NOT NULL default '';",
274"ALTER TABLE romdb"
275" MODIFY crc varbinary(64) NOT NULL default '',"
276" MODIFY name varbinary(128) NOT NULL default '',"
277" MODIFY description varbinary(128) NOT NULL default '',"
278" MODIFY category varbinary(128) NOT NULL default '',"
279" MODIFY year varbinary(10) NOT NULL default '',"
280" MODIFY manufacturer varbinary(128) NOT NULL default '',"
281" MODIFY country varbinary(128) NOT NULL default '',"
282" MODIFY publisher varbinary(128) NOT NULL default '',"
283" MODIFY platform varbinary(64) NOT NULL default '',"
284" MODIFY flags varbinary(64) NOT NULL default '',"
285" MODIFY version varbinary(64) NOT NULL default '',"
286" MODIFY binfile varbinary(64) NOT NULL default '';"
287};
288
290 updates, "1013", dbver))
291 return false;
292 }
293
294
295 if (dbver == "1013")
296 {
297 DBUpdates updates {
298qPrintable(QString("ALTER DATABASE %1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;")
299 .arg(GetMythDB()->GetDatabaseName())),
300"ALTER TABLE gamemetadata"
301" DEFAULT CHARACTER SET utf8,"
302" MODIFY `system` varchar(128) CHARACTER SET utf8 NOT NULL default '',"
303" MODIFY romname varchar(128) CHARACTER SET utf8 NOT NULL default '',"
304" MODIFY gamename varchar(128) CHARACTER SET utf8 NOT NULL default '',"
305" MODIFY genre varchar(128) CHARACTER SET utf8 NOT NULL default '',"
306" MODIFY year varchar(10) CHARACTER SET utf8 NOT NULL default '',"
307" MODIFY publisher varchar(128) CHARACTER SET utf8 NOT NULL default '',"
308" MODIFY rompath varchar(255) CHARACTER SET utf8 NOT NULL default '',"
309" MODIFY gametype varchar(64) CHARACTER SET utf8 NOT NULL default '',"
310" MODIFY country varchar(128) CHARACTER SET utf8 NOT NULL default '',"
311" MODIFY crc_value varchar(64) CHARACTER SET utf8 NOT NULL default '',"
312" MODIFY version varchar(64) CHARACTER SET utf8 NOT NULL default '';",
313"ALTER TABLE gameplayers"
314" DEFAULT CHARACTER SET utf8,"
315" MODIFY playername varchar(64) CHARACTER SET utf8 NOT NULL default '',"
316" MODIFY workingpath varchar(255) CHARACTER SET utf8 NOT NULL default '',"
317" MODIFY rompath varchar(255) CHARACTER SET utf8 NOT NULL default '',"
318" MODIFY screenshots varchar(255) CHARACTER SET utf8 NOT NULL default '',"
319" MODIFY commandline text CHARACTER SET utf8 NOT NULL,"
320" MODIFY gametype varchar(64) CHARACTER SET utf8 NOT NULL default '',"
321" MODIFY extensions varchar(128) CHARACTER SET utf8 NOT NULL default '';",
322"ALTER TABLE romdb"
323" DEFAULT CHARACTER SET utf8,"
324" MODIFY crc varchar(64) CHARACTER SET utf8 NOT NULL default '',"
325" MODIFY name varchar(128) CHARACTER SET utf8 NOT NULL default '',"
326" MODIFY description varchar(128) CHARACTER SET utf8 NOT NULL default '',"
327" MODIFY category varchar(128) CHARACTER SET utf8 NOT NULL default '',"
328" MODIFY year varchar(10) CHARACTER SET utf8 NOT NULL default '',"
329" MODIFY manufacturer varchar(128) CHARACTER SET utf8 NOT NULL default '',"
330" MODIFY country varchar(128) CHARACTER SET utf8 NOT NULL default '',"
331" MODIFY publisher varchar(128) CHARACTER SET utf8 NOT NULL default '',"
332" MODIFY platform varchar(64) CHARACTER SET utf8 NOT NULL default '',"
333" MODIFY flags varchar(64) CHARACTER SET utf8 NOT NULL default '',"
334" MODIFY version varchar(64) CHARACTER SET utf8 NOT NULL default '',"
335" MODIFY binfile varchar(64) CHARACTER SET utf8 NOT NULL default '';"
336};
337
339 updates, "1014", dbver))
340 return false;
341 }
342
343 if (dbver == "1014")
344 {
345 DBUpdates updates {
346
347"ALTER TABLE gamemetadata ADD fanart VARCHAR(255) NOT NULL AFTER rompath,"
348"ADD boxart VARCHAR( 255 ) NOT NULL AFTER fanart;"
349};
350
352 updates, "1015", dbver))
353 return false;
354 }
355
356 if (dbver == "1015")
357 {
358 DBUpdates updates {
359
360"ALTER TABLE gamemetadata ADD screenshot VARCHAR(255) NOT NULL AFTER rompath,"
361"ADD plot TEXT NOT NULL AFTER fanart;"
362};
363
365 updates, "1016", dbver))
366 return false;
367 }
368
369 if (dbver == "1016")
370 {
371 DBUpdates updates {
372
373"ALTER TABLE gamemetadata ADD inetref TEXT AFTER crc_value;"
374};
375
377 updates, "1017", dbver))
378 return false;
379 }
380
381 if (dbver == "1017")
382 {
383 DBUpdates updates {
384
385"ALTER TABLE gamemetadata ADD intid int(11) NOT NULL AUTO_INCREMENT "
386"PRIMARY KEY FIRST;"
387};
388
390 updates, "1018", dbver))
391 return false;
392 }
393
394 if (dbver == "1018")
395 {
396 DBUpdates updates {
397"ALTER TABLE romdb MODIFY description varchar(192) CHARACTER SET utf8 NOT NULL default '';",
398"ALTER TABLE romdb MODIFY binfile varchar(128) CHARACTER SET utf8 NOT NULL default '';",
399"ALTER TABLE romdb MODIFY filesize int(12) unsigned default NULL;"
400};
401
403 updates, "1019", dbver))
404 return false;
405 }
406
407 // Repeat 1013 DBs pre MySQL v8 systems that may have not be set to utf8
408
409 if (dbver == "1019")
410 {
411 DBUpdates updates {
412"ALTER TABLE gamemetadata DEFAULT CHARACTER SET utf8;",
413"ALTER TABLE gameplayers DEFAULT CHARACTER SET utf8;",
414"ALTER TABLE romdb DEFAULT CHARACTER SET utf8;"
415};
416
418 updates, "1020", dbver))
419 return false;
420 }
421
422 return true;
423
424}
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:128
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:618
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:550
QString GetSetting(const QString &key, const QString &defaultval="")
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
bool performActualUpdate(const QString &component, const QString &versionkey, const DBUpdates &updates, const QString &version, QString &dbver)
const QString currentDatabaseVersion
Definition: gamedbcheck.cpp:18
static bool InitializeDatabase(void)
Definition: gamedbcheck.cpp:21
const QString MythGameVersionName
Definition: gamedbcheck.cpp:19
bool UpgradeGameDatabaseSchema(void)
Definition: gamedbcheck.cpp:87
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
MythDB * GetMythDB(void)
Definition: mythdb.cpp:51
std::vector< std::string > DBUpdates
Definition: mythdbcheck.h:9
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39