using Microsoft.Extensions.Logging; using Sarand.Net.Standard.Dbas.Base; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.IO; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Utils; using Saxonite.Net.Standard.Base.App; namespace Saxonite.Net.Standard.Dbas.App { //======================================================================= public static class SaxDbDfnGenerator { //------------------------------------------------------------------- // Data members. //------------------------------------------------------------------- /// /// Generate database definitions. /// public static bool Generate(Sax.Database dbInstance, String connectionString) { String fn = nameof(SaxDbDfnGenerator) + ".Generate"; // 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.GetErrorStateMessage(exc)); } return false; } //------------------------------------------------------------------- private static bool GenerateDatabaseDefinition(Sax.Database 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[] { }); // Schema - Columns. config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost"); config.Schema.InsertOnlyColumns.Add("SomeOldTable", "Code"); // Database definition class. config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Core"); config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Dbas"); config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Utils"); config.DefinitionClass.Namespace = "Saxonite.Base.App"; config.DefinitionClass.Classname = "SaxDbDfn_" + dbInstance.ToString(); // Table class. 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.Dbas"); config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Utils"); config.TableClass.Namespace_BaseClass = "Saxonite.Net.Standard.Dbas.Data"; config.TableClass.Namespace = "Saxonite.Net.Standard.Dbas.Internal." + dbInstance.ToString(); config.TableClass.BaseClass = "SaxDbDataItem"; config.TableClass.ClassName_DatabaseInfo = "IDatabaseInfo"; config.TableClass.MandatoryConstructorDbInfo = true; // Generate database definition. DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator(); return generator.Generate(config); } //------------------------------------------------------------------- private static String GetOutputFolder(Sax.Database dbInstance) { String fn = nameof(SaxDbDfnGenerator) + ".GetOutputFolder"; var assembly = Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)); var assemblyLocation = assembly.Location; String assemblyDirectory = FileUtil.GetParentDirectory(assemblyLocation); String directory = assemblyDirectory; SaLogger.Debug(fn + " Assembly folder: " + directory); // Locate the parent of the 'Workspace' solution root folder. String projectFolder = "Database"; 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\Saxonite-[Instance]\' folder. directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "Saxonite-" + dbInstance.ToString(); 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; } //------------------------------------------------------------------- } //======================================================================= }