示例#1
0
文件: Program.cs 项目: B-CK/ConfigGen
        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");
        }
示例#2
0
 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));
                     }
                 });
             }
         }
     }
 }
示例#3
0
        /// <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("}");
        }
示例#4
0
        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();
            }
        }
示例#5
0
        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);
            }
        }
示例#6
0
文件: Checker.cs 项目: B-CK/ConfigGen
        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}");
        }
示例#7
0
文件: Gen_CS.cs 项目: B-CK/ConfigGen
        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("}");
        }
示例#8
0
文件: Gen_CS.cs 项目: B-CK/ConfigGen
        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();
        }
示例#9
0
        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);
        }
示例#10
0
        /// <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);
        }
示例#11
0
    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);
                });
            }
        }
    }
示例#12
0
        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);
        }
示例#13
0
 public DeviceController(IConfiguration configuration)
 {
     Config      = new ConfigWrap(configuration);
     _repository = Config.Repository;
 }