HomeServer/lualib/skynet/sharedata.lua
2024-11-20 15:41:37 +08:00

73 lines
1.5 KiB
Lua

local skynet = require "skynet"
local service = {}
local cache = {}
local provider
local function get_provider()
provider = provider or skynet.uniqueservice "service_provider"
return provider
end
local function check(func)
local info = debug.getinfo(func, "u")
assert(info.nups == 1)
assert(debug.getupvalue(func,1) == "_ENV")
end
function service.new(name, mainfunc, ...)
local p = get_provider()
local addr, booting = skynet.call(p, "lua", "test", name)
local address
if addr then
address = addr
else
if booting then
address = skynet.call(p, "lua", "query", name)
else
check(mainfunc)
local code = string.dump(mainfunc)
address = skynet.call(p, "lua", "launch", name, code, ...)
end
end
cache[name] = address
return address
end
function service.query(name)
if not cache[name] then
cache[name] = skynet.call(get_provider(), "lua", "query", name)
end
return cache[name]
end
return service
data.update(name, v, ...)
skynet.call(service, "lua", "update", name, v, ...)
end
function sharedata.delete(name)
skynet.call(service, "lua", "delete", name)
end
function sharedata.flush()
for name, obj in pairs(cache) do
sd.flush(obj)
end
collectgarbage()
end
function sharedata.deepcopy(name, ...)
if cache[name] then
local cobj = cache[name].__obj
return sd.copy(cobj, ...)
end
local cobj = skynet.call(service, "lua", "query", name)
local ret = sd.copy(cobj, ...)
skynet.send(service, "lua", "confirm" , cobj)
return ret
end
return sharedata