From c5fb8ef3f7e44aa42a0e193e61fd7509911d7f17 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Mon, 14 Nov 2016 13:05:01 +0800 Subject: [PATCH] add sharedata.deepcopy --- lualib/sharedata.lua | 12 ++++++++++ lualib/sharedata/corelib.lua | 45 +++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/lualib/sharedata.lua b/lualib/sharedata.lua index 5526b327..a17a20ba 100644 --- a/lualib/sharedata.lua +++ b/lualib/sharedata.lua @@ -55,4 +55,16 @@ function sharedata.flush() 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 diff --git a/lualib/sharedata/corelib.lua b/lualib/sharedata/corelib.lua index 08d6dd3d..bd42cf1b 100644 --- a/lualib/sharedata/corelib.lua +++ b/lualib/sharedata/corelib.lua @@ -20,6 +20,7 @@ local isdirty = core.isdirty local index = core.index local needupdate = core.needupdate local len = core.len +local core_nextkey = core.nextkey local function findroot(self) while self.__parent do @@ -106,7 +107,7 @@ end function conf.next(obj, key) local cobj = getcobj(obj) - local nextkey = core.nextkey(cobj, key) + local nextkey = core_nextkey(cobj, key) if nextkey then return nextkey, obj[nextkey] end @@ -132,4 +133,46 @@ function conf.flush(obj) getcobj(obj) end +local function clone_table(cobj) + local obj = {} + local key + while true do + key = core_nextkey(cobj, key) + if key == nil then + break + end + local v = index(cobj, key) + if type(v) == "userdata" then + v = clone_table(v) + end + obj[key] = v + end + return obj +end + +local function find_node(cobj, key, ...) + if key == nil then + return cobj + end + local cobj = index(cobj, key) + if cobj == nil then + return nil + end + if type(cobj) == "userdata" then + return find_node(cobj, ...) + end + return cobj +end + +function conf.copy(cobj, ...) + cobj = find_node(cobj, ...) + if cobj then + if type(cobj) == "userdata" then + return clone_table(cobj) + else + return cobj + end + end +end + return conf