HomeServer/lualib/skynet/sharedata.lua

73 lines
1.5 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
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