Fix some issues with migrations.

This commit is contained in:
Rob Nelson
2015-03-04 00:30:33 -08:00
parent 41d0e4e703
commit 305bcdceb0
9 changed files with 108 additions and 48 deletions

View File

@@ -11,8 +11,11 @@ CREATE TABLE IF NOT EXISTS `erro_admin` (
`level` int(2) NOT NULL DEFAULT '0',
`flags` int(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
@@ -20,8 +23,11 @@ CREATE TABLE IF NOT EXISTS `erro_admin_log` (
`adminip` varchar(18) NOT NULL,
`log` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_ban` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bantime` datetime NOT NULL,
@@ -47,8 +53,11 @@ CREATE TABLE IF NOT EXISTS `erro_ban` (
`unbanned_computerid` varchar(32) DEFAULT NULL,
`unbanned_ip` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_feedback` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time` datetime NOT NULL,
@@ -57,8 +66,11 @@ CREATE TABLE IF NOT EXISTS `erro_feedback` (
`var_value` int(16) DEFAULT NULL,
`details` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_player` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
@@ -69,8 +81,11 @@ CREATE TABLE IF NOT EXISTS `erro_player` (
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_poll_option` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pollid` int(11) NOT NULL,
@@ -82,8 +97,11 @@ CREATE TABLE IF NOT EXISTS `erro_poll_option` (
`descmid` varchar(32) DEFAULT NULL,
`descmax` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_poll_question` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`polltype` varchar(16) NOT NULL DEFAULT 'OPTION',
@@ -92,8 +110,11 @@ CREATE TABLE IF NOT EXISTS `erro_poll_question` (
`question` varchar(255) NOT NULL,
`adminonly` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_poll_textreply` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
@@ -103,8 +124,11 @@ CREATE TABLE IF NOT EXISTS `erro_poll_textreply` (
`replytext` text NOT NULL,
`adminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_poll_vote` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
@@ -115,19 +139,22 @@ CREATE TABLE IF NOT EXISTS `erro_poll_vote` (
`adminrank` varchar(32) NOT NULL,
`rating` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `erro_privacy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`ckey` varchar(32) NOT NULL,
`option` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
) ENGINE=InnoDB DEFAULT CHARSET=latin1;"}
if(!execute(sql))
return FALSE
-- -----------------------------------------------------
-- Non-erro tables.
-- -----------------------------------------------------
sql={"
CREATE TABLE IF NOT EXISTS `death` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`pod` TEXT NOT NULL COMMENT 'Place of death' ,
@@ -146,8 +173,11 @@ CREATE TABLE IF NOT EXISTS `death` (
`oxyloss` INT(11) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
DEFAULT CHARACTER SET = latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `karma` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`spendername` TEXT NOT NULL ,
@@ -161,16 +191,22 @@ CREATE TABLE IF NOT EXISTS `karma` (
`time` DATETIME NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
DEFAULT CHARACTER SET = latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `karmatotals` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`byondkey` TEXT NOT NULL ,
`karma` INT(11) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
DEFAULT CHARACTER SET = latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `library` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`author` TEXT NOT NULL ,
@@ -179,8 +215,11 @@ CREATE TABLE IF NOT EXISTS `library` (
`category` TEXT NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
DEFAULT CHARACTER SET = latin1;"}
if(!execute(sql))
return FALSE
sql={"
CREATE TABLE IF NOT EXISTS `population` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`playercount` INT(11) NULL DEFAULT NULL ,
@@ -188,6 +227,5 @@ CREATE TABLE IF NOT EXISTS `population` (
`time` DATETIME NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
"}
execute(sql)
DEFAULT CHARACTER SET = latin1;"}
return execute(sql)

View File

@@ -10,7 +10,7 @@ CREATE TABLE IF NOT EXISTS admin_sessions (
`expires` DATETIME
);
"}
execute(sql)
return execute(sql)
/datum/migration/ss13/_002/down()
execute("DROP TABLE IF EXISTS admin_sessions;");
return execute("DROP TABLE IF EXISTS admin_sessions;");

View File

@@ -4,12 +4,14 @@
/datum/migration/ss13/_003/up()
if(!hasColumn("erro_poll_question","multiplechoiceoptions"))
execute("ALTER TABLE erro_poll_question ADD COLUMN `multiplechoiceoptions` int(2) DEFAULT NULL;")
return execute("ALTER TABLE erro_poll_question ADD COLUMN `multiplechoiceoptions` int(2) DEFAULT NULL;")
else
warning("multiplechoiceoptions column exists. Skipping addition.")
return TRUE
/datum/migration/ss13/_003/down()
if(hasColumn("erro_poll_question","multiplechoiceoptions"))
execute("ALTER TABLE erro_poll_question DROP COLUMN `multiplechoiceoptions`;")
return execute("ALTER TABLE erro_poll_question DROP COLUMN `multiplechoiceoptions`;")
else
warning("multiplechoiceoptions column does not exist. Skipping drop.")
warning("multiplechoiceoptions column does not exist. Skipping drop.")
return TRUE

View File

@@ -4,12 +4,14 @@
/datum/migration/ss13/_004/up()
if(!hasColumn("admin_sessions","IP"))
execute("ALTER TABLE admin_sessions ADD COLUMN `IP` VARCHAR(255) DEFAULT NULL;");
return execute("ALTER TABLE admin_sessions ADD COLUMN `IP` VARCHAR(255) DEFAULT NULL;");
else
warning("IP column exists. Skipping addition.")
return TRUE
/datum/migration/ss13/_004/down()
if(hasColumn("admin_sessions","IP"))
execute("ALTER TABLE admin_sessions DROP COLUMN `IP`;");
return execute("ALTER TABLE admin_sessions DROP COLUMN `IP`;");
else
warning("IP column does not exist. Skipping drop.")
warning("IP column does not exist. Skipping drop.")
return TRUE

View File

@@ -4,12 +4,14 @@
/datum/migration/ss13/_005/up()
if(!hasColumn("library","ckey"))
execute("ALTER TABLE library ADD COLUMN `ckey` VARCHAR(32) NOT NULL DEFAULT '\[Unknown\]';");
return execute("ALTER TABLE library ADD COLUMN `ckey` VARCHAR(32) NULL;"); // Permit nulls, we interpret these as old values.
else
warning("ckey column exists. Skipping addition.")
return TRUE
/datum/migration/ss13/_005/down()
if(hasColumn("library","ckey"))
execute("ALTER TABLE library DROP COLUMN `ckey`;");
return execute("ALTER TABLE library DROP COLUMN `ckey`;");
else
warning("ckey column does not exist. Skipping drop.")
warning("ckey column does not exist. Skipping drop.")
return TRUE

View File

@@ -13,15 +13,18 @@
/datum/migration/proc/up()
// Make your changes here.
return
return TRUE
/datum/migration/proc/down()
// Undo your changes here (for rollbacks)
return
return TRUE
// Helpers
/datum/migration/proc/query(var/sql)
var/DBQuery/query = execute(sql)
var/DBQuery/query = db.NewQuery(sql)
if(!query.Execute())
world.log << "Error in [package]#[id]: [query.ErrorMsg()]"
return FALSE
var/list/rows=list()
while(query.NextRow())
@@ -29,7 +32,10 @@
return rows
/datum/migration/proc/hasResult(var/sql)
var/DBQuery/query = execute(sql)
var/DBQuery/query = db.NewQuery(sql)
if(!query.Execute())
world.log << "Error in [package]#[id]: [query.ErrorMsg()]"
return FALSE
if (query.NextRow())
return TRUE
@@ -37,8 +43,10 @@
/datum/migration/proc/execute(var/sql)
var/DBQuery/query = db.NewQuery(sql)
query.Execute()
return query
if(!query.Execute())
world.log << "Error in [package]#[id]: [query.ErrorMsg()]"
return FALSE
return TRUE
/datum/migration/proc/hasTable(var/tableName)
return hasResult("SHOW TABLES LIKE '[tableName]'")

View File

@@ -21,7 +21,7 @@ var/global/datum/migration_controller/migration_controller = null
if(!hasTable(TABLE_NAME))
var/tableSQL = {"
CREATE TABLE [TABLE_NAME] (
CREATE TABLE IF NOT EXISTS [TABLE_NAME] (
pkgID VARCHAR(15) PRIMARY KEY, -- Implies NOT NULL
version INT(11) NOT NULL
);
@@ -31,6 +31,7 @@ CREATE TABLE [TABLE_NAME] (
Q.Close()
Q = db.NewQuery("SELECT pkgID, version FROM [TABLE_NAME]")
Q.Execute()
while(Q.NextRow())
db_states[Q.item[1]] = text2num(Q.item[2])
@@ -38,7 +39,7 @@ CREATE TABLE [TABLE_NAME] (
for(var/mtype in typesof(/datum/migration)-/datum/migration)
var/datum/migration/M = new mtype()
M.db = db
if(M.package == "") continue
if(M.package == "" || M.name == "") continue
if(!(M.package in newpacks))
newpacks[M.package]=list()
var/list/pack = newpacks[M.package]
@@ -50,8 +51,9 @@ CREATE TABLE [TABLE_NAME] (
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 << "Loaded [pack.len] DB migrations from package [pkgID]."
world.log << "\[Migrations] Loaded [pack.len] DB migrations from package [pkgID]."
//VersionCheck()
UpdateAll()
@@ -64,12 +66,14 @@ CREATE TABLE [TABLE_NAME] (
/datum/migration_controller/proc/VersionCheck()
for(var/pkgID in packages)
var/currentVersion = getCurrentVersion(pkgID)
var/latestVersionAvail = 0
for(var/datum/migration/M in packages[pkgID])
if(M.id > latestVersionAvail)
latestVersionAvail = M.id
if(latestVersionAvail > getCurrentVersion())
world.log << "*** [pkgID] is behind [latestVersionAvail-db_states[pkgID]] versions!"
//world.log << "\[Migrations] Package [pkgID]: Current: [currentVersion], Avail: [latestVersionAvail]"
if(latestVersionAvail > currentVersion)
world.log << "\[Migrations] *** [pkgID] is behind [latestVersionAvail-currentVersion] versions!"
/datum/migration_controller/proc/UpdateAll()
for(var/pkgID in packages)
@@ -88,16 +92,20 @@ CREATE TABLE [TABLE_NAME] (
for(var/datum/migration/M in packages[pkgID])
if(M.id > to_version)
to_version = M.id
var/log_text = "<b>Updating [pkgID] from [from_version] to [to_version]...</b>"
if(from_version == to_version)
world.log << "\[Migrations] [pkgID] is up to date."
return
world.log << "\[Migrations] Updating [pkgID] from [from_version] to [to_version]..."
for(var/datum/migration/M in package)
if(M.id > from_version && M.id <= to_version)
if(!M.up())
world << "[log_text] <span style='font-weight:bold;color:red;'>FAIL</span><br>Failed to process migration [pkgID] #[M.id]!"
//world << "[log_text] <span style='font-weight:bold;color:red;'>FAIL</span><br>Failed to process migration [pkgID] #[M.id]!"
world.log << "Failed to process migration [pkgID] #[M.id]"
return FALSE
else
M.execute("REPLACE INTO [TABLE_NAME] (pkgID,version) VALUES ('[pkgID]',[M.id])")
world << "[log_text] <span style='color:green;font-weight:bold;'>OK</span>"
world.log << "\[Migrations] Successfully applied [pkgID]#[M.id] ([M.name])"
world.log << "\[Migrations] Done!"
return TRUE
/datum/migration_controller/proc/query(var/sql)