From 135205d368b2ba478ef215aec4ba5dfa27aba1aa Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sun, 31 May 2015 17:36:15 +0200 Subject: [PATCH 1/3] Implement migrations; fix #153 --- .../migrations/servatrice_0000_to_0001.sql | 13 +++++++++++++ servatrice/servatrice.sql | 11 +++++++++++ .../src/servatrice_database_interface.cpp | 19 +++++++++++++++++++ .../src/servatrice_database_interface.h | 2 ++ 4 files changed, 45 insertions(+) create mode 100644 servatrice/migrations/servatrice_0000_to_0001.sql diff --git a/servatrice/migrations/servatrice_0000_to_0001.sql b/servatrice/migrations/servatrice_0000_to_0001.sql new file mode 100644 index 00000000..a59f9afc --- /dev/null +++ b/servatrice/migrations/servatrice_0000_to_0001.sql @@ -0,0 +1,13 @@ +-- Servatrice db migration from version 0 to version 1 + +-- FIX #153 +CREATE TABLE IF NOT EXISTS `cockatrice_schema_version` ( + `version` int(7) unsigned NOT NULL, + PRIMARY KEY (`version`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO cockatrice_schema_version VALUES(1); + +-- FIX #1119 +ALTER TABLE `cockatrice_rooms_gametypes` DROP PRIMARY KEY; +ALTER TABLE `cockatrice_rooms_gametypes` ADD KEY (`id_room`); diff --git a/servatrice/servatrice.sql b/servatrice/servatrice.sql index 41efdf25..3dc10831 100644 --- a/servatrice/servatrice.sql +++ b/servatrice/servatrice.sql @@ -11,6 +11,17 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; +-- Every time the database schema changes, the schema version number +-- must be incremented. Also remember to update the corresponding +-- number in servatrice/src/servatrice_database_interface.h + +CREATE TABLE IF NOT EXISTS `cockatrice_schema_version` ( + `version` int(7) unsigned NOT NULL, + PRIMARY KEY (`version`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO cockatrice_schema_version VALUES(1); + CREATE TABLE IF NOT EXISTS `cockatrice_decklist_files` ( `id` int(7) unsigned zerofill NOT NULL auto_increment, `id_folder` int(7) unsigned zerofill NOT NULL, diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index b2027709..722ddf99 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -60,6 +60,25 @@ bool Servatrice_DatabaseInterface::openDatabase() return false; } + QSqlQuery *versionQuery = prepareQuery("select version from {prefix}_schema_version limit 1"); + if (!execSqlQuery(versionQuery)) { + qCritical() << QString("[%1] Error opening database: unable to load database schema version (hint: ensure the cockatrice_schema_version exists)").arg(poolStr); + return false; + } + + if (versionQuery->next()) { + const int dbversion = versionQuery->value(0).toInt(); + const int expectedversion = DATABASE_SCHEMA_VERSION; + if(dbversion != expectedversion) + { + qCritical() << QString("[%1] Error opening database: the database schema version is too old, yum need to run the migrations to update it from version %2 to version %3").arg(poolStr).arg(dbversion).arg(expectedversion); + return false; + } + } else { + qCritical() << QString("[%1] Error opening database: unable to load database schema version (hint: ensure the cockatrice_schema_version contains a single record)").arg(poolStr); + return false; + } + // reset all prepared statements qDeleteAll(preparedStatements); preparedStatements.clear(); diff --git a/servatrice/src/servatrice_database_interface.h b/servatrice/src/servatrice_database_interface.h index d7715544..10770691 100644 --- a/servatrice/src/servatrice_database_interface.h +++ b/servatrice/src/servatrice_database_interface.h @@ -9,6 +9,8 @@ #include "server.h" #include "server_database_interface.h" +#define DATABASE_SCHEMA_VERSION 1 + class Servatrice; class Servatrice_DatabaseInterface : public Server_DatabaseInterface { From 0688dce4498d592a2c147ef07046c772c47cc973 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Mon, 1 Jun 2015 14:48:38 +0200 Subject: [PATCH 2/3] Sql: Added "IF NOT EXISTS" where missing --- servatrice/servatrice.sql | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/servatrice/servatrice.sql b/servatrice/servatrice.sql index 3dc10831..0704b05d 100644 --- a/servatrice/servatrice.sql +++ b/servatrice/servatrice.sql @@ -89,7 +89,7 @@ CREATE TABLE IF NOT EXISTS `cockatrice_users` ( KEY `email` (`email`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_uptime` ( +CREATE TABLE IF NOT EXISTS `cockatrice_uptime` ( `id_server` tinyint(3) NOT NULL, `timest` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `uptime` int(11) NOT NULL, @@ -100,14 +100,14 @@ CREATE TABLE `cockatrice_uptime` ( PRIMARY KEY (`timest`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_servermessages` ( +CREATE TABLE IF NOT EXISTS `cockatrice_servermessages` ( `id_server` tinyint(3) not null default 0, `timest` datetime NOT NULL default '0000-00-00 00:00:00', `message` text, PRIMARY KEY (`timest`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_ignorelist` ( +CREATE TABLE IF NOT EXISTS `cockatrice_ignorelist` ( `id_user1` int(7) unsigned NOT NULL, `id_user2` int(7) unsigned NOT NULL, UNIQUE KEY `key` (`id_user1`, `id_user2`), @@ -115,7 +115,7 @@ CREATE TABLE `cockatrice_ignorelist` ( KEY `id_user2` (`id_user2`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_buddylist` ( +CREATE TABLE IF NOT EXISTS `cockatrice_buddylist` ( `id_user1` int(7) unsigned NOT NULL, `id_user2` int(7) unsigned NOT NULL, UNIQUE KEY `key` (`id_user1`, `id_user2`), @@ -123,7 +123,7 @@ CREATE TABLE `cockatrice_buddylist` ( KEY `id_user2` (`id_user2`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_bans` ( +CREATE TABLE IF NOT EXISTS `cockatrice_bans` ( `user_name` varchar(255) NOT NULL, `ip_address` varchar(255) NOT NULL, `id_admin` int(7) unsigned zerofill NOT NULL, @@ -136,7 +136,7 @@ CREATE TABLE `cockatrice_bans` ( KEY `ip_address` (`ip_address`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_sessions` ( +CREATE TABLE IF NOT EXISTS `cockatrice_sessions` ( `id` int(9) NOT NULL AUTO_INCREMENT, `user_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `id_server` tinyint(3) NOT NULL, @@ -147,7 +147,7 @@ CREATE TABLE `cockatrice_sessions` ( KEY `username` (`user_name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -CREATE TABLE `cockatrice_servers` ( +CREATE TABLE IF NOT EXISTS `cockatrice_servers` ( `id` mediumint(8) unsigned NOT NULL, `ssl_cert` text COLLATE utf8_unicode_ci NOT NULL, `hostname` varchar(255) COLLATE utf8_unicode_ci NOT NULL, @@ -157,7 +157,7 @@ CREATE TABLE `cockatrice_servers` ( PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_replays` ( +CREATE TABLE IF NOT EXISTS `cockatrice_replays` ( `id` int(7) NOT NULL AUTO_INCREMENT, `id_game` int(7) NOT NULL, `duration` int(7) NOT NULL, @@ -166,7 +166,7 @@ CREATE TABLE `cockatrice_replays` ( KEY `id_game` (`id_game`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -CREATE TABLE `cockatrice_replays_access` ( +CREATE TABLE IF NOT EXISTS `cockatrice_replays_access` ( `id_game` int(7) NOT NULL, `id_player` int(7) NOT NULL, `replay_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, From 25a202b6fcdc0c5cc5da7d428cc5ab030d254cbb Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Wed, 3 Jun 2015 08:38:50 +0200 Subject: [PATCH 3/3] Typo --- servatrice/src/servatrice_database_interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index 722ddf99..bfbbcd00 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -71,7 +71,7 @@ bool Servatrice_DatabaseInterface::openDatabase() const int expectedversion = DATABASE_SCHEMA_VERSION; if(dbversion != expectedversion) { - qCritical() << QString("[%1] Error opening database: the database schema version is too old, yum need to run the migrations to update it from version %2 to version %3").arg(poolStr).arg(dbversion).arg(expectedversion); + qCritical() << QString("[%1] Error opening database: the database schema version is too old, you need to run the migrations to update it from version %2 to version %3").arg(poolStr).arg(dbversion).arg(expectedversion); return false; } } else {