csvdatad.lua 2.2 KB
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)