local sharedata = require "skynet.sharedata" local skynet = require "skynet" local lfs = require "lfs" local redisproxy = require "shared.redisproxy" require "shared.init" require "utils.init" require "csvdata.init" require "skynet.manager" require "RedisKeys" -- local csvdb = {} local function formatFileName(filename) filename = string.trim(filename) local basename = filename:match("([^/]+)%.lua$") if not basename then return end local loadname = filename:match("^src/([^.]+)%.lua$") loadname = loadname:gsub('/', '.') return basename, loadname end local function travCsv(rootPath, pathes) pathes = pathes or {} local modified = false local ok, files, iter = pcall(lfs.dir, rootPath) if not ok then return modified end for entry in files, iter do -- 过滤 . 开始的字符串包括 . .. .git .开头的文件名 if string.byte(entry, 1) ~= 46 then local pathfile = rootPath .. '/' .. entry local attrs = lfs.attributes(pathfile) if attrs.mode == 'directory' then modified = travCsv(pathfile, pathes) or modified else local basename, loadname = formatFileName(pathfile) if basename then if tonum(pathes[loadname]) < attrs.modification then modified = true pathes[loadname] = attrs.modification end if basename == "init" or basename == "init_adv" then require(loadname) end end end end end return modified end -- 每分钟检查是否有更改 local file2timeMap = {} local function handle_timeout() if travCsv("src/csvdata", file2timeMap) then sharedata.update("csvdata", csvdb) end skynet.timeout(100*5, handle_timeout) end -- 重新加载csvdb local CMD = {} function CMD.reload() -- 重新加载 csvdata csvdb = {} for k, v in pairs(package.loaded) do if k:find("csvdata") then package.loaded[k] = nil end end require("csvdata.init") require("csvdata.init_adv") sharedata.update("csvdata", csvdb) skynet.sleep(1) -- 睡一觉再返回 return 'ok' end skynet.start(function () travCsv("src/csvdata", file2timeMap) sharedata.new("csvdata", csvdb) -- handle_timeout() skynet.dispatch("lua", function(_, _, command, ...) local f = CMD[command] skynet.ret(skynet.pack(f(...))) end) skynet.register "CSVDATA" end)