forked from endernon/PGRData
215 lines
6.6 KiB
Lua
215 lines
6.6 KiB
Lua
---@class XConfigUtil
|
||
XConfigUtil = XClass(nil, "XConfigUtil")
|
||
|
||
XConfigUtil.ReadType = {
|
||
Int = 1,
|
||
String = 2,
|
||
IntAll = 3,
|
||
StringAll = 4
|
||
}
|
||
---配置表缓存方式
|
||
XConfigUtil.CacheType = {
|
||
Normal = 0, --常驻
|
||
Private = 1, --ClearPrivate的时候释放
|
||
Temp = 2, --临时返回, 不做缓存
|
||
}
|
||
|
||
XConfigUtil.DirectoryType = {
|
||
Share = 1,
|
||
Client = 2,
|
||
}
|
||
|
||
local IsWindowsEditor = XMain.IsWindowsEditor
|
||
|
||
function XConfigUtil.GetReadHandler(readType)
|
||
if readType == XConfigUtil.ReadType.Int then
|
||
return XTableManager.ReadByIntKey
|
||
elseif readType == XConfigUtil.ReadType.String then
|
||
return XTableManager.ReadByStringKey
|
||
elseif readType == XConfigUtil.ReadType.IntAll then
|
||
return XTableManager.ReadAllByIntKey
|
||
elseif readType == XConfigUtil.ReadType.StringAll then
|
||
return XTableManager.ReadAllByStringKey
|
||
end
|
||
XLog.Error("Can not find read handler: ".. readType)
|
||
end
|
||
|
||
function XConfigUtil:Ctor(id)
|
||
self._Id = id
|
||
self._ConfigArgs = nil
|
||
self._Configs = {}
|
||
end
|
||
|
||
---注册配置表的读取方式
|
||
--- tableKey{ tableName = {ReadFunc , DirPath, Identifier, TableDefindName, CacheType} }
|
||
--- isAllNormal 将整个tablekey的读表方式改为normal
|
||
function XConfigUtil:InitConfigByTableKey(parentPath, tableKey, isAllNormal)
|
||
-- 枚举出反向的k-v
|
||
if not self._TableKey then
|
||
self._TableKey = {}
|
||
end
|
||
for k, v in pairs(tableKey) do
|
||
self._TableKey[v] = k
|
||
end
|
||
|
||
-- 将表的格式转化成可供InitConfig使用的格式
|
||
local res = {}
|
||
for k, v in pairs(tableKey) do
|
||
local dirPath = "Share"
|
||
if v.DirPath and v.DirPath == XConfigUtil.DirectoryType.Client then
|
||
dirPath = "Client"
|
||
end
|
||
local path = dirPath.."/".. parentPath .."/" .. k ..".tab"
|
||
local arg = {}
|
||
arg[1] = v.ReadFunc or XConfigUtil.ReadType.Int
|
||
arg[2] = v.TableDefindName and XTable[v.TableDefindName] or XTable["XTable"..k]
|
||
arg[3] = v.Identifier or "Id"
|
||
local chacheType = v.CacheType or XConfigUtil.CacheType.Private
|
||
if isAllNormal then
|
||
chacheType = XConfigUtil.CacheType.Normal
|
||
end
|
||
arg[4] = chacheType
|
||
|
||
res[path] = { arg[1], arg[2], arg[3], arg[4] }
|
||
if not self._TablePath then
|
||
self._TablePath = {}
|
||
end
|
||
self._TablePath[k] = path
|
||
end
|
||
|
||
self:InitConfig(res)
|
||
end
|
||
|
||
---给定配置表Key,获取一个配置表
|
||
---@param tableKey table 配置表的Key
|
||
---@return any 配置表
|
||
function XConfigUtil:GetByTableKey(tableKey)
|
||
local path = self:GetPathByTableKey(tableKey)
|
||
return self:Get(path)
|
||
end
|
||
|
||
---给定配置表Key,获取该配置表路径
|
||
---@param tableKey table 配置表的Key
|
||
function XConfigUtil:GetPathByTableKey(tableKey)
|
||
local key = self._TableKey[tableKey]
|
||
if not key then
|
||
XLog.Error("The tableKey given is not exist. ModuleId: " .. self._Id)
|
||
return nil
|
||
end
|
||
|
||
local path = self._TablePath[key]
|
||
if not path then
|
||
XLog.Error("The path given is not exist. ModuleId: " .. self._Id)
|
||
return nil
|
||
end
|
||
return path
|
||
end
|
||
|
||
---给定配置表Key和Id,获取该配置表指定Id的配置
|
||
---@param tableKey table 配置表的Key
|
||
---@param idKey any 该配置表的主键Id或Key
|
||
---@param noTips boolean 若没有查找到对应项,是否要打印错误日志
|
||
function XConfigUtil:GetCfgByTableKeyAndIdKey(tableKey, idKey, noTips)
|
||
local path = self:GetPathByTableKey(tableKey)
|
||
return self:GetCfgByPathAndIdKey(path, idKey, noTips)
|
||
end
|
||
|
||
---给定配置表路径和Id,获取该配置表指定Id的配置
|
||
---@param path string 配置表路径
|
||
---@param idKey any 该配置表的主键Id或Key
|
||
---@param noTips boolean 若没有查找到对应项,是否要打印错误日志
|
||
function XConfigUtil:GetCfgByPathAndIdKey(path, idKey, noTips)
|
||
if not path then
|
||
XLog.Error("The path given is not exist. ModuleId: " .. self._Id)
|
||
return nil
|
||
end
|
||
local allConfigs = self:Get(path)
|
||
if not allConfigs then
|
||
return nil
|
||
end
|
||
local config = allConfigs[idKey]
|
||
if not config then
|
||
if not noTips then
|
||
XLog.Error(string.format("ModuleId:%s出错:找不到%s数据。搜索路径: %s 索引%s = %s", self._Id, "唯一Id", path, "唯一Id", tostring(idKey)))
|
||
end
|
||
return nil
|
||
end
|
||
return config
|
||
end
|
||
|
||
---{path = {readFunc, xtable, identifier, CacheType}}
|
||
---@param arg any
|
||
function XConfigUtil:InitConfig(arg)
|
||
if not self._ConfigArgs then
|
||
self._ConfigArgs = arg
|
||
else
|
||
for i, v in pairs(arg) do
|
||
self._ConfigArgs[i] = v
|
||
end
|
||
end
|
||
end
|
||
|
||
---通过path获取一个配置表
|
||
---@param path string 配置表路径
|
||
---@return any 配置表
|
||
function XConfigUtil:Get(path)
|
||
local config = self._Configs[path]
|
||
if config then
|
||
return config
|
||
end
|
||
if self._ConfigArgs[path] then
|
||
local args = self._ConfigArgs[path]
|
||
local func = XConfigUtil.GetReadHandler(args[1])
|
||
if func then
|
||
local config = func(path, args[2], args[3])
|
||
if args[4] ~= XConfigUtil.CacheType.Temp then --临时的表格不缓存
|
||
self._Configs[path] = config
|
||
end
|
||
if IsWindowsEditor then --在编辑器状态下检查如果是私有的表格, 然后界面没有引用的话可能是有问题的
|
||
if args[4] == XConfigUtil.CacheType.Private then
|
||
XMVCA:AddConfigProfiler(config, path)
|
||
if not XMVCA:_CheckControlRef(self._Id) then
|
||
XLog.Error(string.format("配置表为私有 %s, 但目前暂无control使用.", path))
|
||
end
|
||
end
|
||
end
|
||
return config
|
||
end
|
||
else
|
||
XLog.Error("can not find config args: " .. path)
|
||
end
|
||
end
|
||
|
||
---清理一个配置表
|
||
---@param path string 配置表路径
|
||
function XConfigUtil:Clear(path)
|
||
local config = self._Configs[path]
|
||
if config then
|
||
XTableManager.ReleaseTable(path)
|
||
self._Configs[path] = nil
|
||
end
|
||
end
|
||
|
||
---清理所有内部配置表, 在XModel.ClearPrivate时执行
|
||
function XConfigUtil:ClearPrivate()
|
||
for path, arg in pairs(self._ConfigArgs) do
|
||
local cacheType = arg[4]
|
||
if cacheType == XConfigUtil.CacheType.Private then
|
||
if self._Configs[path] then
|
||
XTableManager.ReleaseTable(path)
|
||
self._Configs[path] = nil
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
---清理所有配置表
|
||
function XConfigUtil:Release()
|
||
for path, _ in pairs(self._Configs) do
|
||
XTableManager.ReleaseTable(path)
|
||
end
|
||
self._Configs = nil
|
||
self._ConfigArgs = nil
|
||
self._TablePath = nil
|
||
self._TableKey = nil
|
||
end
|