Blame view

publish/skynet/lualib/skynet/sharedata.lua 1.47 KB
4d6f285d   zhouhaihai   增加发布功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  local skynet = require "skynet"
  local sd = require "skynet.sharedata.corelib"
  
  local service
  
  skynet.init(function()
  	service = skynet.uniqueservice "sharedatad"
  end)
  
  local sharedata = {}
  local cache = setmetatable({}, { __mode = "kv" })
  
  local function monitor(name, obj, cobj)
  	local newobj = cobj
  	while true do
  		newobj = skynet.call(service, "lua", "monitor", name, newobj)
  		if newobj == nil then
  			break
  		end
  		sd.update(obj, newobj)
  		skynet.send(service, "lua", "confirm" , newobj)
  	end
  	if cache[name] == obj then
  		cache[name] = nil
  	end
  end
  
  function sharedata.query(name)
  	if cache[name] then
  		return cache[name]
  	end
  	local obj = skynet.call(service, "lua", "query", name)
  	local r = sd.box(obj)
  	skynet.send(service, "lua", "confirm" , obj)
  	skynet.fork(monitor,name, r, obj)
  	cache[name] = r
  	return r
  end
  
  function sharedata.new(name, v, ...)
  	skynet.call(service, "lua", "new", name, v, ...)
  end
  
  function sharedata.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