73 lines
1.5 KiB
Lua
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
|