Files
Common-VS2019/SacsStandardDbas/Dbas/ReferenceData/SaReferenceDataDbDfnGenerator.cs
T

121 lines
5.0 KiB
C#

using System;
using System.IO;
using System.Reflection;
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;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
public static class SaReferenceDataDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand ReferenceData Module database definition generator";
//private static String dbConnectionString = "Driver={SQL Server Native Client 11.0};Server=Sarand106\\SQL2014;Database=SaStockTracker_Solent_STN;Trusted_Connection=Yes;MARS_Connection=yes;";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate(String connectionString)
{
String fn = nameof(SaReferenceDataDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
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(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition(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_Included.UnionWith(new String[] { "Language", "Region", "Currency", "TaxCode", "UnitMeasure" });
config.Schema.Tables_Excluded.UnionWith(new String[] { });
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("Language", "");
config.Schema.InsertOnlyColumns.Add("Region", "Type");
config.Schema.InsertOnlyColumns.Add("Currency", "");
config.Schema.InsertOnlyColumns.Add("TaxCode", "");
config.Schema.InsertOnlyColumns.Add("UnitMeasure", "");
// 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.Net.Standard.Base.ReferenceData";
config.DefinitionClass.Classname = "SaReferenceDataDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.ReferenceData.Internal";
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder()
{
String fn = nameof(SaReferenceDataDbDfnGenerator) + ".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(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\ReferenceData\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "ReferenceData";
SaLogger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}