/// <summary> /// Console log Integrate table relation. /// </summary> private static void Run(GenerateIntegrateResult generateIntegrateResult) { bool isFirst = true; List <string> result = new List <string>(); foreach (var item in generateIntegrateResult.Result) { var fieldList = UtilDalUpsertIntegrate.FieldIntegrateList(item.TypeRow, generateIntegrateResult.ResultReference); foreach (var field in fieldList) { if (field.IsId) { UtilDalType.TypeRowToTableNameSql(item.TypeRow, out string schemaNameSql, out string tableNameSql); UtilDalType.TypeRowToTableNameSql(field.TypeRowReference, out string schemaNameSqlReference, out string tableNameSqlReference); if (isFirst) { isFirst = false; Console.WriteLine("Integrate Table Relation"); } result.Add(string.Format("[{0}].[{1}].[{2}] --> [{3}].[{4}]", schemaNameSql, tableNameSql, field.FieldNameIdSql, schemaNameSqlReference, tableNameSqlReference)); } } } foreach (var item in result.Distinct().OrderBy(item => item)) { Console.WriteLine(item); } }
/// <summary> /// Constructor for Framework and Application. /// </summary> internal GenerateIntegrateItem(GenerateIntegrateResult owner, bool isFrameworkDb, bool isApplication, Type typeRow, IQueryable <Row> query) { this.Owner = owner; this.IsFrameworkDb = isFrameworkDb; this.IsApplication = isApplication; this.TypeRow = typeRow; this.Query = query; UtilDalType.TypeRowToTableNameSql(TypeRow, out _, out _); this.SchemaNameCSharp = UtilDalType.TypeRowToSchemaNameCSharp(TypeRow); this.TableNameCSharp = UtilDalType.TypeRowToTableNameCSharpWithoutSchema(TypeRow); }
/// <summary> /// Script to generate CSharp code. Returns true, if succsesful. /// </summary> /// <param name="isFrameworkDb">If true, generate CSharp code for Framework library (internal use only) otherwise generate code for Application.</param> public static bool Run(bool isFrameworkDb, AppCli appCli) { bool isSuccessful = true; MetaSql metaSql = new MetaSql(isFrameworkDb, appCli); MetaCSharp metaCSharp = new MetaCSharp(metaSql); // Generate CSharp classes from database schema and save (*.cs) files. new CSharpGenerate(metaCSharp).Run(isFrameworkDb, out string cSharp); if (isFrameworkDb == false) { UtilFramework.FileSave(UtilFramework.FolderName + "Application.Database/Database/Database.cs", cSharp); } else { UtilFramework.FileSave(UtilFramework.FolderName + "Framework/Framework/Database/Database.cs", cSharp); } UtilCli.ConsoleWriteLineColor("Generate CSharp classes from database schema and write (*.cs) files succsesful!", ConsoleColor.Green); // Read Integrate data from database and save (*.cs) files. GenerateIntegrateResult generateIntegrateResult = null; try { generateIntegrateResult = appCli.CommandGenerateIntegrateInternal(); } catch (SqlException exception) { isSuccessful = false; string message = string.Format("Read Integrate data from database failed! This can happen after an sql schema change. Try to run generate script again! ({0})", exception.Message); UtilCli.ConsoleWriteLineColor(message, ConsoleColor.Red); } if (generateIntegrateResult != null) { Run(generateIntegrateResult); new GenerateCSharpIntegrate().Run(out string cSharpCli, isFrameworkDb, isApplication: false, integrateList: generateIntegrateResult.Result); new GenerateCSharpIntegrate().Run(out string cSharpApplication, isFrameworkDb, isApplication: true, integrateList: generateIntegrateResult.Result); if (isFrameworkDb == false) { UtilFramework.FileSave(UtilFramework.FolderName + "Application.Cli/Database/DatabaseIntegrate.cs", cSharpCli); UtilFramework.FileSave(UtilFramework.FolderName + "Application.Database/Database/DatabaseIntegrate.cs", cSharpApplication); } else { UtilFramework.FileSave(UtilFramework.FolderName + "Framework/Framework.Cli/Database/DatabaseIntegrate.cs", cSharpCli); UtilFramework.FileSave(UtilFramework.FolderName + "Framework/Framework/Database/DatabaseIntegrate.cs", cSharpApplication); } UtilCli.ConsoleWriteLineColor("Generate CSharp code for Integrate data and write to (*.cs) files successful!", ConsoleColor.Green); } return(isSuccessful); }
/// <summary> /// Call method CommandGenerateIntegrate(); on external AppCli. /// </summary> public static void CommandGenerateIntegrate(AppCli appCli, GenerateIntegrateResult result) { foreach (var type in appCli.AssemblyApplicationCli.GetTypes()) { if (UtilFramework.IsSubclassOf(type, typeof(AppCli))) { if (type != appCli.GetType()) { var appCliExternal = (AppCli)Activator.CreateInstance(type); appCliExternal.CommandGenerateIntegrate(result); } } } }
/// <summary> /// Cli generate command. /// </summary> protected override void CommandGenerateIntegrate(GenerateIntegrateResult result) { // Navigate result.Add(Data.Query <NavigateIntegrate>().OrderBy(item => item.IdName)); result.AddKey <Navigate>(nameof(Navigate.Name)); result.AddReference <Navigate, Navigate>(nameof(Navigate.ParentId)); // LoginUser result.Add(Data.Query <LoginUserIntegrate>().Where(item => item.IsIntegrate == true).OrderBy(item => item.IdName), isApplication: true); result.AddKey <LoginUser>(nameof(LoginUser.Name)); // LoginRole result.Add(Data.Query <LoginRoleIntegrate>().OrderBy(item => item.IdName), isApplication: true); result.AddKey <LoginRole>(nameof(LoginRole.Name)); // LoginUserRole result.Add(Data.Query <LoginUserRoleIntegrate>().Where(item => item.LoginUserIsIntegrate == true).OrderBy(item => item.LoginUserIdName).ThenBy(item => item.LoginRoleIdName)); result.AddKey <LoginUserRole>(nameof(LoginUserRole.LoginUserId), nameof(LoginUserRole.LoginRoleId)); result.AddReference <LoginUserRole, LoginUser>(nameof(LoginUserRole.LoginUserId)); result.AddReference <LoginUserRole, LoginRole>(nameof(LoginUserRole.LoginRoleId)); // NavigateLoginRole result.Add(Data.Query <NavigateRoleIntegrate>().OrderBy(item => item.NavigateIdName).ThenBy(item => item.LoginRoleIdName)); result.AddKey <NavigateRole>(nameof(NavigateRole.NavigateId), nameof(NavigateRole.LoginRoleId)); result.AddReference <NavigateRole, Navigate>(nameof(NavigateRole.NavigateId)); result.AddReference <NavigateRole, LoginRole>(nameof(NavigateRole.LoginRoleId)); // StorageFile result.Add(Data.Query <StorageFileIntegrate>().OrderBy(item => item.IdName)); result.AddKey <StorageFile>(nameof(StorageFile.FileName)); result.AddBlob <StorageFileIntegrate>(nameof(StorageFile.Data), (row) => row.FileName); // Content result.Add(Data.Query <ContentIntegrate>().OrderBy(item => item.IdName)); result.AddKey <Content>(nameof(Content.Name)); result.AddBlob <ContentIntegrate>(nameof(Content.TextMd), (row) => row.IdName + ".md"); result.AddBlob <ContentIntegrate>(nameof(Content.TextHtml), (row) => row.IdName + ".html"); // Feedback result.Add(Data.Query <Feedback>().OrderBy(item => item.Name)); result.AddKey <Feedback>(nameof(Feedback.Name)); result.AddBlob <Feedback>(nameof(Feedback.AttachmentData), (row) => row.Name + "." + row.AttachmentFileName); }
/// <summary> /// Constructor for GenerateIntegrateItem. /// </summary> /// <param name="isApplication">If true, RowList will be available at runtime as Integrate CSharp code with additional IdEnum if row contains IdName column. If false, RowList will be generated into cli as CSharp code only.</param> public static GenerateIntegrateItem Create <TRow>(GenerateIntegrateResult owner, IQueryable <TRow> query, bool isApplication = false) where TRow : Row { return(new GenerateIntegrateItem(owner, isApplication, typeof(TRow), query.Cast <Row>())); }
/// <summary> /// Constructor for Application. /// </summary> private GenerateIntegrateItem(GenerateIntegrateResult owner, bool isApplication, Type typeRow, IQueryable <Row> query) : this(owner, false, isApplication, typeRow, query) { }
/// <summary> /// Override this method to add Integrate data rows to list. Used by cli generate command to generate CSharp code. /// Note: Cli generate command is not Integrate table reference aware. Data is generated in CSharp code as it is. /// </summary> protected virtual internal void CommandGenerateIntegrate(GenerateIntegrateResult result) { }
/// <summary> /// Returns Integrate rows to generate CSharp code. /// </summary> /// <param name="isDeployDb">Method is called from command cli generate or cli deployDb.</param> /// <param name="tableNameCSharpApplicationFilterList">TableNameCSharp defined in method AppCli.CommandGenerateFilter();</param> internal GenerateIntegrateResult CommandGenerateIntegrateInternal(bool isDeployDb, List <string> tableNameCSharpApplicationFilterList) { var result = new GenerateIntegrateResult(AssemblyList(true, true)); result.AddKey <FrameworkTable>(nameof(FrameworkTable.TableNameCSharp)); // Do not generate CSharp code for table FrameworkTable and FrameworkField. Add reference for deoplyDb. result.AddKey <FrameworkField>(nameof(FrameworkField.TableId), nameof(FrameworkField.FieldNameCSharp)); result.AddReference <FrameworkField, FrameworkTable>(nameof(FrameworkFieldIntegrate.TableId)); var tableNameCSharpFrameworkList = UtilDalType.TableNameCSharpList(AssemblyFramework); // TableNameCSharp declared in Framework assembly. var tableNameCSharpApplicationList = UtilDalType.TableNameCSharpList(AssemblyApplication, AssemblyApplicationDatabase); // TableNameCSharp declared in Application assembly. var fieldNameCSharpFrameworkList = UtilDalType.FieldNameCSharpList(AssemblyFramework); // FieldNameCSharp declared in Framework assembly var fieldNameCSharpApplicationList = UtilDalType.FieldNameCSharpList(AssemblyApplication, AssemblyApplicationDatabase); // FieldNameCSharp declared in Framework assembly // Filter out tables defined in method AppCli.CommandGenerateFilter(); if (tableNameCSharpApplicationFilterList != null) { tableNameCSharpApplicationList = tableNameCSharpApplicationList.Where(item => tableNameCSharpApplicationFilterList.Contains(item.Value)).ToDictionary(item => item.Key, item => item.Value); fieldNameCSharpApplicationList = fieldNameCSharpApplicationList.Where(item => tableNameCSharpApplicationFilterList.Contains(item.TableNameCSharp)).ToList(); } // Prevent build error "An expression tree may not contain a tuple literal". var fieldNameCSharpFrameworkNoTupleList = fieldNameCSharpFrameworkList.Select(item => item.TableNameCSharp + "/" + item.FieldNameCSharp); var fieldNameCSharpApplicationNoTupleList = fieldNameCSharpApplicationList.Select(item => item.TableNameCSharp + "/" + item.FieldNameCSharp); // FrameworkConfigGridIntegrate { var rowList = Data.Query <FrameworkConfigGridIntegrate>(); // Framework (.\cli.cmd generate -f) { var rowFilterList = rowList.Where(item => tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter Framework. rowFilterList = rowFilterList.OrderBy(item => item.IdName); result.Add( isFrameworkDb: true, isApplication: false, typeRow: typeof(FrameworkConfigGridIntegrate), query: rowFilterList ); } // Application (.\cli.cmd generate) { var rowFilterList = rowList.Where(item => !tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp) && tableNameCSharpApplicationList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter (not Framework and Application). rowFilterList = rowFilterList.OrderBy(item => item.IdName); result.Add( isFrameworkDb: false, isApplication: false, typeRow: typeof(FrameworkConfigGridIntegrate), query: rowFilterList ); } result.AddKey <FrameworkConfigGrid>(nameof(FrameworkConfigGrid.TableId), nameof(FrameworkConfigGrid.ConfigName)); result.AddReference <FrameworkConfigGrid, FrameworkTable>(nameof(FrameworkConfigGrid.TableId)); } // FrameworkConfigFieldIntegrate { var rowList = Data.Query <FrameworkConfigFieldIntegrate>(); // Framework (.\cli.cmd generate -f) { var rowFilterList = rowList.Where(item => tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter FrameworkDb. rowFilterList = rowList.Where(item => fieldNameCSharpFrameworkNoTupleList.Contains(item.TableNameCSharp + "/" + item.FieldNameCSharp)); // Filter FieldNameCSharp declared in Framework assembly. rowFilterList = rowFilterList.OrderBy(item => item.FieldIdName); result.Add( isFrameworkDb: true, isApplication: false, typeRow: typeof(FrameworkConfigFieldIntegrate), query: rowFilterList ); } // Application (.\cli.cmd generate) { var rowFilterList = rowList.Where(item => !tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp) && tableNameCSharpApplicationList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter (not Framework and Application). rowFilterList = rowList.Where(item => fieldNameCSharpApplicationNoTupleList.Contains(item.TableNameCSharp + "/" + item.FieldNameCSharp)); // Filter FieldNameCSharp declared in Application assembly. rowFilterList = rowFilterList.OrderBy(item => item.FieldIdName); result.Add( isFrameworkDb: false, isApplication: false, typeRow: typeof(FrameworkConfigFieldIntegrate), query: rowFilterList ); } result.AddKey <FrameworkConfigField>(nameof(FrameworkConfigField.ConfigGridId), nameof(FrameworkConfigField.FieldId), nameof(FrameworkConfigField.InstanceName)); result.AddReference <FrameworkConfigField, FrameworkConfigGrid>(nameof(FrameworkConfigField.ConfigGridId)); result.AddReference <FrameworkConfigField, FrameworkField>(nameof(FrameworkConfigField.FieldId)); } // Application (custom) Integrate data rows to generate CSharp code from. CommandGenerateIntegrate(result); // Call method CommandGenerateIntegrate(); on external AppCli for deployDb only. Not for cli generate command. if (isDeployDb) { UtilExternal.CommandGenerateIntegrate(this, result); } return(result); }
internal DeployDbIntegrateResult(GenerateIntegrateResult generateIntegrateResult) { this.GenerateIntegrateResult = generateIntegrateResult; this.Result = new List <UtilDalUpsertIntegrate.UpsertItem>(); }
/// <summary> /// Script to generate CSharp code. Returns true, if succsesful. /// </summary> /// <param name="isFrameworkDb">If true, generate CSharp code for Framework library (internal use only) otherwise generate code for Application.</param> public static bool Run(bool isFrameworkDb, AppCli appCli) { bool isSuccessful = true; MetaSql metaSql = new MetaSql(isFrameworkDb); // Custom sql table and field filtering for code generation. var list = metaSql.List; var typeRowCalculatedList = new List <Type>(); // Calculated row. if (isFrameworkDb == false) { // Call method CommandGenerateFilter(); Run(ref list, ref typeRowCalculatedList, appCli); } MetaCSharp metaCSharp = new MetaCSharp(list); // Generate CSharp classes from database schema and save (*.cs) files. UtilCli.ConsoleWriteLineColor("Generate CSharp classes from database schema and write (*.cs) files", ConsoleColor.Green); new CSharpGenerate(metaCSharp).Run(isFrameworkDb, out string cSharp); if (isFrameworkDb == false) { UtilFramework.FileSave(UtilFramework.FolderName + "Application.Database/Database/Database.cs", cSharp); } else { UtilFramework.FileSave(UtilFramework.FolderName + "Framework/Framework/Database/Database.cs", cSharp); } UtilCli.ConsoleWriteLineColor("Generate CSharp classes from database schema and write (*.cs) files succsesful!", ConsoleColor.Green); // Read Integrate data from database and save (*.cs) files. UtilCli.ConsoleWriteLineColor("Generate CSharp code for Integrate data and write to (*.cs) files", ConsoleColor.Green); GenerateIntegrateResult generateIntegrateResult = null; try { // TableNameCSharp defined in method AppCli.CommandGenerateFilter(); List <string> tableNameCSharpApplicationFilterList = null; if (isFrameworkDb == false) { tableNameCSharpApplicationFilterList = metaCSharp.List.GroupBy(item => item.SchemaNameCSharp + "." + item.TableNameCSharp).Select(item => item.Key).ToList(); var tableNameCSharpCalculatedList = typeRowCalculatedList.Select(item => UtilDalType.TypeRowToTableNameCSharp(item)).ToList(); tableNameCSharpApplicationFilterList.AddRange(tableNameCSharpCalculatedList); } generateIntegrateResult = appCli.CommandGenerateIntegrateInternal(isDeployDb: false, tableNameCSharpApplicationFilterList); } catch (SqlException exception) { isSuccessful = false; string message = string.Format("Read Integrate data from database failed! This can happen after an sql schema change. Try to run generate script again! ({0})", exception.Message); UtilCli.ConsoleWriteLineColor(message, ConsoleColor.Red); } if (generateIntegrateResult != null) { Run(generateIntegrateResult); new GenerateCSharpIntegrate().Run(out string cSharpCli, isFrameworkDb, isApplication: false, integrateList: generateIntegrateResult.Result); new GenerateCSharpIntegrate().Run(out string cSharpApplication, isFrameworkDb, isApplication: true, integrateList: generateIntegrateResult.Result); if (isFrameworkDb == false) { UtilFramework.FileSave(UtilFramework.FolderName + "Application.Cli/Database/DatabaseIntegrate.cs", cSharpCli); UtilFramework.FileSave(UtilFramework.FolderName + "Application.Database/Database/DatabaseIntegrate.cs", cSharpApplication); } else { UtilFramework.FileSave(UtilFramework.FolderName + "Framework/Framework.Cli/Database/DatabaseIntegrate.cs", cSharpCli); UtilFramework.FileSave(UtilFramework.FolderName + "Framework/Framework/Database/DatabaseIntegrate.cs", cSharpApplication); } UtilCli.ConsoleWriteLineColor("Generate CSharp code for Integrate data and write to (*.cs) files successful!", ConsoleColor.Green); } return(isSuccessful); }
/// <summary> /// Returns Integrate rows to generate CSharp code. /// </summary> internal GenerateIntegrateResult CommandGenerateIntegrateInternal() { var result = new GenerateIntegrateResult(AssemblyList(true, true)); result.AddKey <FrameworkTable>(nameof(FrameworkTable.TableNameCSharp)); // Do not generate CSharp code for table FrameworkTable and FrameworkField. Add reference for deoplyDb. result.AddKey <FrameworkField>(nameof(FrameworkField.TableId), nameof(FrameworkField.FieldNameCSharp)); result.AddReference <FrameworkField, FrameworkTable>(nameof(FrameworkFieldIntegrate.TableId)); var tableNameCSharpFrameworkList = UtilDalType.TableNameCSharpList(AssemblyFramework); // TableNameCSharp declared in Framework assembly. var tableNameCSharpApplicationList = UtilDalType.TableNameCSharpList(AssemblyApplication, AssemblyApplicationDatabase); // TableNameCSharp declared in Application assembly. var fieldNameCSharpFrameworkList = UtilDalType.FieldNameCSharpList(AssemblyFramework).Select(item => item.TableNameCSharp + "/" + item.FieldNameCSharp); // FieldNameCSharp declared in Framework assembly var fieldNameCSharpApplicationList = UtilDalType.FieldNameCSharpList(AssemblyApplication, AssemblyApplicationDatabase).Select(item => item.TableNameCSharp + "/" + item.FieldNameCSharp); // FieldNameCSharp declared in Framework assembly // FrameworkConfigGridIntegrate { var rowList = Data.Query <FrameworkConfigGridIntegrate>(); // Framework (.\cli.cmd generate -f) { var rowFilterList = rowList.Where(item => tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter Framework. rowFilterList = rowFilterList.OrderBy(item => item.IdName); result.Add( isFrameworkDb: true, isApplication: false, typeRow: typeof(FrameworkConfigGridIntegrate), query: rowFilterList ); } // Application (.\cli.cmd generate) { var rowFilterList = rowList.Where(item => !tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp) && tableNameCSharpApplicationList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter (not Framework and Application). rowFilterList = rowFilterList.OrderBy(item => item.IdName); result.Add( isFrameworkDb: false, isApplication: false, typeRow: typeof(FrameworkConfigGridIntegrate), query: rowFilterList ); } result.AddKey <FrameworkConfigGrid>(nameof(FrameworkConfigGrid.TableId), nameof(FrameworkConfigGrid.ConfigName)); result.AddReference <FrameworkConfigGrid, FrameworkTable>(nameof(FrameworkConfigGrid.TableId)); } // FrameworkConfigFieldIntegrate { var rowList = Data.Query <FrameworkConfigFieldIntegrate>(); // Framework (.\cli.cmd generate -f) { var rowFilterList = rowList.Where(item => tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter FrameworkDb. rowFilterList = rowList.Where(item => fieldNameCSharpFrameworkList.Contains(item.TableNameCSharp + "/" + item.FieldNameCSharp)); // Filter FieldNameCSharp declared in Framework assembly. rowFilterList = rowFilterList.OrderBy(item => item.FieldIdName); result.Add( isFrameworkDb: true, isApplication: false, typeRow: typeof(FrameworkConfigFieldIntegrate), query: rowFilterList ); } // Application (.\cli.cmd generate) { var rowFilterList = rowList.Where(item => !tableNameCSharpFrameworkList.Values.ToArray().Contains(item.TableNameCSharp) && tableNameCSharpApplicationList.Values.ToArray().Contains(item.TableNameCSharp)); // Filter (not Framework and Application). rowFilterList = rowList.Where(item => fieldNameCSharpApplicationList.Contains(item.TableNameCSharp + "/" + item.FieldNameCSharp)); // Filter FieldNameCSharp declared in Application assembly. rowFilterList = rowFilterList.OrderBy(item => item.FieldIdName); result.Add( isFrameworkDb: false, isApplication: false, typeRow: typeof(FrameworkConfigFieldIntegrate), query: rowFilterList ); } result.AddKey <FrameworkConfigField>(nameof(FrameworkConfigField.ConfigGridId), nameof(FrameworkConfigField.FieldId), nameof(FrameworkConfigField.InstanceName)); result.AddReference <FrameworkConfigField, FrameworkConfigGrid>(nameof(FrameworkConfigField.ConfigGridId)); result.AddReference <FrameworkConfigField, FrameworkField>(nameof(FrameworkConfigField.FieldId)); } // Application (custom) Integrate data rows to generate CSharp code from. CommandGenerateIntegrate(result); return(result); }