namespace Framework.Cli.Generate { using Framework.DataAccessLayer; using System; using System.Collections.Generic; using System.Linq; using System.Text; /// /// Generate CSharp code. /// internal class CSharpGenerate { public CSharpGenerate(MetaCSharp metaCSharp) { this.MetaCSharp = metaCSharp; } public readonly MetaCSharp MetaCSharp; /// /// Generate CSharp namespace for every database schema. /// private static void SchemaName(bool isFrameworkDb, MetaCSharp metaCSharp, StringBuilder result) { var schemaNameList = metaCSharp.List.GroupBy(item => new { item.Schema.SchemaName, item.SchemaNameCSharp }, (key, group) => key).ToArray(); bool isFirst = true; foreach (var item in schemaNameList) { if (isFirst) { isFirst = false; } else { result.AppendLine(); } result.AppendLine(string.Format("namespace Database.{0}", item.SchemaNameCSharp)); result.AppendLine("{"); result.AppendLine(" using Framework.DataAccessLayer;"); result.AppendLine(" using System;"); result.AppendLine(); TableNameClass(metaCSharp, item.SchemaName, result); result.AppendLine("}"); } } /// /// Return (null, 4, true, "Text"). /// private static string CSharpParam(T value) { Type type = UtilFramework.TypeUnderlying(typeof(T)); string result; if (value == null) { if (type == typeof(string)) { result = "null"; } else { result = Activator.CreateInstance(type).ToString(); } } else { result = value.ToString(); } if (type == typeof(bool)) { result = result.ToLower(); } if (type == typeof(string) && value != null) { string valueString = (string)(object)value; valueString = valueString.Replace("\"", @"\"""); result = string.Format("\"{0}\"", valueString); } return result; } private static void CSharpParam(T valueDefault, T value, out string param, out string paramIsNull) { if (value == null) { value = valueDefault; } param = CSharpParam(value); if (value == null) { paramIsNull = CSharpParam(true); } else { paramIsNull = CSharpParam(false); } } /// /// Generate CSharp class for every database table. /// private static void TableNameClass(MetaCSharp metaCSharp, string schemaName, StringBuilder result) { var tableNameList = metaCSharp.List.Where(item => item.Schema.SchemaName == schemaName).GroupBy(item => new { item.Schema.SchemaName, item.Schema.TableName, item.TableNameCSharp }, (key, group) => key).ToArray(); List nameExceptList = new List(); bool isFirst = true; foreach (var item in tableNameList) { if (isFirst) { isFirst = false; } else { result.AppendLine(); } result.AppendLine(string.Format(" [SqlTable(\"{0}\", \"{1}\")]", item.SchemaName, item.TableName)); result.AppendLine(string.Format(" public class {0} : Row", item.TableNameCSharp)); result.AppendLine(" {"); FieldNameProperty(metaCSharp, schemaName, item.TableName, result); result.AppendLine(" }"); // result.AppendLine(); // FieldNameClass(metaCSharp, schemaName, item.TableName, result); } } /// /// Generate CSharp property for every database field. /// private static void FieldNameProperty(MetaCSharp metaCSharp, string schemaName, string tableName, StringBuilder result) { var fieldNameList = metaCSharp.List.Where(item => item.Schema.SchemaName == schemaName && item.Schema.TableName == tableName).ToArray(); bool isFirst = true; foreach (var item in fieldNameList) { if (isFirst) { isFirst = false; } else { result.AppendLine(); } if (item.FrameworkTypeEnum == FrameworkTypeEnum.None) { UtilCliInternal.ConsoleWriteLineColor(string.Format("Warning! Type not supported by framework. ({0}.{1}.{2})", item.Schema.SchemaName, item.Schema.TableName, item.Schema.FieldName), ConsoleColor.Yellow); // Warning } else { string typeCSharp = UtilGenerate.SqlTypeToCSharpType(item.Schema.SqlType, item.Schema.IsNullable); if (item.IsPrimaryKey == false) { result.AppendLine(string.Format(" [SqlField(\"{0}\", {2})]", item.Schema.FieldName, item.TableNameCSharp + "_" + item.FieldNameCSharp, nameof(FrameworkTypeEnum) + "." + item.FrameworkTypeEnum.ToString())); } else { result.AppendLine(string.Format(" [SqlField(\"{0}\", {2}, {3})]", item.Schema.FieldName, item.TableNameCSharp + "_" + item.FieldNameCSharp, item.IsPrimaryKey.ToString().ToLower(), nameof(FrameworkTypeEnum) + "." + item.FrameworkTypeEnum.ToString())); } result.AppendLine(string.Format(" public " + typeCSharp + " {0} {{ get; set; }}", item.FieldNameCSharp)); } } } /// /// Generate CSharp class for every database field. /// private static void FieldNameClass(MetaCSharp metaCSharp, string schemaName, string tableName, StringBuilder result) { var fieldNameList = metaCSharp.List.Where(item => item.Schema.SchemaName == schemaName && item.Schema.TableName == tableName).ToArray(); bool isFirst = true; foreach (var item in fieldNameList) { if (isFirst) { isFirst = false; } else { result.AppendLine(); } result.AppendLine(" public class " + item.TableNameCSharp + "_" + item.FieldNameCSharp + " : Cell<" + item.TableNameCSharp + "> { }"); } } /// /// Generate CSharp code for file Database.cs /// public void Run(bool isFrameworkDb, out string cSharp) { StringBuilder result = new StringBuilder(); result.AppendLine("// Do not modify this file. It's generated by Framework.Cli generate command."); // File Database.cs result.AppendLine(); SchemaName(isFrameworkDb, MetaCSharp, result); cSharp = result.ToString(); } } }