--[[ TechAge ======= Copyright (C) 2020 Joachim Stolberg AGPL v3 See LICENSE.txt for more information Storage backend for node related data via sqlite database ]]-- -- for lazy programmers local M = minetest.get_meta ------------------------------------------------------------------- -- Database ------------------------------------------------------------------- local WP = minetest.get_worldpath() if not techage.IE then error("Please add 'secure.trusted_mods = techage' to minetest.conf!") end local sqlite3 = techage.IE.require("lsqlite3") if not sqlite3 then error("Please install sqlite3 via 'luarocks install lsqlite3'") end local db = sqlite3.open(WP.."/techage_nodedata.sqlite") local ROW = sqlite3.ROW -- Prevent use of this db instance. if sqlite3 then sqlite3 = nil end db:exec[[ CREATE TABLE mapblocks(id INTEGER PRIMARY KEY, key INTEGER, data BLOB); CREATE UNIQUE INDEX idx ON mapblocks(key); ]] local set = db:prepare("INSERT or REPLACE INTO mapblocks VALUES(NULL, ?, ?);") local get = db:prepare("SELECT * FROM mapblocks WHERE key=?;") local function set_block(key, data) set:reset() set:bind(1, key) set:bind_blob(2, data) set:step() return true end local function get_block(key) get:reset() get:bind(1, key) if get:step() == ROW then return get:get_value(2) end end ------------------------------------------------------------------- -- API functions ------------------------------------------------------------------- local api = {} local MP = minetest.get_modpath("techage") local serialize, deserialize = dofile(MP .. "/basis/marshal.lua") function api.store_mapblock_data(key, mapblock_data) local s = serialize(mapblock_data) return set_block(key, s) end function api.get_mapblock_data(key) local s = get_block(key) if s then return deserialize(s) end api.store_mapblock_data(key, {}) return {} end function api.get_node_data(pos) -- legacy data available? local s = M(pos):get_string("ta_data") if s ~= "" then M(pos):set_string("ta_data", "") return deserialize(s) end return {} end function api.freeze_at_shutdown(data) for key, item in pairs(data) do api.store_mapblock_data(key, item) end end function api.restore_at_startup() -- nothing to restore return {} end return api