Files
PatientMgr-CSharp/SaPatMgrWinDbas/Win/Dbas/Utils/SpmDbDfnGenerator.cs
T
2019-04-09 16:34:59 +01:00

113 lines
4.7 KiB
C#

using Sarand.Core.Base;
using Sarand.Core.Bus;
using Sarand.Core.IO;
using Sarand.Win.Dbas.Base;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.PatientMgr.Win.Dbas.Utils
{
//=======================================================================
public static class SpmDbDfnGenerator
{
//-------------------------------------------------------------------
// Definitions.
public class DbDfnGeneratorResultData
{
public bool Success { get; internal set; }
public String ErrorMessage { get; internal set; }
}
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "PatientMgr database definition generator";
//-------------------------------------------------------------------
/// <summary>Generate database definitions.</summary>
public static DbDfnGeneratorResultData Generate (String connectionString)
{
DbDfnGeneratorResultData resultData = new DbDfnGeneratorResultData();
// Locate output folder:
String directory = GetOutputFolder(resultData);
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return resultData;
// 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:
GenerateDatabaseDefinition(database, directory, resultData);
return resultData;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition (SacsDatabase database, String directory, DbDfnGeneratorResultData resultData)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config();
config.Database = database;
config.OutputDirectory = directory;
config.NamespaceDefinition = "Sarand.PatientMgr.Core.App";
config.NamespaceTableObjects = "Sarand.PatientMgr.Win.Dbas.Internal";
config.ClassnameDefinition = "SpmDbDfn";
config.TablesExcluded.AddRange(new String[] { "NextId", "SaCode", "SaCodeType", "SaSecItem", "SaSecurityItem", "SaSecLink", "SaSecurityLink", "SaItemData", "SaItemDoc", "SaItemOption", "SaInterface", "SaInterfaceProcess", "SaInterfaceProcessMessage", "SaInterfaceDataItem", "SaInterfaceProcessDataItem", "SaAttrUpdate" });
// Columns to exclude from update.
config.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
// Table class.
config.TableClass.NamespaceBaseClass = "Sarand.PatientMgr.Win.Dbas.Data";
config.TableClass.BaseClass = "SpmDbDataItem";
config.TableClass.MandatoryConstructorDbInfo = true;
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
resultData.Success = generator.Generate(config);
return resultData.Success;
}
//-------------------------------------------------------------------
private static String GetOutputFolder (DbDfnGeneratorResultData resultData)
{
String fn = "SpmDbDfnGenerator.GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
Logger.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))
{
resultData.ErrorMessage = "Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\n" + assemblyDirectory;
Logger.Warn(resultData.ErrorMessage);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\PatientMgr\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "PatientMgr";
Logger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
resultData.ErrorMessage = "Output folder not found:\n\n" + directory;
Logger.Warn(resultData.ErrorMessage);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}