113 lines
4.7 KiB
C#
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.Namespace_DatabaseDefinition = "Sarand.PatientMgr.Core.App";
|
|
config.Namespace_TableObjects = "Sarand.PatientMgr.Win.Dbas.Internal";
|
|
config.Classname_DatabaseDefinition = "SpmDbDfn";
|
|
config.Tables_Excluded.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.Namespace_BaseClass = "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;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|