aboutsummaryrefslogtreecommitdiffstats
path: root/tools/migration/migrator
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2017-04-07 13:17:00 +0200
committerKim Alvefur <zash@zash.se>2017-04-07 13:17:00 +0200
commitf345e640e57e716ccfd94c3eec2a77670e932936 (patch)
tree110d9a1de9ff68d1a9de9b84555106d740e8f974 /tools/migration/migrator
parent5192599730ab118279aef03370a7e5d0f171fd0e (diff)
downloadprosody-f345e640e57e716ccfd94c3eec2a77670e932936.tar.gz
prosody-f345e640e57e716ccfd94c3eec2a77670e932936.zip
migrator/prosody_sql: Abort and demand database be upgraded if it needs to be (#635)
Diffstat (limited to 'tools/migration/migrator')
-rw-r--r--tools/migration/migrator/prosody_sql.lua33
1 files changed, 32 insertions, 1 deletions
diff --git a/tools/migration/migrator/prosody_sql.lua b/tools/migration/migrator/prosody_sql.lua
index eb203a71..2dd07bdc 100644
--- a/tools/migration/migrator/prosody_sql.lua
+++ b/tools/migration/migrator/prosody_sql.lua
@@ -84,8 +84,36 @@ local function decode_user(item)
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 @@ end
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());