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