Fix broken database migrations for SQLite and muhsql

This commit is contained in:
Rob Nelson
2015-08-25 13:28:11 -07:00
parent 114405c646
commit 5237ad4cd5
7 changed files with 123 additions and 69 deletions

View File

@@ -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]")

View File

@@ -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,

View File

@@ -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]")

View File

@@ -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()

View File

@@ -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

View File

@@ -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