Commit a5486ede2d28fbf4981c678624674dc690d6d45d

Authored by zhouhaihai
1 parent 65421af2

csvdata 修改为 sharetable

1   -Subproject commit dce531485f84bb7a555e9bb35b22c58fb469192c
  1 +Subproject commit 7d39312ae9d50054c4b8dbb675da8024ccb5a834
... ...
src/actions/GmAction.lua
... ... @@ -16,7 +16,7 @@ function _M.clientRequest(agent, data)
16 16 end
17 17  
18 18 function _M.testhotfix(role, pms)
19   - return csvdb["itemCsv"][1]["name"] .. " -=- " .. csvdb["itemCsv"][2]["name"] .. " -=- " .. role:getItemCount(123) .. " -=- " .. table.pack(next(role.heros))[2]:getBattleValue()
  19 + return csvdb["itemCsv"][1]["name"] .. " -=- " .. globalCsv["codeVersion"] .. " -=- " .. role:getItemCount(123) .. " -=- " .. table.pack(next(role.heros))[2]:getBattleValue()
20 20 end
21 21  
22 22 function _M.ignoreout(role, pms)
... ...
src/actions/HeroAction.lua
... ... @@ -233,7 +233,7 @@ function _M.commentHeroRpc(agent, data)
233 233 result.status = 1
234 234 else
235 235 local commentKey = getCommentKey(heroType)
236   - local SERV = string.format(".NAMED%d", math.random(1, 5))
  236 + local SERV = string.format(".chatd%d", math.random(1, 5))
237 237 local legal, mod = skynet.call(SERV, "lua", "check", content)
238 238 if not legal then
239 239 content = mod or ""
... ...
src/actions/HttpAction.lua
1   -local codecache = require "skynet.codecache" -- 清空缓存用
2   -
3 1  
4 2 local _M = {}
5 3  
... ... @@ -19,45 +17,12 @@ local _M = {}
19 17 ]=]
20 18  
21 19  
22   --- 清空缓存
23   -function _M.clearcache(query, body)
24   - skynet.error(string.format("clearcache time: %s", skynet.timex()))
25   - codecache.clear()
26   - return 'success'
27   -end
28   -
29   ---重新加载 需要修改的csvdb -- 单字段修改 优先使用hotfix_csvdata
30   ---[=[ eg:
31   - body = """
32   - csvdb["itemCsv"][1]["name"] = "测试一下"
33   - """
34   -]=]
35   -
36   -function _M.reload_csvdata(query, body)
37   - if not body or body == "" then
38   - return 'no body'
39   - end
40   -
41   - local ok = pcall(load, body)
42   - if not ok then
43   - return "code error"
44   - end
45   -
46   - local ok, status = pcall(skynet.call, '.CSVDATA', "lua", "reload", body)
47   - if status == "ok" then
48   - skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body))
49   - return 'success'
50   - else
51   - return 'error update'
52   - end
53   -end
54   -
55   ---指定更新某个字段值
56 20 --[=[
57 21 解码后
58 22 body = {
59   - {"itemCsv", 1, "name", "测试一下"},
60   - {"itemCsv", 2, "name", "测试一下"}
  23 + "src/csvdata/init.lua",
  24 + "unitCsv",
  25 + "story_cgCsv",
61 26 }
62 27 ]=]
63 28 function _M.hotfix_csvdata(query, body)
... ... @@ -69,14 +34,10 @@ function _M.hotfix_csvdata(query, body)
69 34 if not ok or type(result) ~= 'table' then
70 35 return "decode error"
71 36 end
72   - local ok, status = pcall(skynet.call, '.CSVDATA', "lua", "hotfix", result)
73 37  
74   - if status == "ok" then
75   - skynet.error(string.format("hotfix_csvdata time: %s, code: %s", skynet.timex(), body))
76   - return 'success'
77   - else
78   - return 'error update'
79   - end
  38 + csvdb.hotfix(table.unpack(result))
  39 +
  40 + return 'success'
80 41 end
81 42  
82 43 -- 热更新代码 -- 针对 agent 执行发送过来的代码 -- 代码要规范~
... ... @@ -150,7 +111,7 @@ function _M.hotfix_code(query, body)
150 111  
151 112 skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body))
152 113  
153   - pcall(skynet.call, '.WATCHDOG', "lua", "hotfix", body)
  114 + pcall(skynet.call, '.watchdog', "lua", "hotfix", body)
154 115 return 'success'
155 116 end
156 117  
... ...
src/actions/RoleAction.lua
... ... @@ -22,7 +22,7 @@ local function validName(name)
22 22 local exist = redisproxy:exists(string_format("user:%s", name))
23 23 if exist then return "existed" end
24 24  
25   - local SERV = string_format(".NAMED%d", math.random(1, 5))
  25 + local SERV = string_format(".named%d", math.random(1, 5))
26 26 local legal = skynet.call(SERV, "lua", "check", name)
27 27 return legal and "ok" or "illegal"
28 28 end
... ... @@ -217,7 +217,7 @@ function _M.loginRpc( agent, data )
217 217  
218 218 -- 发下缓存的世界消息
219 219 local worldChatResponse = {worldChats = {}}
220   - local ok, msgs = pcall(skynet.call, '.GLOBALD', "lua", "getWorldMsg", role._channelIdx)
  220 + local ok, msgs = pcall(skynet.call, '.globald', "lua", "getWorldMsg", role._channelIdx)
221 221 if not ok then
222 222 msgs = {}
223 223 end
... ... @@ -365,7 +365,7 @@ function _M.changeIntroRpc(agent, data)
365 365 local content = msg.content
366 366 if not content or type(content) ~= "string" then return end
367 367  
368   - local SERV = string_format(".CHATED%d", math.random(1, 5))
  368 + local SERV = string_format(".chated%d", math.random(1, 5))
369 369 local legal, mod = skynet.call(SERV, "lua", "check", content)
370 370 if not legal then
371 371 content = mod or ""
... ... @@ -750,7 +750,7 @@ function _M.chatRpc(agent, data)
750 750 -- 判断禁言
751 751 local result = nil
752 752  
753   - local SERV = string_format(".CHATED%d", math.random(1, 5))
  753 + local SERV = string_format(".chated%d", math.random(1, 5))
754 754 local legal, mod = skynet.call(SERV, "lua", "check", content)
755 755 if not legal then
756 756 content = mod or ""
... ... @@ -805,7 +805,7 @@ function _M.chatRpc(agent, data)
805 805 end
806 806 end
807 807 mcast_util.pub_world(actionCodes.Role_chat, MsgPack.pack(response))
808   - pcall(skynet.send, '.GLOBALD', "lua", "sendWorldMsg", role._channelIdx, response)
  808 + pcall(skynet.send, '.globald', "lua", "sendWorldMsg", role._channelIdx, response)
809 809 end,
810 810 -- 私聊
811 811 [2] = function ()
... ...
src/agent.lua
... ... @@ -8,14 +8,13 @@ require "skynet.manager"
8 8 local queue = require "skynet.queue"
9 9 local netpack = require "skynet.netpack"
10 10 local socket = require "skynet.socket"
11   -local sharedata = require "skynet.sharedata"
12 11 local xxtea = require "xxtea"
13 12  
14 13 skynet = require "skynet"
15 14 redisproxy = require "shared.redisproxy"
16 15 datacenter = require "skynet.datacenter"
17 16 mcast_util = require "services/mcast_util"
18   -globalCsv = require "csvdata/GlobalDefine"
  17 +csvdb = require "shared.csvdata"
19 18  
20 19 local CMD = {}
21 20 local agentInfo = {} -- { client_fd, role, gate_serv, open_timer}
... ... @@ -217,7 +216,7 @@ skynet.register_protocol {
217 216  
218 217 skynet.register_protocol {
219 218 name = "role",
220   - id = 13,
  219 + id = 101,
221 220 pack = skynet.pack,
222 221 unpack = skynet.unpack,
223 222 dispatch = function(session, address, submethod, ...)
... ... @@ -326,20 +325,19 @@ skynet.start(function()
326 325 end
327 326 end)
328 327  
329   - redisd = skynet.localname(".REDIS")
  328 + redisd = skynet.localname(".redis")
330 329 if tonumber(skynet.getenv "logd") == 1 then
331   - logd = skynet.localname(".LOGD")
  330 + logd = skynet.localname(".log")
332 331 end
333 332  
334 333 cs = queue()
335 334  
336   - csvdb = sharedata.query("csvdata")
337   - pvpd = skynet.localname(".PVPCROSS")
  335 + pvpd = skynet.localname(".pvpcross")
338 336 -- 错误码特殊处理
339 337 -- todo
340 338 -- for key, value in pairs(csvdb["sys_codesCsv"]) do
341 339 -- _G[string.upper(value.varname)] = key
342 340 -- end
343   -
  341 + globalCsv = csvdb["GlobalDefineCsv"]
344 342 agent_util = require "services/agent_util"
345 343 end)
... ...
src/services/chated.lua
... ... @@ -35,12 +35,13 @@ if mode == "sub" then
35 35 skynet.ret(skynet.pack(f(...)))
36 36 end)
37 37  
38   - skynet.register(string.format(".CHATED%d", id))
  38 + skynet.register(string.format(".chated%d", id))
39 39 end)
40 40 else
41 41 skynet.start(function()
42   - local ok, forbidNames = pcall(require, "csvdata.forbid_chat")
43   - if not ok then forbidNames = {} end
  42 + local csvdb = require "shared.csvdata"
  43 + local forbidNames = csvdb["forbid_chatCsv"]
  44 + if not forbidNames then forbidNames = {} end
44 45  
45 46 local words = {}
46 47 for _, data in ipairs(forbidNames) do
... ...
src/services/csvdatad.lua deleted
... ... @@ -1,115 +0,0 @@
1   -local sharedata = require "skynet.sharedata"
2   -local skynet = require "skynet"
3   -local lfs = require "lfs"
4   -local redisproxy = require "shared.redisproxy"
5   -require "shared.init"
6   -require "utils.init"
7   -require "csvdata.init"
8   -require "skynet.manager"
9   -require "RedisKeys"
10   -
11   --- local csvdb = {}
12   -
13   -local function formatFileName(filename)
14   - filename = string.trim(filename)
15   - local basename = filename:match("([^/]+)%.lua$")
16   - if not basename then return end
17   - local loadname = filename:match("^src/([^.]+)%.lua$")
18   - loadname = loadname:gsub('/', '.')
19   - return basename, loadname
20   -end
21   -
22   -local function travCsv(rootPath, pathes)
23   - pathes = pathes or {}
24   - local modified = false
25   - local ok, files, iter = pcall(lfs.dir, rootPath)
26   - if not ok then return modified end
27   - for entry in files, iter do
28   - -- 过滤 . 开始的字符串包括 . .. .git .开头的文件名
29   - if string.byte(entry, 1) ~= 46 then
30   - local pathfile = rootPath .. '/' .. entry
31   - local attrs = lfs.attributes(pathfile)
32   - if attrs.mode == 'directory' then
33   - modified = travCsv(pathfile, pathes) or modified
34   - else
35   - local basename, loadname = formatFileName(pathfile)
36   - if basename then
37   - if tonum(pathes[loadname]) < attrs.modification then
38   - modified = true
39   - pathes[loadname] = attrs.modification
40   - end
41   - if basename == "init" or basename == "init_adv" then
42   - require(loadname)
43   - end
44   - end
45   - end
46   - end
47   - end
48   - return modified
49   -end
50   -
51   --- 每分钟检查是否有更改
52   -local file2timeMap = {}
53   -local function handle_timeout()
54   - if travCsv("src/csvdata", file2timeMap) then
55   - sharedata.update("csvdata", csvdb)
56   - end
57   - skynet.timeout(100*5, handle_timeout)
58   -end
59   -
60   --- 重新加载csvdb
61   -
62   -
63   -local CMD = {}
64   -
65   -function CMD.reload(code)
66   - csvdb = csvdb or {}
67   -
68   - local ok, func = pcall(load, code)
69   - if ok then
70   - ok = pcall(func)
71   - end
72   - if not ok then
73   - skynet.error("reload_csvdata error by code " .. code)
74   - return 'error'
75   - end
76   -
77   - sharedata.update("csvdata", csvdb)
78   - return 'ok'
79   -end
80   -
81   ---更新已经存在的
82   -function CMD.hotfix(fieldss)
83   - csvdb = csvdb or {}
84   - for _, fields in ipairs(fieldss) do
85   - if #fields >= 3 and (type(fields[#fields]) == 'number' or type(fields[#fields]) == 'string') then
86   - local temp = csvdb
87   - local ok = false
88   - for i = 1, #fields - 1 do
89   - if type(temp) ~= 'table' then break end
90   - if type(fields[i]) ~= 'number' and type(fields[i]) ~= 'string' then break end
91   - if i == #fields - 1 then
92   - if type(temp[fields[i]]) ~= 'number' and type(temp[fields[i]]) ~= 'string' then break end
93   - temp[fields[i]] = fields[#fields]
94   - else
95   - temp = temp[fields[i]]
96   - end
97   - end
98   - end
99   - end
100   - sharedata.update("csvdata", csvdb)
101   - return 'ok'
102   -end
103   -
104   -skynet.start(function ()
105   - travCsv("src/csvdata", file2timeMap)
106   - sharedata.new("csvdata", csvdb)
107   - -- handle_timeout()
108   -
109   - skynet.dispatch("lua", function(_, _, command, ...)
110   - local f = CMD[command]
111   - skynet.ret(skynet.pack(f(...)))
112   - end)
113   -
114   - skynet.register(".CSVDATA")
115   -end)
src/services/dbseed.lua
1   -require "csvdata.init"
2 1 require "shared.init"
3 2 require "utils.init"
4 3 require "GlobalVar"
... ... @@ -9,7 +8,6 @@ require &quot;skynet.manager&quot;
9 8 skynet = require "skynet"
10 9  
11 10 redisproxy = require("shared.redisproxy")
12   -globalCsv = require "csvdata/GlobalDefine"
13 11  
14 12 SendPacket = function ( ... ) end
15 13  
... ... @@ -36,7 +34,7 @@ local steps = {
36 34 }
37 35  
38 36 skynet.start(function ()
39   - redisd = skynet.localname(".REDIS")
  37 + redisd = skynet.localname(".redis")
40 38  
41 39 redisproxy = require("shared.redisproxy")
42 40  
... ... @@ -46,6 +44,8 @@ skynet.start(function ()
46 44 skynet.exit()
47 45 return
48 46 end
  47 + csvdb = require "shared.csvdata"
  48 + globalCsv = csvdb["GlobalDefineCsv"]
49 49  
50 50 for _, action in ipairs(steps) do
51 51 print(action.desc .. "start ...")
... ...
src/services/globald.lua
... ... @@ -129,8 +129,8 @@ local function __init__()
129 129 end
130 130 end
131 131 end)
132   - redisd = skynet.localname(".REDIS")
133   - skynet.register(".GLOBALD")
  132 + redisd = skynet.localname(".redis")
  133 + skynet.register(".globald")
134 134  
135 135 end
136 136  
... ...
src/services/httpweb.lua
... ... @@ -8,9 +8,8 @@ skynet = require &quot;skynet&quot;
8 8 redisproxy = require "shared.redisproxy"
9 9 netpack = require "skynet.netpack"
10 10 datacenter = require "skynet.datacenter"
11   -sharedata = require "skynet.sharedata"
12 11 mcast_util = require "services/mcast_util"
13   -globalCsv = require "csvdata/GlobalDefine"
  12 +csvdb = require "shared.csvdata"
14 13  
15 14 local socket = require "skynet.socket"
16 15  
... ... @@ -33,7 +32,7 @@ local string = string
33 32  
34 33 skynet.register_protocol {
35 34 name = "role",
36   - id = 13,
  35 + id = 101,
37 36 pack = skynet.pack,
38 37 unpack = skynet.unpack,
39 38 }
... ... @@ -54,8 +53,8 @@ end
54 53 local CMD = require "actions.HttpAction"
55 54  
56 55 local function start()
57   - redisd = skynet.localname(".REDIS")
58   - csvdb = sharedata.query("csvdata")
  56 + redisd = skynet.localname(".redis")
  57 + globalCsv = csvdb["GlobalDefineCsv"]
59 58  
60 59 local listen_socket = socket.listen("0.0.0.0", port)
61 60 print("Listen web port " .. port)
... ...
src/services/logd.lua
... ... @@ -108,7 +108,7 @@ local function __init__()
108 108 end)
109 109 cs = queue()
110 110  
111   - skynet.register(".LOGD")
  111 + skynet.register(".log")
112 112 end
113 113  
114 114 skynet.start(__init__)
... ...
src/services/named.lua
... ... @@ -35,12 +35,13 @@ if mode == &quot;sub&quot; then
35 35 skynet.ret(skynet.pack(f(...)))
36 36 end)
37 37  
38   - skynet.register(string.format(".NAMED%d", id))
  38 + skynet.register(string.format(".named%d", id))
39 39 end)
40 40 else
41 41 skynet.start(function()
42   - local ok, forbidNames = pcall(require, "csvdata.forbid_name")
43   - if not ok then forbidNames = {} end
  42 + local csvdb = require "shared.csvdata"
  43 + local forbidNames = csvdb["forbid_nameCsv"]
  44 + if not forbidNames then forbidNames = {} end
44 45  
45 46 local words = {}
46 47 for _, data in ipairs(forbidNames) do
... ...
src/services/pvpd.lua
... ... @@ -3,13 +3,12 @@ local json = require(&quot;shared.json&quot;)
3 3 redisproxy = require("shared.redisproxy")
4 4 local cluster = require "skynet.cluster"
5 5 local serverId = tonumber(skynet.getenv("servId"))
6   -local sharedata = require "skynet.sharedata"
7 6 datacenter = require "skynet.datacenter"
  7 +csvdb = require "shared.csvdata"
8 8 require "shared.init"
9 9 require "utils.init"
10 10 require "RedisKeys"
11 11 require "skynet.manager"
12   -globalCsv = require "csvdata/GlobalDefine"
13 12 require "GlobalVar"
14 13  
15 14  
... ... @@ -30,7 +29,7 @@ end
30 29  
31 30 skynet.register_protocol {
32 31 name = "role",
33   - id = 13,
  32 + id = 101,
34 33 pack = skynet.pack,
35 34 unpack = skynet.unpack,
36 35 dispatch = function(session, address, submethod, ...)
... ... @@ -294,7 +293,9 @@ end
294 293  
295 294 ------------------------------------------------------
296 295 function CMD.start()
297   - redisd = skynet.localname(".REDIS")
  296 + redisd = skynet.localname(".redis")
  297 + globalCsv = csvdb["GlobalDefineCsv"]
  298 +
298 299 pvpInfo = require("models.Pvpd").new({key = "cross:pvpInfo"})
299 300 pvpInfo:load()
300 301 end
... ... @@ -308,9 +309,8 @@ local function __init__()
308 309 skynet.ret(skynet.pack(f(...)))
309 310 end
310 311 end)
311   - csvdb = sharedata.query("csvdata")
312 312  
313   - skynet.register(".PVPCROSS")
  313 + skynet.register(".pvpcross")
314 314 end
315 315  
316 316 skynet.start(__init__)
... ...
src/services/redisd.lua
... ... @@ -24,5 +24,5 @@ skynet.start(function()
24 24 skynet.ret(skynet.pack(db[string.lower(cmd)](db, ...)))
25 25 end
26 26 end)
27   - skynet.register ".REDIS"
  27 + skynet.register ".redis"
28 28 end)
29 29 \ No newline at end of file
... ...
src/services/uniond.lua deleted
... ... @@ -1,143 +0,0 @@
1   -require "shared.init"
2   -require "utils.init"
3   -require "ProtocolCode"
4   -require "GlobalVar"
5   -require "RedisKeys"
6   -require "skynet.manager"
7   -
8   -local sharedata = require "sharedata"
9   -local redisproxy = require "shared.redisproxy"
10   -local datacenter = require "datacenter"
11   -local queue = require "skynet.queue"
12   -
13   -skynet = require "skynet"
14   -globalCsv = require "csvdata.GlobalDefine"
15   -
16   -local table_pack = table.pack
17   -local table_unpack = table.unpack
18   -local string_format = string.format
19   -local pairs = pairs
20   -local ipairs = ipairs
21   -local tonumber = tonumber
22   -
23   --- 维护在线状态
24   -
25   -local unionInfo, CMD, cs = {}, {}
26   -
27   -skynet.register_protocol {
28   - name = "role",
29   - id = 13,
30   - pack = skynet.pack,
31   - unpack = skynet.unpack,
32   -}
33   -
34   -local function handle_timeout()
35   - local now = skynet.timex()
36   - unionInfo:onTimer(now)
37   - skynet.timeout(100, handle_timeout)
38   -end
39   -
40   ---[[
41   -getProperties({"field1", "field2", ...})
42   -return: {field1 = value1, field2 = value2, ...}
43   --------
44   -setProperties({field1 = value1, field2 = value2, ...})
45   -]]
46   -function rpcRole(roleId, funcName, ...)
47   - if not unionInfo.members[roleId] then return end
48   - local serv = unionInfo.members[roleId].serv
49   - if serv then
50   - if funcName == "getProperties" then
51   - return skynet.call(serv, "role", funcName, table_unpack(...))
52   - else
53   - return skynet.call(serv, "role", funcName, ...)
54   - end
55   - else
56   - local rediskey = string_format("role:%d", roleId)
57   - if funcName == "getProperty" then
58   - return redisproxy:hget(rediskey, ...)
59   - elseif funcName == "setProperty" then
60   - return redisproxy:hset(rediskey, ...)
61   - elseif funcName == "getProperties" then
62   - local sRole = require "models.Role"
63   - local fields = table_pack(...)
64   - local rets = redisproxy:hmget(rediskey, table_unpack(fields, 1, fields.n))
65   - local result = {}
66   - for i=1, fields.n do
67   - local typ = sRole.schema[fields[i]][1]
68   - local def = sRole.schema[fields[i]][2]
69   - if typ == "number" then
70   - result[fields[i]] = tonumber(rets[i] or def)
71   - else
72   - result[fields[i]] = rets[i]
73   - end
74   - end
75   - return result
76   - elseif funcName == "setProperties" then
77   - local fields = ...
78   - local params = {}
79   - for field, value in pairs(fields) do
80   - params[#params+1] = field
81   - params[#params+1] = value
82   - end
83   - return redisproxy:hmset(rediskey, table_unpack(params))
84   - end
85   - end
86   -end
87   -
88   --- 加载联盟数据
89   -function CMD.load(unionId)
90   - unionInfo = require("models.Union").new({key = UNION_KEY:format(unionId)})
91   - unionInfo:load()
92   - unionInfo:loadMembers()
93   -end
94   -
95   --- 创建一个联盟
96   -function CMD.new(roleId)
97   - local unionId = redisproxy:hincrby("autoincrement_set", "union", 1)
98   - unionInfo = require("models.Union").new({
99   - key = UNION_KEY:format(unionId),
100   - master = roleId
101   - })
102   - unionInfo:create()
103   - unionInfo:addMember(roleId, true)
104   - redisproxy:sadd(UNION_SET, unionId)
105   - return unionId
106   -end
107   -
108   --- 登录/登出 需要向联盟服务报备
109   -function CMD.sign(cmd, roleId, serv)
110   - if not unionInfo.members[roleId] then return end
111   - if cmd == "login" then
112   - unionInfo.members[roleId].serv = serv
113   - elseif cmd == "logout" then
114   - unionInfo.members[roleId].serv = nil
115   - end
116   -end
117   -
118   -local function __init__()
119   - skynet.dispatch("lua", function(_, _, command, ...)
120   - cs(function (...)
121   - if CMD[command] then
122   - skynet.ret(skynet.pack(CMD[command](...)))
123   - return
124   - else
125   - if unionInfo and unionInfo[submethod] then
126   - if command == 'dismiss' then
127   - unionInfo:dismiss(...)
128   - return
129   - end
130   - local result = unionInfo[submethod](unionInfo, ...)
131   - skynet.ret(skynet.pack(result))
132   - return
133   - end
134   - end
135   - skynet.error("uniond commond error cmd=", command)
136   - end)
137   - end)
138   - skynet.register("UNIOND")
139   - csvdb = sharedata.query("csvdata")
140   - cs = queue()
141   -end
142   -
143   -skynet.start(__init__)
144 0 \ No newline at end of file
src/services/watchdog.lua
... ... @@ -9,6 +9,7 @@ local agent_ctrl = require &quot;services.agent_ctrl&quot;
9 9 local xxtea = require "xxtea"
10 10 local mc = require "skynet.multicast"
11 11 local cluster = require "skynet.cluster"
  12 +local csvdata = require "shared.csvdata"
12 13  
13 14 require "ProtocolCode"
14 15 require "GlobalVar"
... ... @@ -107,12 +108,12 @@ skynet.start(function()
107 108 skynet.ret(skynet.pack(f(subcmd, ...)))
108 109 end
109 110 end)
110   - skynet.register ".WATCHDOG"
  111 + skynet.register ".watchdog"
111 112 -- 数据库服务
112 113 redisd = skynet.newservice("services/redisd")
113 114  
114   - -- load all csv data
115   - skynet.newservice("services/csvdatad")
  115 + -- 提前加载好
  116 + csvdata.init()
116 117 print("launch csvdatad ...")
117 118  
118 119 -- 日志服务
... ...
src/shared/csvdata.lua 0 → 100644
... ... @@ -0,0 +1,183 @@
  1 +-- 对sharetable 的一层封装 实现热更新
  2 +
  3 +local skynet = require "skynet"
  4 +local service = require "skynet.service"
  5 +local sharetable = require "skynet.sharetable"
  6 +
  7 +local function sharetable_service()
  8 + local skynet = require "skynet"
  9 + local sharetable = require "skynet.sharetable"
  10 +
  11 + local files = {} -- filename
  12 + local csvdata = {}
  13 +
  14 + local initfile = {
  15 + ["src/csvdata/init.lua"] = {},
  16 + ["src/csvdata/init_adv.lua"] = {},
  17 + }
  18 +
  19 + function csvdata.query(source, filename)
  20 + files[filename] = files[filename] or {}
  21 + files[filename][source] = 1
  22 + end
  23 +
  24 + function csvdata.close(source)
  25 + for filename, info in pairs(files) do
  26 + info[source] = nil
  27 + end
  28 + end
  29 +
  30 + function csvdata.realName(file)
  31 + if string.match(file, "Csv$") then
  32 + if initfile["src/csvdata/init.lua"] and initfile["src/csvdata/init.lua"][file] then
  33 + file = initfile["src/csvdata/init.lua"][file]
  34 + elseif initfile["src/csvdata/init_adv.lua"] and initfile["src/csvdata/init_adv.lua"][file] then
  35 + file = initfile["src/csvdata/init_adv.lua"][file]
  36 + end
  37 + file = "src/" .. file .. ".lua"
  38 + end
  39 + return file
  40 + end
  41 +
  42 + function csvdata.hotfix(_, ...)
  43 + local now = skynet.timex()
  44 +
  45 + local filenames = {...}
  46 +
  47 + local needHotfix = {}
  48 + for _, filename in ipairs(filenames) do
  49 + -- 更新下
  50 + skynet.error(string.format("hotfix_csvdata time: %s, file: %s", now, filename))
  51 +
  52 + if initfile[filename] then
  53 + sharetable.loadfile(filename)
  54 + sharetable.update(filename)
  55 + else
  56 + sharetable.loadfile(csvdata.realName(filename))
  57 + end
  58 +
  59 + if files[filename] then
  60 + for source, _ in pairs(files[filename]) do
  61 + needHotfix[source] = needHotfix[source] or {}
  62 + table.insert(needHotfix[source], filename)
  63 + end
  64 + end
  65 + end
  66 +
  67 + for source, files in pairs(needHotfix) do
  68 + skynet.send(source, "csvdata", "hotfix", table.unpack(files))
  69 + end
  70 + end
  71 +
  72 + skynet.dispatch("lua", function(_,source,cmd,...)
  73 + skynet.ignoreret()
  74 + csvdata[cmd](source,...)
  75 + end)
  76 +
  77 + skynet.register_protocol {
  78 + name = "csvdata",
  79 + id = 102,
  80 + pack = skynet.pack,
  81 + unpack = skynet.unpack,
  82 + }
  83 +
  84 + -- 初始化csvdata
  85 + skynet.start(function()
  86 + for file, _ in pairs(initfile) do
  87 + sharetable.loadfile(file)
  88 + local init = sharetable.query(file)
  89 + if not init then
  90 + error("csvdata load init file error " .. file)
  91 + return
  92 + end
  93 + initfile[file] = init
  94 + for _, one in pairs(init) do
  95 + sharetable.loadfile("src/" .. one .. ".lua")
  96 + end
  97 + end
  98 + end)
  99 +end
  100 +
  101 +
  102 +local cache = {}
  103 +local csvdata
  104 +
  105 +local function load_csvdata(t, key)
  106 + if key == "address" then
  107 + t.address = service.new("csvdata", sharetable_service)
  108 + return t.address
  109 + else
  110 + if cache[key] then return cache[key] end
  111 +
  112 + local realName = csvdata.realName(key)
  113 +
  114 + local tab = sharetable.query(realName)
  115 + if not tab then
  116 + error("dont have csvdata : " .. realName)
  117 + return
  118 + end
  119 + cache[key] = tab
  120 + -- 增加引用
  121 + skynet.send(csvdata.address, "lua", "query", key)
  122 + return tab
  123 + end
  124 +end
  125 +
  126 +local function close_hotfix(t)
  127 + local addr = rawget(t, "address")
  128 + if addr then
  129 + skynet.send(addr, "lua", "close")
  130 + end
  131 +end
  132 +
  133 +csvdata = setmetatable ( {} , {
  134 + __index = load_csvdata,
  135 + __gc = close_hotfix,
  136 +})
  137 +
  138 +function csvdata.init()
  139 + return csvdata.address
  140 +end
  141 +
  142 +function csvdata.hotfix(...)
  143 + skynet.send(csvdata.address, "lua", "hotfix", ...)
  144 +end
  145 +
  146 +function csvdata.realName(file)
  147 + if string.match(file, "Csv$") then
  148 + if csvdata["src/csvdata/init.lua"] and csvdata["src/csvdata/init.lua"][file] then
  149 + file = csvdata["src/csvdata/init.lua"][file]
  150 + elseif csvdata["src/csvdata/init_adv.lua"] and csvdata["src/csvdata/init_adv.lua"][file] then
  151 + file = csvdata["src/csvdata/init_adv.lua"][file]
  152 + end
  153 + file = "src/" .. file .. ".lua"
  154 + end
  155 + return file
  156 +end
  157 +
  158 +local function update(file)
  159 + -- 更新一下
  160 + if cache[file] then
  161 + sharetable.update(csvdata.realName(file))
  162 + end
  163 +end
  164 +
  165 +skynet.register_protocol {
  166 + name = "csvdata",
  167 + id = 102,
  168 + pack = skynet.pack,
  169 + unpack = skynet.unpack,
  170 + dispatch = function(_, _, cmd, ...)
  171 + skynet.ignoreret()
  172 + if cmd == "hotfix" then
  173 + -- skynet.error("csvdara hotfix update", ...)
  174 + local files = {...}
  175 + for _, file in ipairs(files) do
  176 + update(file)
  177 + end
  178 + return
  179 + end
  180 + end,
  181 +}
  182 +
  183 +return csvdata
... ...