potatOS/src/lib/persistence.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