Changeset

8064:ffb36d1ae23b

migrator/prosody_sql: Abort and demand database be upgraded if it needs to be (#635)
author Kim Alvefur <zash@zash.se>
date Fri, 07 Apr 2017 13:17:00 +0200
parents 8063:605fa6bfafd1
children 8065:36d9c1226fbc 8066:5eec340c75fb
files tools/migration/migrator/prosody_sql.lua
diffstat 1 files changed, 32 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/tools/migration/migrator/prosody_sql.lua	Fri Apr 07 13:16:12 2017 +0200
+++ b/tools/migration/migrator/prosody_sql.lua	Fri Apr 07 13:17:00 2017 +0200
@@ -84,8 +84,36 @@
 	return userdata;
 end
 
+local function needs_upgrade(engine, params)
+	if params.driver == "MySQL" then
+		local success = engine:transaction(function()
+			local result = engine:execute("SHOW COLUMNS FROM prosody WHERE Field='value' and Type='text'");
+			assert(result:rowcount() == 0);
+
+			-- COMPAT w/pre-0.10: Upgrade table to UTF-8 if not already
+			local check_encoding_query = [[
+			SELECT `COLUMN_NAME`,`COLUMN_TYPE`,`TABLE_NAME`
+			FROM `information_schema`.`columns`
+			WHERE `TABLE_NAME` LIKE 'prosody%%' AND ( `CHARACTER_SET_NAME`!='%s' OR `COLLATION_NAME`!='%s_bin' );
+			]];
+			check_encoding_query = check_encoding_query:format(engine.charset, engine.charset);
+			local result = engine:execute(check_encoding_query);
+			assert(result:rowcount() == 0)
+		end);
+		if not success then
+			-- Upgrade required
+			return true;
+		end
+	end
+	return false;
+end
+
 local function reader(input)
-	local engine = assert(sql:create_engine(input);
+	local engine = assert(sql:create_engine(input, function (engine) -- luacheck: ignore 431/engine
+		if needs_upgrade(engine, input) then
+			error("Old database format detected. Please run: prosodyctl mod_storage_sql upgrade");
+		end
+	end));
 	local keys = {"host", "user", "store", "key", "type", "value"};
 	assert(engine:connect());
 	local f,s,val = assert(engine:select("SELECT `host`, `user`, `store`, `key`, `type`, `value` FROM `prosody`;"));
@@ -123,6 +151,9 @@
 
 local function writer(output, iter)
 	local engine = assert(sql:create_engine(output, function (engine) -- luacheck: ignore 431/engine
+		if needs_upgrade(engine, output) then
+			error("Old database format detected. Please run: prosodyctl mod_storage_sql upgrade");
+		end
 		create_table(engine);
 	end));
 	assert(engine:connect());