mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 18:32:03 +00:00
Fix broken database migrations for SQLite and muhsql
This commit is contained in:
@@ -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]")
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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]'")
|
||||
return hasResult("SELECT name FROM sqlite_master WHERE type='[tableName]'")
|
||||
|
||||
#ifdef DEBUG_SQLITE_MIGCON
|
||||
#undef _DEBUG
|
||||
#undef DEBUG_SQLITE_MIGCON
|
||||
#endif
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
Reference in New Issue
Block a user