Exemple #1
0
        static void Main(string[] args)
        {
            // 初始化字段集合
            Program.Fields = new List <string>();

            // 存储参数
            dpz2.KeyValues <string> pairs = new dpz2.KeyValues <string>();
            string sign = "";

            // 获取参数
            for (int i = 0; i < args.Length; i++)
            {
                if (sign.IsNone())
                {
                    string argSign = args[i];
                    if (argSign.StartsWith("-") || argSign.StartsWith("/"))
                    {
                        sign = argSign.Substring(1);
                    }
                    else
                    {
                        Say($"不支持的参数定义:{argSign}");
                        return;
                    }
                }
                else
                {
                    string argValue = args[i];
                    pairs[sign] = argValue;
                    sign        = "";
                }
            }

            string nameSpace = pairs["namespace"];

            if (nameSpace.IsNone())
            {
                Say("未发现命名空间定义地址!");
                Console.WriteLine();
                SayHelp();
                return;
            }

            string url = pairs["url"];

            if (url.IsNone())
            {
                Say("未发现Xml定义地址!");
                Console.WriteLine();
                SayHelp();
                return;
            }

            string setting = pairs["setting"];

            if (setting.IsNone())
            {
                Say("未发现主setting定义相对地址!");
                Console.WriteLine();
                SayHelp();
                return;
            }

            string path = pairs["path"];

            if (path.IsNone())
            {
                Say("未发现存储路径!");
                return;
            }

            // 处理存储路径
            path = path.Replace("\\", "/");
            if (!path.EndsWith("/"))
            {
                path += "/";
            }
            //string sourcePath = path + "Tables";
            //Say($"建立存储文件夹 {sourcePath} ...");
            //if (!System.IO.Directory.Exists(sourcePath)) System.IO.Directory.CreateDirectory(sourcePath);

            // 获取定义xml文本
            Say($"正在从 {url}{setting} 下载XML定义数据 ...");
            string xmlStr = dpz2.Net.Https.Get(url + setting);

            Say($"下载完成");

            // 解析定义
            using (dpz2.Xml.XmlRoot xml = new dpz2.Xml.XmlRoot(xmlStr)) {
                Say($"当前XML定义版本 {xml["database"].Attr["version"]}");

                // 判断并新建Tables类文件
                string tablesPath = path + "Tables.cs";
                if (!System.IO.File.Exists(tablesPath))
                {
                    using (dpz2.File.UTF8File file = new dpz2.File.UTF8File(tablesPath, System.IO.FileMode.Create)) {
                        file.WriteLine("");
                    }
                }

                // 创建一个新的文件
                using (dpz2.File.UTF8File file = new dpz2.File.UTF8File(tablesPath, System.IO.FileMode.Truncate)) {
                    // 初始化Tables类文件
                    Say($"Tables类文件初始定义 ...");
                    file.AppendLine($"using System;");
                    file.AppendLine($"using System.Collections.Generic;");
                    file.AppendLine($"using System.Text;");
                    file.AppendLine($"");

                    // 输出命名空间
                    file.AppendLine($"namespace {nameSpace} {{");
                    file.AppendLine($"");

                    // 输出类信息
                    file.AppendLine($"    /// <summary>");
                    file.AppendLine($"    /// Orm表格信息集合");
                    file.AppendLine($"    /// </summary>");
                    file.AppendLine($"    public class Tables : dpz2.db.OrmTables {{");
                    file.AppendLine($"");

                    // 获取所有的platform
                    var platforms = xml["database"].GetNodesByName("platform", false);
                    foreach (var platform in platforms)
                    {
                        // platform.Name
                        var platformName = platform.Attr["name"];

                        Say($"处理中 ...", platformName);

                        // 获取所有的table
                        var tables = platform.GetNodesByName("table", false);
                        foreach (var table in tables)
                        {
                            string tableName = table.Attr["name"];

                            // 初始化Tables类文件
                            Say($"输出Tables类文件中的 {tableName} 表定义 ...");
                            file.AppendLine($"        // {tableName}表对象缓存");
                            file.AppendLine($"        private {platformName}.{tableName} _cache{tableName} = null;");
                            file.AppendLine($"");
                            file.AppendLine($"        /// <summary>");
                            file.AppendLine($"        /// 获取 {tableName} 表定义");
                            file.AppendLine($"        /// </summary>");
                            file.AppendLine($"        public {platformName}.{tableName} {tableName} {{");
                            file.AppendLine($"            get {{");
                            file.AppendLine($"                if (_cache{tableName} == null) _cache{tableName} = new {platformName}.{tableName}();");
                            file.AppendLine($"                return _cache{tableName};");
                            file.AppendLine($"            }}");
                            file.AppendLine($"        }}");
                            file.AppendLine($"");

                            //创建类文件
                            Say($"处理类文件 {tableName} ...", platformName);
                            OrmCreator.CreateTableClass(url, path, platformName, nameSpace, table);
                        }
                    }

                    Say($"Tables类名称查找定义 ...");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 根据名称获取表格定义");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        protected override dpz2.db.OrmTable OnGetTable(string name) {{");
                    file.AppendLine($"            switch (name) {{");
                    file.AppendLine($"");
                    foreach (var platform in platforms)
                    {
                        // 获取所有的table
                        var tables = platform.GetNodesByName("table", false);
                        foreach (var table in tables)
                        {
                            string tableName = table.Attr["name"];
                            file.AppendLine($"                case \"{tableName}\": return this.{tableName};");
                        }
                    }
                    file.AppendLine($"                default: throw new Exception(\"未找到对应表定义\");");
                    file.AppendLine($"            }}");
                    file.AppendLine($"        }}");
                    file.AppendLine($"");

                    Say($"Tables类释放资源定义 ...");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 释放资源");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        protected override void OnDispose() {{");
                    file.AppendLine($"            base.OnDispose();");
                    file.AppendLine($"");
                    foreach (var platform in platforms)
                    {
                        // 获取所有的table
                        var tables = platform.GetNodesByName("table", false);
                        foreach (var table in tables)
                        {
                            string tableName = table.Attr["name"];
                            file.AppendLine($"            if (_cache{tableName} != null) {{");
                            file.AppendLine($"                _cache{tableName}.Dispose();");
                            file.AppendLine($"                _cache{tableName} = null;");
                            file.AppendLine($"            }}");
                            file.AppendLine($"");
                        }
                    }
                    file.AppendLine($"        }}");
                    file.AppendLine($"");

                    Say($"Tables类文件结尾定义 ...");
                    file.AppendLine($"");
                    file.AppendLine($"    }}");

                    file.AppendLine($"");
                    file.AppendLine($"}}");
                }

                // 判断并新建fields类文件
                string fieldsPath = path + "Fields.cs";
                if (!System.IO.File.Exists(fieldsPath))
                {
                    using (dpz2.File.UTF8File file = new dpz2.File.UTF8File(fieldsPath, System.IO.FileMode.Create)) {
                        file.WriteLine("");
                    }
                }

                // 创建一个新的文件
                using (dpz2.File.UTF8File file = new dpz2.File.UTF8File(fieldsPath, System.IO.FileMode.Truncate)) {
                    // 初始化Tables类文件
                    Say($"Fields ...");
                    file.AppendLine($"using System;");
                    file.AppendLine($"using System.Collections.Generic;");
                    file.AppendLine($"using System.Text;");
                    file.AppendLine($"");

                    // 输出命名空间
                    file.AppendLine($"namespace {nameSpace} {{");
                    file.AppendLine($"");

                    // 输出类信息
                    file.AppendLine($"    /// <summary>");
                    file.AppendLine($"    /// Orm表格信息集合");
                    file.AppendLine($"    /// </summary>");
                    file.AppendLine($"    public class Fields : dpz2.db.OrmFields {{");
                    file.AppendLine($"");
                    file.AppendLine($"        // 空表对象");
                    file.AppendLine($"        private dpz2.db.SqlUnits.Table _table = new dpz2.db.SqlUnits.Table(\"\");");
                    file.AppendLine($"");

                    foreach (var field in Program.Fields)
                    {
                        // 初始化Tables类文件
                        Say($"输出Fields类文件中的 {field} 字段定义 ...");
                        file.AppendLine($"        // {field} 字段对象缓存");
                        file.AppendLine($"        private dpz2.db.SqlUnits.TableField _cache{field} = null;");
                        file.AppendLine($"");
                        file.AppendLine($"        /// <summary>");
                        file.AppendLine($"        /// 获取 {field} 字段定义");
                        file.AppendLine($"        /// </summary>");
                        file.AppendLine($"        public dpz2.db.SqlUnits.TableField {field} {{");
                        file.AppendLine($"            get {{");
                        file.AppendLine($"                if (Equals(_cache{field}, null)) _cache{field} = new dpz2.db.SqlUnits.TableField(_table,\"{field}\");");
                        file.AppendLine($"                return _cache{field};");
                        file.AppendLine($"            }}");
                        file.AppendLine($"        }}");
                        file.AppendLine($"");
                    }

                    Say($"Fields类释放资源定义 ...");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 释放资源");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        protected override void OnDispose() {{");
                    file.AppendLine($"            base.OnDispose();");
                    file.AppendLine($"");

                    foreach (var field in Program.Fields)
                    {
                        file.AppendLine($"            if (!Equals(_cache{field}, null)) {{");
                        file.AppendLine($"                _cache{field}.Dispose();");
                        file.AppendLine($"                _cache{field} = null;");
                        file.AppendLine($"            }}");
                        file.AppendLine($"");
                    }

                    file.AppendLine($"        }}");
                    file.AppendLine($"");

                    Say($"Fields类文件结尾定义 ...");
                    file.AppendLine($"");
                    file.AppendLine($"    }}");

                    file.AppendLine($"");
                    file.AppendLine($"}}");
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// 生成表类文件
        /// </summary>
        /// <param name="url"></param>
        /// <param name="platform"></param>
        /// <param name="ns"></param>
        /// <param name="table"></param>
        public static void CreateTableClass(string url, string path, string platform, string ns, dpz2.Xml.XmlNode table)
        {
            // 建立平台文件夹
            string platformPath = path + platform;

            if (!System.IO.Directory.Exists(platformPath))
            {
                System.IO.Directory.CreateDirectory(platformPath);
            }

            // 获取表名称
            string tableName    = table.Attr["name"];
            string sign         = $"{platform}.{tableName}";
            string tableVersion = table.Attr["version"];

            Program.Say($"定义版本 {tableVersion}", sign);

            // 下载表配置文件
            string xmlPath = table.Attr["path"];

            Program.Say($"正在从 {url}{xmlPath} 下载表格XML定义数据 ...", sign);
            string xmlStr = dpz2.Net.Https.Get(url + xmlPath);

            Program.Say($"下载完成", sign);

            // 解析定义
            using (dpz2.Xml.XmlRoot xml = new dpz2.Xml.XmlRoot(xmlStr)) {
                var xmlTable = xml["table"];
                var fields   = xmlTable.GetNodesByName("field", false);

                // 定义类存储路径
                string tablePath = platformPath + "/" + tableName + ".cs";

                // 判断并新建文件
                if (!System.IO.File.Exists(tablePath))
                {
                    using (dpz2.File.UTF8File file = new dpz2.File.UTF8File(tablePath, System.IO.FileMode.Create)) {
                        file.WriteLine("");
                    }
                }

                // 创建一个新的文件
                using (dpz2.File.UTF8File file = new dpz2.File.UTF8File(tablePath, System.IO.FileMode.Truncate)) {
                    file.AppendLine($"using System;");
                    file.AppendLine($"using System.Collections.Generic;");
                    file.AppendLine($"using System.Text;");
                    file.AppendLine($"using dpz2;");
                    file.AppendLine($"");

                    // 输出命名空间
                    file.AppendLine($"namespace {ns}.{platform} {{");
                    file.AppendLine($"");

                    // 输出类信息
                    file.AppendLine($"    /// <summary>");
                    file.AppendLine($"    /// {xmlTable.Attr["title"]}");
                    file.AppendLine($"    /// {xmlTable.Attr["description"]}");
                    file.AppendLine($"    /// Version {tableVersion}");
                    file.AppendLine($"    /// </summary>");
                    file.AppendLine($"    public class {tableName} : dpz2.db.OrmTable {{");
                    file.AppendLine($"");

                    // 输出行操作类信息
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// {xmlTable.Attr["title"]} 行数据操作器");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        public class RowOperator : dpz2.db.RowOperator {{");
                    file.AppendLine($"");
                    file.AppendLine($"            /// <summary>");
                    file.AppendLine($"            /// 对象实例化");
                    file.AppendLine($"            /// </summary>");
                    file.AppendLine($"            /// <param name=\"row\">行数据对象</param>");
                    file.AppendLine($"            public RowOperator(dpz2.db.Row row) : base(row) {{ }}");
                    file.AppendLine($"");
                    file.AppendLine($"            /// <summary>");
                    file.AppendLine($"            /// 设置ID");
                    file.AppendLine($"            /// </summary>");
                    file.AppendLine($"            /// <param name=\"value\">值</param>");
                    file.AppendLine($"            public RowOperator SetID(string value) {{");
                    file.AppendLine($"                base.Row[\"ID\"] = value;");
                    file.AppendLine($"                return this;");
                    file.AppendLine($"            }}");
                    file.AppendLine($"");
                    file.AppendLine($"            /// <summary>");
                    file.AppendLine($"            /// 设置ID");
                    file.AppendLine($"            /// </summary>");
                    file.AppendLine($"            /// <param name=\"value\">值</param>");
                    file.AppendLine($"            public RowOperator SetID(long value) {{");
                    file.AppendLine($"                base.Row[\"ID\"] = \"\" + value;");
                    file.AppendLine($"                return this;");
                    file.AppendLine($"            }}");
                    file.AppendLine($"");
                    file.AppendLine($"            /// <summary>");
                    file.AppendLine($"            /// 获取或设置ID");
                    file.AppendLine($"            /// </summary>");
                    file.AppendLine($"            /// <param name=\"value\">值</param>");
                    file.AppendLine($"            public long ID {{ get {{ return base.Row[\"ID\"].ToLong(); }} set {{ base.Row[\"ID\"] = \"\" + value; }} }}");
                    foreach (var field in fields)
                    {
                        string fieldName = field.Attr["name"];
                        var    fieldData = field["data"];
                        // 添加到字段集合
                        if (!Program.Fields.Contains(fieldName))
                        {
                            Program.Fields.Add(fieldName);
                        }
                        file.AppendLine($"");
                        file.AppendLine($"            /// <summary>");
                        file.AppendLine($"            /// 设置{field.Attr["title"]}");
                        file.AppendLine($"            /// </summary>");
                        file.AppendLine($"            /// <param name=\"value\">值</param>");
                        file.AppendLine($"            public RowOperator Set{fieldName}(string value) {{");
                        file.AppendLine($"                base.Row[\"{fieldName}\"] = value;");
                        file.AppendLine($"                return this;");
                        file.AppendLine($"            }}");

                        // 添加对类型的特殊支持
                        switch (fieldData.Attr["type"].ToLower())
                        {
                        case "numeric":
                            if (fieldData.Attr["float"].ToLower() == "0")
                            {
                                // 长整型
                                file.AppendLine($"");
                                file.AppendLine($"            /// <summary>");
                                file.AppendLine($"            /// 设置{field.Attr["title"]}");
                                file.AppendLine($"            /// </summary>");
                                file.AppendLine($"            /// <param name=\"value\">值</param>");
                                file.AppendLine($"            public RowOperator Set{fieldName}(long value) {{");
                                file.AppendLine($"                base.Row[\"{fieldName}\"] = \"\" + value;");
                                file.AppendLine($"                return this;");
                                file.AppendLine($"            }}");
                                file.AppendLine($"");
                                file.AppendLine($"            /// <summary>");
                                file.AppendLine($"            /// 获取或设置{field.Attr["title"]}");
                                file.AppendLine($"            /// </summary>");
                                file.AppendLine($"            /// <param name=\"value\">值</param>");
                                file.AppendLine($"            public long {fieldName} {{ get {{ return base.Row[\"{fieldName}\"].ToLong(); }} set {{ base.Row[\"{fieldName}\"] = \"\" + value; }} }}");
                            }
                            else
                            {
                                // 浮点类型
                                file.AppendLine($"");
                                file.AppendLine($"            /// <summary>");
                                file.AppendLine($"            /// 设置{field.Attr["title"]}");
                                file.AppendLine($"            /// </summary>");
                                file.AppendLine($"            /// <param name=\"value\">值</param>");
                                file.AppendLine($"            public RowOperator Set{fieldName}(double value) {{");
                                file.AppendLine($"                base.Row[\"{fieldName}\"] = \"\" + value;");
                                file.AppendLine($"                return this;");
                                file.AppendLine($"            }}");
                                file.AppendLine($"");
                                file.AppendLine($"            /// <summary>");
                                file.AppendLine($"            /// 获取或设置{field.Attr["title"]}");
                                file.AppendLine($"            /// </summary>");
                                file.AppendLine($"            /// <param name=\"value\">值</param>");
                                file.AppendLine($"            public double {fieldName} {{ get {{ return base.Row[\"{fieldName}\"].ToDouble(); }} set {{ base.Row[\"{fieldName}\"] = \"\" + value; }} }}");
                            }
                            break;

                        case "int":
                            // 浮点类型
                            file.AppendLine($"");
                            file.AppendLine($"            /// <summary>");
                            file.AppendLine($"            /// 设置{field.Attr["title"]}");
                            file.AppendLine($"            /// </summary>");
                            file.AppendLine($"            /// <param name=\"value\">值</param>");
                            file.AppendLine($"            public RowOperator Set{fieldName}(int value) {{");
                            file.AppendLine($"                base.Row[\"{fieldName}\"] = \"\" + value;");
                            file.AppendLine($"                return this;");
                            file.AppendLine($"            }}");
                            file.AppendLine($"");
                            file.AppendLine($"            /// <summary>");
                            file.AppendLine($"            /// 获取或设置{field.Attr["title"]}");
                            file.AppendLine($"            /// </summary>");
                            file.AppendLine($"            /// <param name=\"value\">值</param>");
                            file.AppendLine($"            public int {fieldName} {{ get {{ return base.Row[\"{fieldName}\"].ToInteger(); }} set {{ base.Row[\"{fieldName}\"] = \"\" + value; }} }}");
                            break;

                        default:
                            break;
                        }
                    }
                    file.AppendLine($"");
                    file.AppendLine($"            /// <summary>");
                    file.AppendLine($"            /// 按照键进行值设置");
                    file.AppendLine($"            /// </summary>");
                    file.AppendLine($"            /// <param name=\"key\">键</param>");
                    file.AppendLine($"            /// <param name=\"value\">值</param>");
                    file.AppendLine($"            protected override void OnSetValue(string key, string value) {{");
                    file.AppendLine($"                switch (key) {{");
                    file.AppendLine($"                    case \"ID\": base.Row[\"ID\"] = value; break;");
                    foreach (var field in fields)
                    {
                        string fieldName = field.Attr["name"];
                        file.AppendLine($"                    case \"{fieldName}\": base.Row[\"{fieldName}\"] = value; break;");
                    }
                    file.AppendLine($"                    default: base.OnSetValue(key, value); break;");
                    file.AppendLine($"                }}");
                    file.AppendLine($"            }}");
                    file.AppendLine($"");

                    file.AppendLine($"        }}");
                    file.AppendLine($"");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 获取*字段定义");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        public dpz2.db.SqlUnits.TableField All {{ get; private set; }}");
                    file.AppendLine($"");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 获取ID字段定义");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        public dpz2.db.SqlUnits.TableField ID {{ get; private set; }}");
                    foreach (var field in fields)
                    {
                        string fieldName = field.Attr["name"];
                        file.AppendLine($"");
                        file.AppendLine($"        /// <summary>");
                        file.AppendLine($"        /// 获取{field.Attr["title"]}字段定义");
                        file.AppendLine($"        /// </summary>");
                        file.AppendLine($"        public dpz2.db.SqlUnits.TableField {fieldName} {{ get; private set; }}");
                    }
                    file.AppendLine($"");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 创建一个行数据操作器");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        /// <param name=\"row\">行数据对象</param>");
                    file.AppendLine($"        protected override dpz2.db.RowOperator OnRowerCreate(dpz2.db.Row row) {{");
                    file.AppendLine($"            return new RowOperator(row);");
                    file.AppendLine($"        }}");
                    file.AppendLine($"");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 创建一个行数据操作器");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        /// <param name=\"row\">行数据对象</param>");
                    file.AppendLine($"        public new RowOperator Rower(dpz2.db.Row row = null) {{");
                    file.AppendLine($"            if (row == null) row = new dpz2.db.Row();");
                    file.AppendLine($"            return new RowOperator(row);");
                    file.AppendLine($"        }}");
                    file.AppendLine($"");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 获取字段定义");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        /// <param name=\"name\">字段名称</param>");
                    file.AppendLine($"        protected override dpz2.db.SqlUnits.TableField OnGetField(string name) {{");
                    file.AppendLine($"            switch (name) {{");
                    file.AppendLine($"                case \"ID\": return this.ID;");
                    foreach (var field in fields)
                    {
                        string fieldName = field.Attr["name"];
                        file.AppendLine($"                case \"{fieldName}\": return this.{fieldName};");
                    }
                    file.AppendLine($"                default: return base.OnGetField(name);");
                    file.AppendLine($"            }}");
                    file.AppendLine($"        }}");
                    file.AppendLine($"");
                    file.AppendLine($"        /// <summary>");
                    file.AppendLine($"        /// 对象实例化");
                    file.AppendLine($"        /// </summary>");
                    file.AppendLine($"        public {tableName}() : base(\"{tableName}\") {{");
                    file.AppendLine($"            this.All = new dpz2.db.SqlUnits.TableField(this, \"*\");");
                    file.AppendLine($"            this.ID = new dpz2.db.SqlUnits.TableField(this, \"ID\");");
                    foreach (var field in fields)
                    {
                        string fieldName = field.Attr["name"];
                        file.AppendLine($"            this.{fieldName} = new dpz2.db.SqlUnits.TableField(this, \"{fieldName}\");");
                    }
                    file.AppendLine($"        }}");

                    file.AppendLine($"");
                    file.AppendLine($"    }}");

                    file.AppendLine($"");
                    file.AppendLine($"}}");
                }
            }
        }