Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement