Software /
code /
prosody
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());