Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Utils/SbmDbDfnGenerator.cs
T

134 lines
5.5 KiB
C#

using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.IO;
using System.Reflection;
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Utils
{
//=======================================================================
public static class SbmDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
private static String className = nameof(SbmDbDfnGenerator);
public enum DatabaseInstance
{
Control,
Core,
}
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate(DatabaseInstance dbInstance, String connectionString)
{
String fn = className + ".Generate";
SaLogger.Info($"{fn} Connection: {connectionString}");
// Locate output folder:
String directory = GetOutputFolder(dbInstance);
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(dbInstance, database, directory);
}
catch (Exception exc)
{
SaLogger.Error($"{fn} {ExceptionUtil.GetLogMessage(exc, "generating database definition")}");
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition(DatabaseInstance dbInstance, SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory
};
// Schema - Tables.
config.Schema.Tables_Excluded.UnionWith(new String[] { "NextId", "SaCode", "SaCodeType", "SaSecItem", "SaSecurityItem", "SaSecLink", "SaSecurityLink", "SaItemData", "SaItemDoc", "SaItemOption", "SaInterface", "SaInterfaceProcess", "SaInterfaceProcessMessage", "SaInterfaceDataItem", "SaInterfaceProcessDataItem", "SaAttrUpdate" });
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
// Database definition class.
config.DefinitionClass.Usings.Clear();
config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Core");
config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Utils");
config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Dbas");
config.DefinitionClass.Namespace = "Sarand.BusinessMgr.Net.Standard.Base.App";
config.DefinitionClass.Classname = "SbmDbDfn";
// Table class.
config.TableClass.Usings.Clear();
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.App");
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Core");
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Utils");
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Dbas");
config.TableClass.Namespace = "Sarand.BusinessMgr.Net.Standard.Dbas.Internal";
config.TableClass.Namespace_BaseClass = "Sarand.BusinessMgr.Net.Standard.Dbas.Data";
config.TableClass.BaseClass = "SbmDbDataItem";
config.TableClass.ClassName_DatabaseInfo = "IDatabaseInfo";
config.TableClass.MandatoryConstructorDbInfo = true;
config.TableClass.TreatDoubleFormatAsDecimal = true;
if (dbInstance == DatabaseInstance.Control)
{
config.DefinitionClass.Classname = "SbmDbDfn_Control";
config.TableClass.Namespace = "Sarand.BusinessMgr.Net.Standard.Dbas.Internal.Control";
}
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder(DatabaseInstance dbInstance)
{
String fn = className + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug($"{fn} Assembly folder: {directory}");
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
break;
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
return String.Empty;
}
// Code files are generated to '..\Database\Generated\BusMgr-[instance]\' folder.
directory = Path.Combine(directory, "Database", "Generated", "BusMgr-" + dbInstance.ToString());
SaLogger.Debug($"{fn} Output folder: {directory}");
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error($"{fn} Output folder not found: {directory}");
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}