namespace Framework.Cli.Generate
{
using System;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using static Framework.Cli.AppCli;
using Framework.DataAccessLayer;
using System.Linq;
///
/// Generate CSharp code for database tables.
///
internal static class Script
{
///
/// Script to generate CSharp code. Returns true, if succsesful.
///
/// If true, generate CSharp code for Framework library (internal use only) otherwise generate code for Application.
/// If true, do not run integrate program.
public static bool Run(bool isFrameworkDb, AppCli appCli, bool isOnly)
{
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(); // 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.
UtilCliInternal.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);
}
UtilCliInternal.ConsoleWriteLineColor("Generate CSharp classes from database schema and write (*.cs) files succsesful!", ConsoleColor.Green);
if (!isOnly)
{
// Read Integrate data from database and save (*.cs) files.
UtilCliInternal.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 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("Error! Read Integrate data from database failed! This can happen after an sql schema change. Try to run generate script again! ({0})", exception.Message);
UtilCliInternal.ConsoleWriteLineColor(message, ConsoleColor.Red); // Error
}
if (generateIntegrateResult != null)
{
Run(generateIntegrateResult);
if (isFrameworkDb == false)
{
UtilCliInternal.FolderDelete(UtilFramework.FolderName + "Application.Cli/Database/Blob/");
}
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);
}
UtilCliInternal.ConsoleWriteLineColor("Generate CSharp code for Integrate data and write to (*.cs) files successful!", ConsoleColor.Green);
}
}
return isSuccessful;
}
///
/// Call method CommandGenerateFilter();
///
private static void Run(ref MetaSqlSchema[] list, ref List typeRowCalculatedList, AppCli appCli)
{
var args = new GenerateFilterArgs(list);
var result = new GenerateFilterResult();
// Args for calculated row
var assemblyList = appCli.AssemblyList(isIncludeApp: true);
List typeRowList = UtilDalType.TypeRowList(assemblyList);
foreach (Type typeRow in typeRowList)
{
if (UtilDalType.TypeRowIsTableNameSql(typeRow) == false) // Calculated row
{
args.TypeRowCalculatedList.Add(typeRow);
}
}
// Call method CommandGenerateFilter();
appCli.CommandGenerateFilter(args, result);
// Result
if (result.FieldSqlList != null)
{
list = result.List;
}
if (result.TypeRowCalculatedList == null)
{
typeRowCalculatedList = args.TypeRowCalculatedList;
}
else
{
typeRowCalculatedList = result.TypeRowCalculatedList;
}
}
///
/// Console log Integrate table relation.
///
private static void Run(GenerateIntegrateResult generateIntegrateResult)
{
bool isFirst = true;
List result = new List();
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);
}
}
}
}