diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 98e93c4592b..4190b8c9b95 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -10,6 +10,8 @@ //if a file can't be updated, return 0 to delete it and start again //if a file was updated, return 1 +/// IF YOU NEED A FIELD ADDED TO THE DATABASE, CREATE A MIGRATION SO SHIT GETS UPDATED. +/// SEE code/modules/migrations/SS13_Prefs/ /datum/preferences/proc/savefile_update() //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/preferences/proc/savefile_update() called tick#: [world.time]") diff --git a/code/modules/migrations/SS13_Prefs/001-create.dm b/code/modules/migrations/SS13_Prefs/001-create.dm index 05fdc16d133..983d6aba6d7 100644 --- a/code/modules/migrations/SS13_Prefs/001-create.dm +++ b/code/modules/migrations/SS13_Prefs/001-create.dm @@ -3,7 +3,33 @@ name = "Initial State" /datum/migration/sqlite/ss13_prefs/_001/up() - var/sql={"CREATE TABLE `body` ( + + var/sql={"CREATE TABLE `players` ( + `ID` INTEGER PRIMARY KEY AUTOINCREMENT, + `player_ckey` TEXT NOT NULL, + `player_slot` INTEGER NOT NULL, + `ooc_notes` TEXT, + `real_name` TEXT, + `random_name` INTEGER, + `gender` TEXT, + `age` INTEGER, + `species` TEXT, + `language` TEXT, + `flavor_text` TEXT, + `med_record` TEXT, + `sec_record` TEXT, + `gen_record` TEXT, + `player_alt_titles` TEXT, + `be_special` TEXT, + `disabilities` INTEGER, + `nanotrasen_relation` TEXT, + UNIQUE(player_ckey, player_slot) +);"} + if(!hasTable("players")) + if(!execute(sql)) + return FALSE + + sql={"CREATE TABLE `body` ( `ID` INTEGER PRIMARY KEY AUTOINCREMENT, `player_ckey` TEXT NOT NULL, `player_slot` INTEGER NOT NULL, @@ -50,31 +76,6 @@ if(!execute(sql)) return FALSE - sql={"CREATE TABLE `players` ( - `ID` INTEGER PRIMARY KEY AUTOINCREMENT, - `player_ckey` TEXT NOT NULL, - `player_slot` INTEGER NOT NULL, - `ooc_notes` TEXT, - `real_name` TEXT, - `random_name` INTEGER, - `gender` TEXT, - `age` INTEGER, - `species` TEXT, - `language` TEXT, - `flavor_text` TEXT, - `med_record` TEXT, - `sec_record` TEXT, - `gen_record` TEXT, - `player_alt_titles` TEXT, - `be_special` TEXT, - `disabilities` INTEGER, - `nanotrasen_relation` TEXT, - UNIQUE(player_ckey, player_slot) -);"} - if(!hasTable("players")) - if(!execute(sql)) - return FALSE - sql={"CREATE TABLE `client_roles` ( `ckey` TEXT NOT NULL, diff --git a/code/modules/migrations/migration_controller.dm b/code/modules/migrations/migration_controller.dm index f359660550b..3bc5803d39d 100644 --- a/code/modules/migrations/migration_controller.dm +++ b/code/modules/migrations/migration_controller.dm @@ -6,39 +6,44 @@ var/id = "" /datum/migration_controller/proc/setup() - return + return FALSE /datum/migration_controller/proc/createMigrationTable() - return + return FALSE /datum/migration_controller/New() - if(!setup()) return + if(!setup()) + world.log << "\[Migrations] ([id]): Setup() returned false, will not run migrations for this DBMS." + else + if(!hasTable(TABLE_NAME)) + world.log << "\[Migrations] ([id]): Creating [TABLE_NAME]" + createMigrationTable() - if(!hasTable(TABLE_NAME)) - createMigrationTable() + for(var/list/row in query("SELECT pkgID, version FROM [TABLE_NAME]")) + if(id=="mysql") + db_states[row[1]] = text2num(row[2]) + else + db_states[row["pkgID"]] = text2num(row["version"]) - for(var/list/row in query("SELECT pkgID, version FROM [TABLE_NAME]")) - db_states[row[1]] = text2num(row[2]) - - var/list/newpacks[0] - for(var/mtype in typesof(/datum/migration)-list(/datum/migration)) - var/datum/migration/M = new mtype(src) - if(M.package == "" || M.name == "" || M.dbms != id) continue - if(!(M.package in newpacks)) - newpacks[M.package]=list() - var/list/pack = newpacks[M.package] - pack += M - for(var/pkgID in newpacks) - if(!(pkgID in packages)) - packages[pkgID]=list() - var/list/prepack = newpacks[pkgID] - var/list/pack[prepack.len] - for(var/datum/migration/M in newpacks[pkgID]) - pack[M.id] = M - //world.log << "\[Migrations] [pkgID]#[M.id] = [M.type] - [M.name]" - packages[pkgID]=pack - world.log << "\[Migrations] Loaded [pack.len] [id] DB migrations from package [pkgID]." - //VersionCheck() - UpdateAll() + var/list/newpacks[0] + for(var/mtype in typesof(/datum/migration)-list(/datum/migration)) + var/datum/migration/M = new mtype(src) + if(M.package == "" || M.name == "" || M.dbms != id) continue + if(!(M.package in newpacks)) + newpacks[M.package]=list() + var/list/pack = newpacks[M.package] + pack += M + for(var/pkgID in newpacks) + if(!(pkgID in packages)) + packages[pkgID]=list() + var/list/prepack = newpacks[pkgID] + var/list/pack[prepack.len] + for(var/datum/migration/M in newpacks[pkgID]) + pack[M.id] = M + //world.log << "\[Migrations] [pkgID]#[M.id] = [M.type] - [M.name]" + packages[pkgID]=pack + world.log << "\[Migrations] Loaded [pack.len] [id] DB migrations from package [pkgID]." + //VersionCheck() + UpdateAll() /datum/migration_controller/proc/getCurrentVersion(var/pkgID) //writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/datum/migration_controller/proc/getCurrentVersion() called tick#: [world.time]") diff --git a/code/modules/migrations/mysql/mysql_controller.dm b/code/modules/migrations/mysql/mysql_controller.dm index 042590f338d..6ed7e964f72 100644 --- a/code/modules/migrations/mysql/mysql_controller.dm +++ b/code/modules/migrations/mysql/mysql_controller.dm @@ -5,13 +5,16 @@ var/global/datum/migration_controller/mysql/migration_controller_mysql = null var/DBConnection/db /datum/migration_controller/mysql/setup() - - // Change this if needed. - db = dbcon - ///////////////////////// - - if(!db || !db.IsConnected()) + if(!dbcon || !istype(dbcon) || !dbcon.IsConnected()) + testing("Something wrong with dbcon.") return FALSE + var/DBQuery/Q = dbcon.NewQuery() + if(!Q) + testing("Something wrong with dbcon.NewQuery()") + return FALSE + Q.Close() + testing("MySQL is okay") + db = dbcon return TRUE /datum/migration_controller/mysql/createMigrationTable() diff --git a/code/modules/migrations/sqlite/sqlite_controller.dm b/code/modules/migrations/sqlite/sqlite_controller.dm index a689fd5891a..a3b830b0b15 100644 --- a/code/modules/migrations/sqlite/sqlite_controller.dm +++ b/code/modules/migrations/sqlite/sqlite_controller.dm @@ -1,36 +1,75 @@ var/global/datum/migration_controller/sqlite/migration_controller_sqlite = null +//#define DEBUG_SQLITE_MIGCON + +#ifdef DEBUG_SQLITE_MIGCON +#define _DEBUG(a,b) testing("\[Migrations\] (sqlite) - [a](): [b]") +#else +#define _DEBUG(a,b) +#endif + /datum/migration_controller/sqlite id = "sqlite" var/dbfilename = "" // Name of DB var/empty_dbfilename = "" -/datum/migration_controller/sqlite/execute(var/sql) - var/database/query/Q = new() - Q.Add(sql) - return Q.Execute(dbfilename) +/datum/migration_controller/sqlite/New(var/dbfile, var/cleandbfile) + dbfilename=dbfile + empty_dbfilename=cleandbfile + ..() -/datum/migration_controller/sqlite/query(var/sql) +/datum/migration_controller/sqlite/setup() + if(!fexists("players2.sqlite") && fexists("players2_empty.sqlite")) + fcopy("players2_empty.sqlite", "players2.sqlite") + return TRUE + +/datum/migration_controller/sqlite/createMigrationTable() + var/tableSQL = {" +CREATE TABLE IF NOT EXISTS [TABLE_NAME] ( + pkgID TEXT NOT NULL, + version INTEGER NOT NULL, + PRIMARY KEY(pkgID) +); + "} + execute(tableSQL) + +/datum/migration_controller/sqlite/execute(var/sql) + _DEBUG("execute",sql) var/database/query/Q = new() Q.Add(sql) if(!Q.Execute(dbfilename)) + warning("Error in migration controller ([id]): [Q.ErrorMsg()]") + return FALSE + return TRUE + +/datum/migration_controller/sqlite/query(var/sql) + _DEBUG("query",sql) + var/database/query/Q = new() + Q.Add(sql) + if(!Q.Execute(dbfilename)) + warning("Error in migration controller ([id]): [Q.ErrorMsg()]") return null var/list/O=list() while(Q.NextRow()) O += list(Q.GetRowData()) - if(!O.len) - return null return O /datum/migration_controller/sqlite/hasResult(var/sql) + _DEBUG("hasResult",sql) var/database/query/Q = new() Q.Add(sql) if(!Q.Execute(dbfilename)) + warning("Error in migration controller ([id]): [Q.ErrorMsg()]") return FALSE if (Q.NextRow()) return TRUE return FALSE /datum/migration_controller/sqlite/hasTable(var/tableName) - return hasResult("SELECT name FROM sqlite_master WHERE type='[tableName]'") \ No newline at end of file + return hasResult("SELECT name FROM sqlite_master WHERE type='[tableName]'") + +#ifdef DEBUG_SQLITE_MIGCON +#undef _DEBUG +#undef DEBUG_SQLITE_MIGCON +#endif diff --git a/code/modules/migrations/sqlite/sqlite_migration.dm b/code/modules/migrations/sqlite/sqlite_migration.dm index 54857f11eba..25d6d5ed437 100644 --- a/code/modules/migrations/sqlite/sqlite_migration.dm +++ b/code/modules/migrations/sqlite/sqlite_migration.dm @@ -11,6 +11,7 @@ var/database/query/Q = new() Q.Add(sql) if(!Q.Execute(dbfilename)) + world.log << sql world.log << "Error in [package]#[id]: [Q.ErrorMsg()]" return null var/list/O=list() @@ -24,6 +25,7 @@ var/database/query/Q = new() Q.Add(sql) if(!Q.Execute(dbfilename)) + world.log << sql world.log << "Error in [package]#[id]: [Q.ErrorMsg()]" return FALSE return Q.NextRow() @@ -32,6 +34,7 @@ var/database/query/Q = new() Q.Add(sql) if(!Q.Execute(dbfilename)) + world.log << sql world.log << "Error in [package]#[id]: [Q.ErrorMsg()]" return FALSE return TRUE diff --git a/code/world.dm b/code/world.dm index 2c6f1a0bc44..1b0491bdee1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -101,10 +101,11 @@ var/savefile/panicfile if(!setup_database_connection()) world.log << "Your server failed to establish a connection with the feedback database." + dbcon = null else world.log << "Feedback database connection established." migration_controller_mysql = new - migration_controller_sqlite = new + migration_controller_sqlite = new ("players2.sqlite", "players2_empty.sqlite") if(!setup_old_database_connection()) world.log << "Your server failed to establish a connection with the tgstation database."