Software /
code /
prosody-modules
Changeset
1985:7821a6986e68
mod_migrate: Support migrating multiple stores
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 19 Dec 2015 14:03:21 +0100 |
parents | 1984:2ed6f6eeeaba |
children | 1986:9e268b4fba08 |
files | mod_migrate/mod_migrate.lua |
diffstat | 1 files changed, 39 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- 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 <source-store>[-<store-type>] <target-driver> [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