49 lines
1.3 KiB
Lua
49 lines
1.3 KiB
Lua
|
--[[
|
||
|
Fixes PS#DE7E9F99
|
||
|
Out-of-sandbox code/data files could be overwritten using this due to environment weirdness.
|
||
|
Now persistence data is in its own folder so this will not happen.
|
||
|
]]
|
||
|
local persist_dir = "persistence_data"
|
||
|
|
||
|
local function load_data(name)
|
||
|
local file = fs.combine(persist_dir, name)
|
||
|
if not fs.exists(file) then error "does not exist" end
|
||
|
local f = fs.open(file, "r")
|
||
|
local x = f.readAll()
|
||
|
f.close()
|
||
|
return textutils.unserialise(x)
|
||
|
end
|
||
|
|
||
|
local function save_data(name, value)
|
||
|
if not fs.isDir(persist_dir) then fs.delete(persist_dir) fs.makeDir(persist_dir) end
|
||
|
local f = fs.open(fs.combine(persist_dir, name), "w")
|
||
|
f.write(textutils.serialise(value))
|
||
|
f.close()
|
||
|
end
|
||
|
|
||
|
return function(name)
|
||
|
if type(name) ~= "string" then error "Name of persistence volume must be a string." end
|
||
|
local ok, data = pcall(load_data, name)
|
||
|
if not ok or not data then data = {} end
|
||
|
local mt = {}
|
||
|
setmetatable(data, mt)
|
||
|
|
||
|
mt.__index = {
|
||
|
save = function()
|
||
|
save_data(name, data)
|
||
|
end,
|
||
|
reload = function()
|
||
|
-- swap table in place to keep references valid
|
||
|
for k in pairs(data) do data[k] = nil end
|
||
|
for k, v in pairs(load_data(name)) do
|
||
|
data[k] = v
|
||
|
end
|
||
|
end
|
||
|
}
|
||
|
|
||
|
function mt.__tostring(_)
|
||
|
return ("[PersistenceStore %s]"):format(name)
|
||
|
end
|
||
|
|
||
|
return data
|
||
|
end
|