# HG changeset patch # User Kim Alvefur # Date 1450530201 -3600 # Node ID 7821a6986e689a01f92dcfa0e0c5331aa96e316c # Parent 2ed6f6eeeaba0cc54550bf3e7c144517c8f58d65 mod_migrate: Support migrating multiple stores diff -r 2ed6f6eeeaba -r 7821a6986e68 mod_migrate/mod_migrate.lua --- a/mod_migrate/mod_migrate.lua Sat Dec 19 11:45:39 2015 +0100 +++ b/mod_migrate/mod_migrate.lua Sat Dec 19 14:03:21 2015 +0100 @@ -5,55 +5,57 @@ local mm = require"core.modulemanager"; function module.command(arg) - local host, source_store, migrate_to, user = unpack(arg); + local host, source_stores, migrate_to, user = unpack(arg); if not migrate_to then return print("Usage: prosodyctl mod_migrate example.com [-] [users]*"); end sm.initialize_host(host); um.initialize_host(host); local module = module:context(host); - local store_type = source_store:match("%-(%a+)$"); - if store_type then - source_store = source_store:sub(1, -2-#store_type); - end - local storage = module:open_store(source_store, store_type); - local target = assert(sm.load_driver(host, migrate_to)); - target = assert(target:open(source_store, store_type)); + for source_store in source_stores:gmatch("[^,]+") do + local store_type = source_store:match("%-(%a+)$"); + if store_type then + source_store = source_store:sub(1, -2-#store_type); + end + local storage = module:open_store(source_store, store_type); + local target = assert(sm.load_driver(host, migrate_to)); + target = assert(target:open(source_store, store_type)); - local function migrate_user(username) - module:log("info", "Migrating data for %s", username); - local data, err = storage:get(username); - assert(data or err==nil, err); - assert(target:set(username, data)); - end + local function migrate_user(username) + module:log("info", "Migrating data for %s", username); + local data, err = storage:get(username); + assert(data or err==nil, err); + assert(target:set(username, data)); + end - if store_type == "archive" then - function migrate_user(username) - module:log("info", "Migrating archive items for %s", username); - local count, errs = 0, 0; - for id, item, when, with in storage:find(username) do - local ok, err = target:append(username, id, item, when, with); - if ok then - count = count + 1; - else - module:log("warn", "Error: %s", err); - errs = errs + 1; + if store_type == "archive" then + function migrate_user(username) + module:log("info", "Migrating archive items for %s", username); + local count, errs = 0, 0; + for id, item, when, with in storage:find(username) do + local ok, err = target:append(username, id, item, when, with); + if ok then + count = count + 1; + else + module:log("warn", "Error: %s", err); + errs = errs + 1; + end + if ( count + errs ) % 100 == 0 then + module:log("info", "%d items migrated, %d errors", count, errs); + end end - if ( count + errs ) % 100 == 0 then - module:log("info", "%d items migrated, %d errors", count, errs); - end + module:log("info", "%d items migrated, %d errors", count, errs); end - module:log("info", "%d items migrated, %d errors", count, errs); end - end - if arg[4] then - for i = 4, #arg do - migrate_user(arg[i]); - end - else - for user in um.users(host) do - migrate_user(user); + if arg[4] then + for i = 4, #arg do + migrate_user(arg[i]); + end + else + for user in um.users(host) do + migrate_user(user); + end end end end