sharemap.lua 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. local stm = require "skynet.stm"
  2. local sprotoloader = require "sprotoloader"
  3. local sproto = require "sproto"
  4. local setmetatable = setmetatable
  5. local sharemap = {}
  6. function sharemap.register(protofile)
  7. -- use global slot 0 for type define
  8. sprotoloader.register(protofile, 0)
  9. end
  10. local sprotoobj
  11. local function loadsp()
  12. if sprotoobj == nil then
  13. sprotoobj = sprotoloader.load(0)
  14. end
  15. return sprotoobj
  16. end
  17. function sharemap:commit()
  18. self.__obj(sprotoobj:encode(self.__typename, self.__data))
  19. end
  20. function sharemap:copy()
  21. return stm.copy(self.__obj)
  22. end
  23. function sharemap.writer(typename, obj)
  24. local sp = loadsp()
  25. obj = obj or {}
  26. local stmobj = stm.new(sp:encode(typename,obj))
  27. local ret = {
  28. __typename = typename,
  29. __obj = stmobj,
  30. __data = obj,
  31. commit = sharemap.commit,
  32. copy = sharemap.copy,
  33. }
  34. return setmetatable(ret, { __index = obj, __newindex = obj })
  35. end
  36. local function decode(msg, sz, self)
  37. local data = self.__data
  38. for k in pairs(data) do
  39. data[k] = nil
  40. end
  41. return sprotoobj:decode(self.__typename, msg, sz, data)
  42. end
  43. function sharemap:update()
  44. return self.__obj(decode, self)
  45. end
  46. function sharemap.reader(typename, stmcpy)
  47. local sp = loadsp()
  48. local stmobj = stm.newcopy(stmcpy)
  49. local _, data = stmobj(function(msg, sz)
  50. return sp:decode(typename, msg, sz)
  51. end)
  52. local obj = {
  53. __typename = typename,
  54. __obj = stmobj,
  55. __data = data,
  56. update = sharemap.update,
  57. }
  58. return setmetatable(obj, { __index = data, __newindex = error })
  59. end
  60. return sharemap