From 48fa4b04f80dcacc9c7ba083644d81b93cd549d7 Mon Sep 17 00:00:00 2001 From: BuckarooBanzay Date: Wed, 29 Mar 2023 08:24:56 +0200 Subject: [PATCH] add v1 and v2 player db examples and migration test --- init.lua | 1 + migrate.lua | 62 ++++++++++++++++++++-------------------- migrate.spec.lua | 28 ++++++++++++++++++ test/Dockerfile | 7 +++++ test/auth.sqlite | Bin 0 -> 24576 bytes test/mail.db | 1 + test/old_v2_player.json | 1 + 7 files changed, 69 insertions(+), 31 deletions(-) create mode 100644 migrate.spec.lua create mode 100644 test/auth.sqlite create mode 100644 test/mail.db create mode 100644 test/old_v2_player.json diff --git a/init.lua b/init.lua index 569df95..446e7fc 100644 --- a/init.lua +++ b/init.lua @@ -58,6 +58,7 @@ mail.migrate() if minetest.get_modpath("mtt") then dofile(MP .. "/mtt.lua") dofile(MP .. "/api.spec.lua") + dofile(MP .. "/migrate.spec.lua") dofile(MP .. "/util/uuid.spec.lua") dofile(MP .. "/util/normalize.spec.lua") end diff --git a/migrate.lua b/migrate.lua index 5fe0838..5378686 100644 --- a/migrate.lua +++ b/migrate.lua @@ -11,26 +11,24 @@ local function migrate_v1_to_v3() file:close() for name, oldmessages in pairs(oldmails) do + print("[mail,v1] + migrating player '" .. name .. "'") local entry = mail.get_storage_entry(name) for _, msg in ipairs(oldmessages) do - if msg.to then - table.insert(entry.inbox, { - id = mail.new_uuid(), - from = msg.sender or msg.from, - to = msg.to, - subject = msg.subject, - body = msg.body, - time = msg.time, - }) - end + table.insert(entry.inbox, { + id = mail.new_uuid(), + from = msg.sender or msg.from, + to = msg.to or name, + subject = msg.subject, + body = msg.body, + time = msg.time or os.time(), + }) end mail.set_storage_entry(name, entry) end -- rename file - print("[mail] migration done, renaming old mail.db") + print("[mail,v1] migration done, renaming old mail.db") os.rename(minetest.get_worldpath().."/mail.db", minetest.get_worldpath().."/mail.db.old") - mail.storage:set_int(STORAGE_VERSION_KEY, 3) end local function read_json_file(path) @@ -62,37 +60,39 @@ local function migrate_v2_to_v3() local saneplayername = string.gsub(playername, "[.|/]", "") local player_inbox = read_json_file(maildir .. "/" .. saneplayername .. ".json") + print("[mail,v2] + migrating player '" .. playername .. "'") for _, msg in ipairs(player_inbox) do - if msg.to then - table.insert(entry.inbox, { - id = mail.new_uuid(), - from = msg.sender or msg.from, - to = msg.to, - cc = msg.cc, - subject = msg.subject, - body = msg.body, - time = msg.time, - }) - end + table.insert(entry.inbox, { + id = mail.new_uuid(), + from = msg.sender or msg.from, + to = msg.to or playername, + cc = msg.cc, + subject = msg.subject, + body = msg.body, + time = msg.time or os.time(), + }) end mail.set_storage_entry(playername, entry) end - print("[mail] migration done") - mail.storage:set_int(STORAGE_VERSION_KEY, 3) + print("[mail,v2] migration done") end) end function mail.migrate() - local v1_file = io.open(minetest.get_worldpath().."/mail.db", "r") - if v1_file then - -- v1 to v3 - migrate_v1_to_v3() - end - + -- check for v2 storage first, v1-migration might have set the v3-flag already local version = mail.storage:get_int(STORAGE_VERSION_KEY) if version < 3 then -- v2 to v3 migrate_v2_to_v3() + mail.storage:set_int(STORAGE_VERSION_KEY, 3) + end + + -- check for v1 storage + local v1_file = io.open(minetest.get_worldpath().."/mail.db", "r") + if v1_file then + -- v1 to v3 + migrate_v1_to_v3() + mail.storage:set_int(STORAGE_VERSION_KEY, 3) end end \ No newline at end of file diff --git a/migrate.spec.lua b/migrate.spec.lua new file mode 100644 index 0000000..b98341b --- /dev/null +++ b/migrate.spec.lua @@ -0,0 +1,28 @@ + +mtt.register("migrate v1", function(callback) + local entry = mail.get_storage_entry("old_v1_player") + assert(entry) + assert(#entry.inbox == 1) + assert(entry.inbox[1].from == "singleplayer") + assert(entry.inbox[1].to == "old_v1_player") + assert(entry.inbox[1].subject == "test1") + assert(entry.inbox[1].body == "test2") + assert(entry.inbox[1].id) + assert(entry.inbox[1].time > 0) + + callback() +end) + +mtt.register("migrate v2", function(callback) + local entry = mail.get_storage_entry("old_v2_player") + assert(entry) + assert(#entry.inbox == 1) + assert(entry.inbox[1].from == "someone-else") + assert(entry.inbox[1].to == "old_v2_player") + assert(entry.inbox[1].subject == "test1") + assert(entry.inbox[1].body == "test2") + assert(entry.inbox[1].id) + assert(entry.inbox[1].time == 1678467148) + + callback() +end) \ No newline at end of file diff --git a/test/Dockerfile b/test/Dockerfile index 6324d80..9c1bd1b 100644 --- a/test/Dockerfile +++ b/test/Dockerfile @@ -1,6 +1,13 @@ ARG ENGINE_VERSION=5.5.0 FROM registry.gitlab.com/minetest/minetest/server:${ENGINE_VERSION} +# copy old v1 maildb for migration testing +COPY ./mail.db /root/.minetest/worlds/world/mail.db +# copy old v2 mail-dir and auth.sqlite for migration testing +COPY ./old_v2_player.json /root/.minetest/worlds/world/mails/ +COPY ./auth.sqlite /root/.minetest/worlds/world/auth.sqlite + + USER root RUN apk add git &&\ mkdir -p /root/.minetest/worlds/world/worldmods/ &&\ diff --git a/test/auth.sqlite b/test/auth.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..e6bac678961e4173f3ec4f2b0d1ec9de9104ccb6 GIT binary patch literal 24576 zcmeI(O>g2x7zc102wAqxvQiaMsanZW4heG97|0u{D%Cc_OTZ@BIEGxn0Rsku12zP> z?Nf4(ofLS_S8cU?Xh;$L>r_?J@m4x|7ga{jAur}Z+v-pQEL^;Gnt+<8yg;z zpurBaf3rOA{@lR2=u zhs@)+q*#^Jy2AS_FuhUB>N5GNLP`bsVQi97NS-J}7KzFjb8iqVkYuVdlOq-4?@Z)X zks-z3qVlSIN@4MWE!^@4SdBf%|o1~Gk z7Q8j<5A3s!Ja(H|kChh{tvZ``J2#_}He0eIWo1sKRM{A3y|l1esmsoBddZcBjkBtn ztrl;W77?8?=L&)_>Zn4E*9BR&`;EI{uh&?gn{0i`YHUxM=tm7cEm_>ETDquP1+g}C z7M1kTNX?7s)XC~bE2a3H#IEa$t5wgNb6hP~JC zs9j0!G*{@?nl<~F>-0&6y;@7$>U23N_Jod5x+QFFy%P0#aolu<3#mVyk+L#AP2Y9* ze*Na9f3kG^56aI-5P$##AOHafKmY;|fB*y_009Vm9s;k!`>`jVx!iyMAODN;GZF+K z009U<00Izz00bZa0SG_<0-u+_HXYuL1%Ctx;{Q