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"; //------------------------------------------------------------------- /// Generate database definitions. 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; } //------------------------------------------------------------------- } //======================================================================= }