static void LoadData() { Util.LogFormat("# 共需加载配置文件 {0} 个", ConfigWrap.Configs.Count); List <string> warnings = new List <string>(); foreach (var item in ConfigWrap.Configs) { ConfigWrap cfg = item.Value; long start = DateTime.Now.Ticks; cfg.LoadData(); long end = DateTime.Now.Ticks; float second = (end - start) * 1f / TimeSpan.TicksPerSecond; string output = string.Format("{0,-40} 耗时 {1:F3}s", $"\t>{cfg.FullName}", second); Util.Log(output); if ((end - start) >= TimeSpan.TicksPerSecond) { warnings.Add(output); } } Util.Log("\n"); Util.LogWarningFormat("# 加载耗时严重的配置文件 {0} 个", warnings.Count); for (int i = 0; i < warnings.Count; i++) { Util.LogWarning(warnings[i]); } Util.Log("\n"); }
public MsSqlDbProvider(ConfigWrap config) { QuarantineDbConnection = config.QuarantineDbConnection; Radius = config.Radius; if (_taskUpdatePhoneMemory == null) { lock (_lock) { if (_taskUpdatePhoneMemory == null) { _taskUpdatePhoneMemory = Task.Run(() => { while (true) { try { CheckUpdatePhones(); }catch (Exception e) { // this ignore } Task.WaitAny(Task.Delay(5000)); } }); } } } }
/// <summary> /// 一张表的结构 /// </summary> static void GenConfig(StringBuilder builder, ClassWrap cls) { if (!cls.IsConfig()) { return; } ConfigWrap config = ConfigWrap.Get(cls.FullName); string cfgName = GetCfgName(cls.Name); string relative = cls.FullName.Replace(Setting.DotSplit[0], '/').ToLower(); string fullName = GetFormatFullName(cls.FullName); string parseName = GetDynamicName(cls); builder.AppendLine($"/** {cls.Name}表数据类*/") .AppendLine($"export class {cfgName} extends Stream {{") .Space().AppendLine($"static readonly refence = '{GetCfgName(fullName)}';") .Space().AppendLine("get length() { return this._cfgs ? this._cfgs.length : 0; }") .Space().AppendLine("get cfgs() { return this._cfgs; }") .Space().AppendLine($"private _cfgs: {cls.Name}[] = [];") .Space().AppendLine($"private _key2idx: Map<number, number> = new Map();") .Space().AppendLine("constructor(rootDir: string) {") .Space(2).AppendLine($"super(rootDir + '{relative}{Setting.DataFileExt}');") .Space().AppendLine("}") .Space().AppendLine($"/**key索引数据(主键:{config.Index.Name})*/") .Space().AppendLine($"Get(key: number): {cls.Name} | undefined {{") .Space(2).AppendLine("let idx = this._key2idx.get(key);") .Space(2).AppendLine("if (idx == undefined) {") .Space(3).AppendLine("console.error(`${this.path} key does not exist:${key}`);") .Space(3).AppendLine("return undefined;") .Space(2).AppendLine("}") .Space(2).AppendLine("if (this.hasLoaded) {") .Space(3).AppendLine("return this._cfgs[idx];") .Space(2).AppendLine("}") .Space(2).AppendLine("else {") .Space(3).AppendLine("this.LoadConfig();") .Space(3).AppendLine("return this._cfgs[idx];") .Space(2).AppendLine("}") .Space().AppendLine("}") .Space().AppendLine("/**下标索引数据*/") .Space().AppendLine("At(idx:number){") .Space(2).AppendLine("if (this.hasLoaded) {") .Space(3).AppendLine("return this._cfgs[idx];") .Space(2).AppendLine("}") .Space(2).AppendLine("else {") .Space(3).AppendLine("this.LoadConfig();") .Space(3).AppendLine("return this._cfgs[idx];") .Space(2).AppendLine("}") .Space().AppendLine("}") .Space().AppendLine("protected ParseConfig() {") .Space(2).AppendLine($"this._cfgs = this.GetList('{parseName}');") .Space(2).AppendLine("for (let index = 0; index < this._cfgs.length; index++) {") .Space(3).AppendLine("const item = this._cfgs[index];") .Space(3).AppendLine($"this._key2idx.set(item.{config.Index.Name}, index);") .Space(2).AppendLine("}") .Space().AppendLine("}") .Space().AppendLine("[Symbol.iterator]() { return this._cfgs.values(); }") .AppendLine("}"); }
public static void Gen() { StringBuilder builder = new StringBuilder(); var configs = ConfigWrap.GetExports(); for (int i = 0; i < configs.Count; i++) { var cfg = configs[i]; builder.AppendLine(cfg.Data.ExportData()); string filePath = Path.Combine(Setting.DataDir, cfg.OutputFile + Setting.DataFileExt); Util.SaveFile(filePath.ToLower(), builder.ToString()); builder.Clear(); } }
public static void Gen() { var configs = ConfigWrap.GetExports(); for (int i = 0; i < configs.Count; i++) { var cfg = configs[i]; byte[] bytes = null; int length = cfg.Data.ExportBinary(ref bytes, 0); string filePath = Path.Combine(Setting.BinaryDir, cfg.OutputFile + Setting.DataFileExt); byte[] content = new byte[length]; System.Buffer.BlockCopy(bytes, 0, content, 0, length); Util.SaveFile(filePath.ToLower(), content); } }
protected void DataError(Data data, string error) { FClass root = data.Host; while (!root.IsRoot) { root = root.Host; } string fullName = root.Define.FullName; var config = ConfigWrap.Get(fullName); var cls = ClassWrap.Get(fullName); int index = cls.Fields.IndexOf(config.Index); Util.LogError($"【{root.Values[index]}】{_define.Host.FullName} 字段:{_define.Name}({_define.FullName}) {error}"); }
static void LoadFunc(ConfigWrap cfg) { int level1 = SEM_LEVEL + 1; int level2 = SEM_LEVEL + 2; var keyType = Util.CorrectFullType(cfg.Index.FullName); var varType = Util.CorrectFullType(cfg.FullName); builder.Space(MEM_LEVEL).AppendLine($"public static Dictionary<{cfg.Index.FullName}, {varType}> Load()"); builder.Space(MEM_LEVEL).AppendLine("{"); { builder.Space(SEM_LEVEL).AppendLine($"var dict = new Dictionary<{cfg.Index.FullName}, {varType}>();"); builder.Space(SEM_LEVEL).AppendLine($"var path = \"{cfg.FullName.Replace(Setting.DotSplit[0], '/')}{Setting.DataFileExt}\";"); builder.Space(SEM_LEVEL).AppendLine($"try"); builder.Space(SEM_LEVEL).AppendLine($"{{"); { builder.Space(level1).AppendLine($"var data = new DataStream(path, Encoding.UTF8);"); builder.Space(level1).AppendLine($"int length = data.GetArrayLength();"); builder.Space(level1).AppendLine($"for (int i = 0; i < length; i++)"); builder.Space(level1).AppendLine($"{{"); { builder.Space(level2).AppendLine($"var v = new {varType}(data);"); builder.Space(level2).AppendLine($"dict.Add(v.{cfg.Index.Name}, v);"); } builder.Space(level1).AppendLine($"}}"); } builder.Space(SEM_LEVEL).AppendLine($"}}"); builder.Space(SEM_LEVEL).AppendLine($"catch (Exception e)"); builder.Space(SEM_LEVEL).AppendLine($"{{"); { builder.Space(level1).AppendLine($"UnityEngine.Debug.LogError($\"{{path}}解析异常~\\n{{e.Message}}\\n{{e.StackTrace}}\");"); builder.AppendLine($"#if UNITY_EDITOR"); builder.Space(level1).AppendLine($"UnityEngine.Debug.LogError($\"最后一条数据Key:{{dict.Last().Key}}.\");"); builder.AppendLine($"#endif"); } builder.Space(SEM_LEVEL).AppendLine($"}}"); builder.Space(SEM_LEVEL).AppendLine($"return dict;"); } builder.Space(MEM_LEVEL).AppendLine("}"); }
static void ConfigHelper() { builder.AppendLine(string.Join("\r\n", namespaces)); builder.AppendLine($"namespace {Setting.ModuleName}"); Start(0); { builder.Space(TYPE_LEVEL).AppendLine($"public partial class ConfigHelper"); Start(TYPE_LEVEL); { StringBuilder load = new StringBuilder(); var configs = ConfigWrap.GetExports(); for (int i = 0; i < configs.Count; i++) { var cfg = configs[i]; var key = cfg.Index.FullName; var value = cfg.FullName; var property = $"{Util.FirstCharUpper(cfg.Name)}s"; var field = $"_{cfg.Name.ToLower()}s"; builder.Space(MEM_LEVEL).AppendLine($"public Dictionary<{key}, {value}> {property} => {field};"); builder.Space(MEM_LEVEL).AppendLine($"private Dictionary<{key}, {value}> {field} = new Dictionary<{key}, {value}>();"); load.Space(SEM_LEVEL).AppendLine($"{field} = {cfg.FullName}.Load();"); } builder.Space(MEM_LEVEL).AppendLine("public void Load()"); builder.Space(MEM_LEVEL).AppendLine("{"); builder.Append(load.ToString()); builder.Space(MEM_LEVEL).AppendLine("}"); } End(TYPE_LEVEL); } End(0); string path = Path.Combine(Setting.CSDir, "ConfigHelper.cs"); Util.SaveFile(path, builder.ToString()); builder.Clear(); }
public override bool CheckColumn(bool remove) { if (_define.IsRaw) { base.CheckColumn(true); var config = ConfigWrap.Get(_define.Host.FullName); var cls = _define.Host; int index = cls.Fields.IndexOf(_define); var hash = new HashSet <Data>(config.Data.Values.MapTo <Data, Data>((data) => { FClass fcls = data as FClass; data = fcls.Values[index]; return(data); })); bool isOk = hash.Count == config.Data.Values.Count; if (!isOk) { Error($"Unique检查规则:数据重复!"); } return(isOk); } return(true); }
/// <summary> /// 数据结构配置表 /// </summary> private static void GenConfigTable() { StringBuilder builder = new StringBuilder(); builder.AppendLine("return {"); var cit = ConfigWrap.Configs.GetEnumerator(); while (cit.MoveNext()) { ConfigWrap cfg = cit.Current.Value; string method = string.Format("Get{0}", Util.CorrectFullType(cfg.FullName).Replace(new string(Setting.DotSplit), "")); string index = cfg.Index.Name; string relPath = cfg.OutputFile + Setting.DataFileExt; builder.Space().AppendFormat("{{ name = '{0}', method = '{1}', index = '{2}', output = '{3}' }},\n", cfg.Name, method, index, relPath.Replace("\\", "/").ToLower()); } builder.AppendLine("}"); string path = Path.Combine(Setting.LuaDir, DATA_CONFIG + ".lua"); var names = ConfigWrap.Configs.Select(item => $"---@field {item.Value.Name} string"); string content = string.Join("\n", names) + "\n---@class ConfigName\n" + builder.ToString(); Util.SaveFile(path, content); }
void OnGUI() { if (m_Text == null) { return; } if (GUI.Button(new Rect(100, 100, 150, 50), "测试LitJson")) { string str = m_Text.text; LitJson.JsonMapper.ToObject <Dictionary <string, List <TaskTalkCfg> > >(str); } if (GUI.Button(new Rect(250, 100, 150, 50), "测试FastJson")) { string str = m_Text.text; fastJSON.JSON.ToObject <Dictionary <string, List <TaskTalkCfg> > >(str); } if (GUI.Button(new Rect(400, 100, 150, 50), "测试System.Net.Json")) { string str = m_Text.text; System.Net.Json.JsonTextParser parser = new System.Net.Json.JsonTextParser(); parser.Parse(str); } if (GUI.Button(new Rect(550, 100, 150, 50), "测试Newtonsoft.Json")) { string str = m_Text.text; Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, List <TaskTalkCfg> > >(str); } if (m_Binary != null) { if (GUI.Button(new Rect(100, 150, 150, 50), "测试二进制首次不全读取")) { m_Stream = new MemoryStream(m_Binary.bytes); var dict = ConfigWrap.ToObjectList <string, TaskTalkCfg>(m_Stream); List <TaskTalkCfg> list; if (dict.ConfigTryGetValue("5", out list)) { } } if (GUI.Button(new Rect(250, 150, 150, 50), "二进制全部读取")) { m_Stream = new MemoryStream(m_Binary.bytes); ConfigWrap.ToObjectList <string, TaskTalkCfg>(m_Stream, true); } if (GUI.Button(new Rect(400, 150, 150, 50), "二进制全部读取携程")) { m_Stream = new MemoryStream(m_Binary.bytes); ConfigWrap.ToObjectList <string, TaskTalkCfg>(m_Stream, true, this); } if (GUI.Button(new Rect(550, 150, 150, 50), "二进制异步全读取")) { m_Stream = new MemoryStream(m_Binary.bytes); m_StartTime = Time.realtimeSinceStartup; ConfigWrap.ToObjectListAsync <string, TaskTalkCfg>(m_Stream, m_TaskDict, this, true, OnReadEnd); } if (GUI.Button(new Rect(700, 150, 150, 50), "二进制异步非全读取")) { m_Stream = new MemoryStream(m_Binary.bytes); m_StartTime = Time.realtimeSinceStartup; ConfigWrap.ToObjectListAsync <string, TaskTalkCfg>(m_Stream, m_TaskDict, this, false, OnReadEnd); } if (GUI.Button(new Rect(850, 150, 150, 50), "多线程异步全读取")) { m_Stream = new MemoryStream(m_Binary.bytes); m_StartTime = Time.realtimeSinceStartup; m_ThreadDone = false; m_StartTime = Time.realtimeSinceStartup; Loom.RunAsync( () => { m_ThreadDone = ConfigWrap.ToObjectListThreadAsyncc <string, TaskTalkCfg>(m_Stream, m_TaskDict, true, null); }); } } }
public override bool VerifyRule() { bool isOk = base.VerifyRule(); _refs = new RefRule[_ruleTable.Length]; for (int i = 0; i < _ruleTable.Length; i++) { RuleInfo info = _ruleTable[i]; string rule = info._rule; if (rule.IsEmpty()) { Warning($"Ref检查规则:表达式为空"); isOk = false; } else { string[] nodes = rule.Split(Setting.DotSplit, System.StringSplitOptions.RemoveEmptyEntries); if (nodes.Length == 3) { RefRule refr = new RefRule(); string targetName = $"{nodes[0]}.{nodes[1]}"; if (!ConfigWrap.IsConfig(targetName)) { Warning($"Ref检查规则:目标{targetName}配置表无法获取!"); isOk = false; } refr._target = ConfigWrap.Get(targetName); refr._targetField = nodes[2]; if (refr._target == null) { Warning("Ref检查规则:仅支持引用表结构最外层基础类型字段数据"); isOk = false; } else { var targetCls = ClassWrap.Get(targetName); var define = targetCls.Fields.Find(field => field.Name == refr._targetField); if (define.IsContainer) { if (define.OriginalType == Setting.LIST && define.GetItemDefine().IsClass) { Warning($"Ref检查规则:由于多态的复杂性,不支持list中数据类型为Class!仅支持基础类型."); isOk = false; } else if (define.OriginalType == Setting.DICT && define.GetValueDefine().IsClass) { Warning($"Ref检查规则:由于多态的复杂性,不支持dict.value数据类型为Class!仅支持基础类型."); isOk = false; } } else if (define.IsEnum || define.IsRaw) { } else { Warning($"Ref检查规则:由于多态的复杂性,不支持数据类型为Class!仅支持基础类型."); isOk = false; } } _refs[i] = refr; } else { Warning($"Ref检查规则:格式错误,正确格式[Namespace.Class.Field]"); isOk = false; } } } return(isOk); }
public DeviceController(IConfiguration configuration) { Config = new ConfigWrap(configuration); _repository = Config.Repository; }