From fab828dae06e5be911d4b493e1b9aa838620a3cd Mon Sep 17 00:00:00 2001 From: luk3yx Date: Sat, 22 Jul 2023 11:51:54 +1200 Subject: [PATCH] Use JSON in xban.db --- init.lua | 4 ++-- serialize.lua | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 09385bd..5c052d7 100644 --- a/init.lua +++ b/init.lua @@ -346,7 +346,7 @@ local function save_db() local f, e = io.open(DB_FILENAME, "wt") db.timestamp = os.time() if f then - local ok, err = f:write(xban.serialize(db)) + local ok, err = f:write(assert(xban.serialize_db(db))) if not ok then WARNING("Unable to save database: %s", err) end @@ -368,7 +368,7 @@ local function load_db() WARNING("Unable to load database: %s", "Read failed") return end - local t, e2 = minetest.deserialize(cont) + local t, e2 = xban.deserialize_db(cont) if not t then WARNING("Unable to load database: %s", "Deserialization failed: "..(e2 or "unknown error")) diff --git a/serialize.lua b/serialize.lua index c159141..70930ba 100644 --- a/serialize.lua +++ b/serialize.lua @@ -27,5 +27,45 @@ local function my_serialize_2(t, level) end function xban.serialize(t) + minetest.log("warning", "[xban2] xban.serialize() is deprecated") return "return {\n"..my_serialize_2(t, 1).."\n}" end + +-- JSON doesn't allow combined string+number keys, this function moves any +-- number keys into an "entries" table +function xban.serialize_db(t) + local res = {} + local entries = {} + for k, v in pairs(t) do + if type(k) == "number" then + entries[k] = v + else + res[k] = v + end + end + res.entries = entries + return minetest.write_json(res, true) +end + +function xban.deserialize_db(s) + if s:sub(1, 1) ~= "{" then + -- Load legacy databases + return minetest.deserialize(s) + end + + local res, err = minetest.parse_json(s) + if not res then + return nil, err + end + + -- Remove all "null"s added by empty tables + for i, entry in ipairs(res.entries or {}) do + entry.names = entry.names or {} + entry.record = entry.record or {} + res[i] = entry + end + res.entries = nil + + return res +end +