sharedata.lua 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. local skynet = require "skynet"
  2. local sd = require "skynet.sharedata.corelib"
  3. local service
  4. skynet.init(function()
  5. service = skynet.uniqueservice "sharedatad"
  6. end)
  7. local sharedata = {}
  8. local cache = setmetatable({}, { __mode = "kv" })
  9. local function monitor(name, obj, cobj)
  10. local newobj = cobj
  11. while true do
  12. newobj = skynet.call(service, "lua", "monitor", name, newobj)
  13. if newobj == nil then
  14. break
  15. end
  16. sd.update(obj, newobj)
  17. end
  18. if cache[name] == obj then
  19. cache[name] = nil
  20. end
  21. end
  22. function sharedata.query(name)
  23. if cache[name] then
  24. return cache[name]
  25. end
  26. local obj = skynet.call(service, "lua", "query", name)
  27. local r = sd.box(obj)
  28. skynet.send(service, "lua", "confirm" , obj)
  29. skynet.fork(monitor,name, r, obj)
  30. cache[name] = r
  31. return r
  32. end
  33. function sharedata.new(name, v, ...)
  34. skynet.call(service, "lua", "new", name, v, ...)
  35. end
  36. function sharedata.update(name, v, ...)
  37. skynet.call(service, "lua", "update", name, v, ...)
  38. end
  39. function sharedata.delete(name)
  40. skynet.call(service, "lua", "delete", name)
  41. end
  42. function sharedata.flush()
  43. for name, obj in pairs(cache) do
  44. sd.flush(obj)
  45. end
  46. collectgarbage()
  47. end
  48. function sharedata.deepcopy(name, ...)
  49. if cache[name] then
  50. local cobj = cache[name].__obj
  51. return sd.copy(cobj, ...)
  52. end
  53. local cobj = skynet.call(service, "lua", "query", name)
  54. local ret = sd.copy(cobj, ...)
  55. skynet.send(service, "lua", "confirm" , cobj)
  56. return ret
  57. end
  58. return sharedata