diff --git a/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs b/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs index 21a9f02..71d1b1e 100644 --- a/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs +++ b/SacsStandardBase/Base/Bus/SacsHierarchyItem.cs @@ -288,7 +288,7 @@ namespace Sarand.Net.Standard.Base.Bus //------------------------------------------------------------------- // Properties. - public virtual bool ItemHasId { get { return true; } } + public virtual bool ItemHasId { get; } = true; public SysId Id { get diff --git a/SacsStandardBase/Base/Bus/SysId.cs b/SacsStandardBase/Base/Bus/SysId.cs index 34afe4d..99f1b30 100644 --- a/SacsStandardBase/Base/Bus/SysId.cs +++ b/SacsStandardBase/Base/Bus/SysId.cs @@ -1,6 +1,10 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; @@ -8,16 +12,17 @@ namespace Sarand.Net.Standard.Base.Bus { //======================================================================= //[Serializable()] + [JsonConverter(typeof(SysIdJsonConverter))] public class SysId { //------------------------------------------------------------------- // Data members. private Int64 id = 0; - + //------------------------------------------------------------------- // Construction. - public SysId () { } - public SysId (Int64 id) + public SysId() { } + public SysId(Int64 id) { this.id = id; } @@ -37,30 +42,30 @@ namespace Sarand.Net.Standard.Base.Bus //------------------------------------------------------------------- // Utilities. - public static bool IsValid (SysId sysId) + public static bool IsValid(SysId sysId) { return (sysId != null && sysId.id != 0); } - public static SysId InvalidOnNull (SysId sysId) + public static SysId InvalidOnNull(SysId sysId) { return (sysId != null ? sysId : new SysId()); } //------------------------------------------------------------------- // Comparison. - public override bool Equals (object obj) + public override bool Equals(object obj) { if (obj == null) return false; return Equals(obj as SysId); } - public bool Equals (SysId sysId) + public bool Equals(SysId sysId) { if (sysId == null) return false; // False if either value invalid. if (id == 0) return false; return ToInt().Equals(InvalidOnNull(sysId).ToInt()); } - public override int GetHashCode () + public override int GetHashCode() { return id.GetHashCode(); } @@ -75,11 +80,11 @@ namespace Sarand.Net.Standard.Base.Bus { return ToInt(this); } - public override String ToString () + public override String ToString() { return ToString(this); } - public String ToString (String invalidValue) + public String ToString(String invalidValue) { return ToString(this, invalidValue); } @@ -92,15 +97,43 @@ namespace Sarand.Net.Standard.Base.Bus { return (IsValid(sysId) ? sysId.id : 0); } - public static String ToString (SysId sysId) + public static String ToString(SysId sysId) { return ToString(sysId, String.Empty); } - public static String ToString (SysId sysId, String invalidValue) + public static String ToString(SysId sysId, String invalidValue) { return (IsValid(sysId) ? sysId.id.ToString() : invalidValue); } + //------------------------------------------------------------------- + /// + /// JSON Converter to serialise/deserialise SysId to/from simple integer value. + /// + class SysIdJsonConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, [AllowNull] SysId id, JsonSerializer serializer) + { + if (id == null) return; + // Simply return the integer Id value. + serializer.Serialize(writer, id.Id); + } + public override SysId ReadJson(JsonReader reader, Type objectType, [AllowNull] SysId existingValue, bool hasExistingValue, JsonSerializer serializer) + { + try + { + // Convert the integer value to a SysId. + JValue jValue = new JValue(reader.Value); + return new SysId() { Id = (long)jValue }; + } + catch (Exception exc) + { + SaLogger.Debug(GetType().Name + ".ReadJson " + ExceptionUtil.GetErrorStateMessage(exc)); + } + return null; + } + } + //------------------------------------------------------------------- } //======================================================================= @@ -108,13 +141,13 @@ namespace Sarand.Net.Standard.Base.Bus { //------------------------------------------------------------------- // List contents. - public static int GetIdCount (this List values, bool ignoreInvalid = true, bool ignoreDuplicates = true) + public static int GetIdCount(this List values, bool ignoreInvalid = true, bool ignoreDuplicates = true) { if (ignoreDuplicates) { values = values.Select(id => id).Distinct().ToList(); // SysId.Equals treats invalid ids as inequal so 'Distinct' doesn't remove them. - if (values.FindIndex(id => !SysId.IsValid(id)) >= 0) + if (values.FindIndex(id => !SysId.IsValid(id)) >= 0) { // Remove all invalid entries and put one back to correct the count. values.RemoveAll(id => !SysId.IsValid(id)); @@ -123,24 +156,24 @@ namespace Sarand.Net.Standard.Base.Bus } return values.Count(id => !ignoreInvalid || SysId.IsValid(id)); } - public static bool HasValidIds (this List values) + public static bool HasValidIds(this List values) { return (values.Find(id => SysId.IsValid(id)) != null); } - public static bool Equals (this List values, List values2) + public static bool Equals(this List values, List values2) { return values.OrderBy(id => id.Id).SequenceEqual(values2.OrderBy(id => id.Id)); } //------------------------------------------------------------------- // Populate list. - public static void AddId (this List values, SysId sysId, bool ignoreInvalid = true, bool ignoreDuplicates = true) + public static void AddId(this List values, SysId sysId, bool ignoreInvalid = true, bool ignoreDuplicates = true) { if (ignoreInvalid && !SysId.IsValid(sysId)) return; if (ignoreDuplicates && values.Contains(sysId)) return; values.Add(sysId); } - public static void AddIds (this List values, List sysIds, bool ignoreInvalid = true, bool ignoreDuplicates = true) + public static void AddIds(this List values, List sysIds, bool ignoreInvalid = true, bool ignoreDuplicates = true) { foreach (SysId id in sysIds) values.AddId(id, ignoreInvalid, ignoreDuplicates); @@ -150,7 +183,7 @@ namespace Sarand.Net.Standard.Base.Bus // Extract from list. /// Remove specified number of entries from the list and return them. /// - public static List ExtractIds (this List values, int numberToRemove) + public static List ExtractIds(this List values, int numberToRemove) { List ids = new List(); while (values.Count > 0 && ids.Count < numberToRemove) @@ -170,7 +203,7 @@ namespace Sarand.Net.Standard.Base.Bus /// /// /// - public static String Concat (this List values, String delimiter, bool ignoreInvalid = true) + public static String Concat(this List values, String delimiter, bool ignoreInvalid = true) { List ids = new List(); foreach (SysId id in values.FindAll(id => !ignoreInvalid || SysId.IsValid(id))) diff --git a/SacsStandardBase/Base/Dbas/DbDfnIndex.cs b/SacsStandardBase/Base/Dbas/DbDfnIndex.cs index cef6076..a6faab3 100644 --- a/SacsStandardBase/Base/Dbas/DbDfnIndex.cs +++ b/SacsStandardBase/Base/Dbas/DbDfnIndex.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; @@ -49,12 +50,20 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // Columns. + public int ColumnCount + { + get + { + lock (columns) + return columns.Count(); + } + } public List Columns { get { lock (columns) - return new List(columns); + return columns.ToList(); } set { diff --git a/SacsStandardBase/Base/Dbas/DbDfnTable.cs b/SacsStandardBase/Base/Dbas/DbDfnTable.cs index 4f530fb..a8e6667 100644 --- a/SacsStandardBase/Base/Dbas/DbDfnTable.cs +++ b/SacsStandardBase/Base/Dbas/DbDfnTable.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; @@ -29,6 +30,7 @@ namespace Sarand.Net.Standard.Base.Dbas public String Schema { get; set; } = String.Empty; public String Name { get; set; } = String.Empty; public String QualifiedName { get { return (!StringUtil.IsEmpty(Schema) ? Schema + "." : "") + Name; } } + public String QuotedQualifiedName { get { return (!StringUtil.IsEmpty(Schema) ? "[" + Schema + "]." : "") + "[" + Name + "]"; } } public String Remarks { get; set; } = String.Empty; //------------------------------------------------------------------- @@ -47,19 +49,26 @@ namespace Sarand.Net.Standard.Base.Dbas public bool HasColumnByName(String columnName) { lock (columns) - return (columns != null && columns.Exists(col => col.Name.EqualsCI(columnName))); + return columns.Exists(col => col.Name.EqualsCI(columnName)); } public bool HasColumns() { - lock (columns) - return (columns != null && columns.Count > 0); + return ColumnCount > 0; + } + public int ColumnCount + { + get + { + lock (columns) + return columns.Count; + } } public List Columns { get { lock (columns) - return new List(columns); + return columns.ToList(); } set { @@ -97,19 +106,26 @@ namespace Sarand.Net.Standard.Base.Dbas public bool HasIndexByName(String indexName) { lock (indices) - return (indices != null && indices.Exists(idx => idx.Name.EqualsCI(indexName))); + return indices.Exists(idx => idx.Name.EqualsCI(indexName)); } public bool HasIndices() { - lock (indices) - return (indices != null && indices.Count > 0); + return IndexCount > 0; + } + public int IndexCount + { + get + { + lock (indices) + return indices.Count; + } } public List Indices { get { lock (indices) - return new List(indices); + return indices.ToList(); } set { diff --git a/SacsStandardBase/Base/Dbas/ISacsDatabase.cs b/SacsStandardBase/Base/Dbas/ISacsDatabase.cs index a87cd38..dacff12 100644 --- a/SacsStandardBase/Base/Dbas/ISacsDatabase.cs +++ b/SacsStandardBase/Base/Dbas/ISacsDatabase.cs @@ -67,7 +67,7 @@ namespace Sarand.Net.Standard.Base.Dbas //------------------------------------------------------------------- // Database schema. - List GetTableNames (); + List GetTableNames (bool refresh = false); List GetTableDfns (bool refresh = false); DbDfnTable GetTableDfn (String name, bool refresh = false); bool TableExists (String tableName); diff --git a/SacsStandardBase/Base/Helpers/SacsRandomHelper.cs b/SacsStandardBase/Base/Helpers/SacsRandomHelper.cs index 97b5456..c46966d 100644 --- a/SacsStandardBase/Base/Helpers/SacsRandomHelper.cs +++ b/SacsStandardBase/Base/Helpers/SacsRandomHelper.cs @@ -16,8 +16,8 @@ namespace Sarand.Net.Standard.Base.Helpers public static void Fill(byte[] byteArray) { - // ToDo RandomNumberGenerator.Fill(byteArray); - RandomNumberGenerator.GetBytes(byteArray); + RandomNumberGenerator.Fill(byteArray); + //RandomNumberGenerator.GetBytes(byteArray); } //------------------------------------------------------------------- diff --git a/SacsStandardBase/Base/Utils/ExceptionUtil.cs b/SacsStandardBase/Base/Utils/ExceptionUtil.cs index d1fb788..d50f872 100644 --- a/SacsStandardBase/Base/Utils/ExceptionUtil.cs +++ b/SacsStandardBase/Base/Utils/ExceptionUtil.cs @@ -40,9 +40,9 @@ namespace Sarand.Net.Standard.Base.Utils /// [ExceptionType]: [ExceptionMessage] /// followed by stack entries on separate lines. /// - public static String GetLogMessage (this Exception exc, int entries = 8) + public static String GetLogMessage (this Exception exc, int entries = 8, String stackEntryDelim = "\n\t") { - return exc.GetType().Name + ": " + GetMessage(exc) + exc.GetStackEntries(entries).Concat("", "\n\t"); + return exc.GetType().Name + ": " + GetMessage(exc) + exc.GetStackEntries(entries).Concat("", stackEntryDelim); } //------------------------------------------------------------------- diff --git a/SacsStandardBase/Base/Xml/SacsSoapUtil.cs b/SacsStandardBase/Base/Utils/SacsSoapUtil.cs similarity index 97% rename from SacsStandardBase/Base/Xml/SacsSoapUtil.cs rename to SacsStandardBase/Base/Utils/SacsSoapUtil.cs index ff7ed81..c7e921d 100644 --- a/SacsStandardBase/Base/Xml/SacsSoapUtil.cs +++ b/SacsStandardBase/Base/Utils/SacsSoapUtil.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Sarand.Net.Standard.Base.Xml +namespace Sarand.Net.Standard.Base.Utils { //======================================================================= public enum SoapElementType diff --git a/SacsStandardBase/Base/Xml/SacsXmlUtil.cs b/SacsStandardBase/Base/Utils/SacsXmlUtil.cs similarity index 88% rename from SacsStandardBase/Base/Xml/SacsXmlUtil.cs rename to SacsStandardBase/Base/Utils/SacsXmlUtil.cs index 20e9817..e78f519 100644 --- a/SacsStandardBase/Base/Xml/SacsXmlUtil.cs +++ b/SacsStandardBase/Base/Utils/SacsXmlUtil.cs @@ -7,7 +7,7 @@ using System.Text; using System.Xml; using System.Xml.Linq; -namespace Sarand.Net.Standard.Base.Xml +namespace Sarand.Net.Standard.Base.Utils { //======================================================================= public static class SacsXmlUtil @@ -145,6 +145,7 @@ namespace Sarand.Net.Standard.Base.Xml } //------------------------------------------------------------------- + // System.Xml.Linq variation. /// Get text from first child that matches the node name. public static String GetChildText (this XElement element, String name) { @@ -153,9 +154,18 @@ namespace Sarand.Net.Standard.Base.Xml return child.Value; return String.Empty; } + // System.Xml varations. + public static String GetChildText(this XmlNode node, String name) + { + foreach (XmlNode child in node.ChildNodes) + if (child.Name.EqualsCI(name)) + return child.InnerText; + return String.Empty; + } //------------------------------------------------------------------- // Append element to node. + // System.Xml.Linq variation. public static XElement AppendElement (this XContainer container, XElement element) { container.Add(element); @@ -173,6 +183,15 @@ namespace Sarand.Net.Standard.Base.Xml container.Add(child); return child; } + // System.Xml varations. + public static XmlElement AppendElement(this XmlNode node, String name, String text = "") + { + XmlDocument doc = (node is XmlDocument ? node as XmlDocument : node.OwnerDocument); + XmlElement child = (XmlElement)node.AppendChild(doc.CreateElement(name)); + if (!StringUtil.IsEmpty(text)) + child.AppendChild(doc.CreateTextNode(text)); + return child; + } //------------------------------------------------------------------- } diff --git a/SacsStandardBase/Base/Utils/XmlUtil.cs b/SacsStandardBase/Base/Utils/XmlUtil.cs deleted file mode 100644 index da9225e..0000000 --- a/SacsStandardBase/Base/Utils/XmlUtil.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.IO; -using System.Xml; -using System.Xml.Linq; - -namespace Sarand.Net.Standard.Base.Utils -{ - //======================================================================= - public static class XmlUtil - { - //------------------------------------------------------------------- - // Convert XML document to string. - public static String GetXml (this XDocument xmlDoc) - { - using (var stringWriter = new StringWriter()) - using (var xmlTextWriter = XmlWriter.Create(stringWriter)) - { - xmlDoc.WriteTo(xmlTextWriter); - xmlTextWriter.Flush(); - return stringWriter.GetStringBuilder().ToString(); - } - } - - //------------------------------------------------------------------- - // Append element to node. - public static XmlElement AppendElement (this XmlNode node, String name, String text = "") - { - XmlDocument doc = (node is XmlDocument ? node as XmlDocument : node.OwnerDocument); - XmlElement child = (XmlElement)node.AppendChild(doc.CreateElement(name)); - if (!StringUtil.IsEmpty(text)) - child.AppendChild(doc.CreateTextNode(text)); - return child; - } - - //------------------------------------------------------------------- - // Get child text. - public static String GetChildText (this XmlNode node, String name) - { - foreach (XmlNode child in node.ChildNodes) - if (child.Name.EqualsCI(name)) - return child.InnerText; - return String.Empty; - } - - //------------------------------------------------------------------- - } - //======================================================================= -} diff --git a/SacsStandardDbas/Dbas/Base/SacsDatabase.cs b/SacsStandardDbas/Dbas/Base/SacsDatabase.cs index 71c125c..93127b2 100644 --- a/SacsStandardDbas/Dbas/Base/SacsDatabase.cs +++ b/SacsStandardDbas/Dbas/Base/SacsDatabase.cs @@ -226,7 +226,7 @@ namespace Sarand.Net.Standard.Dbas.Base //------------------------------------------------------------------- // D a t a b a s e S c h e m a //------------------------------------------------------------------- - public abstract List GetTableNames (); + public abstract List GetTableNames (bool refresh = false); public abstract List GetTableDfns (bool refresh = false); public abstract DbDfnTable GetTableDfn (String name, bool refresh = false); public bool TableExists (String tableName) diff --git a/SacsStandardDbas/Dbas/CodeTypes/SaCodeTypeMgr_Dbas.cs b/SacsStandardDbas/Dbas/CodeTypes/SaCodeTypeMgr_Dbas.cs index 8d47723..c035987 100644 --- a/SacsStandardDbas/Dbas/CodeTypes/SaCodeTypeMgr_Dbas.cs +++ b/SacsStandardDbas/Dbas/CodeTypes/SaCodeTypeMgr_Dbas.cs @@ -111,7 +111,7 @@ namespace Sarand.Net.Standard.Dbas.CodeTypes } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetCodeType\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCodeType\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return codeType; @@ -469,7 +469,7 @@ namespace Sarand.Net.Standard.Dbas.CodeTypes } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetCodeTypeList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCodeTypeList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return codeTypes; @@ -493,7 +493,7 @@ namespace Sarand.Net.Standard.Dbas.CodeTypes } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetCodeTypeListAsync\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCodeTypeListAsync\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return codeTypes; @@ -624,7 +624,7 @@ namespace Sarand.Net.Standard.Dbas.CodeTypes } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetCode\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCode\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return code; @@ -1010,7 +1010,7 @@ namespace Sarand.Net.Standard.Dbas.CodeTypes } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetCodeList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCodeList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return codes; @@ -1035,7 +1035,7 @@ namespace Sarand.Net.Standard.Dbas.CodeTypes } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetCodeListAsync\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCodeListAsync\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return codes; diff --git a/SacsStandardDbas/Dbas/Data/DbResultSet_DataReader.cs b/SacsStandardDbas/Dbas/Data/DbResultSet_DataReader.cs index aa84edf..7def163 100644 --- a/SacsStandardDbas/Dbas/Data/DbResultSet_DataReader.cs +++ b/SacsStandardDbas/Dbas/Data/DbResultSet_DataReader.cs @@ -14,10 +14,10 @@ namespace Sarand.Net.Standard.Dbas.Data { //------------------------------------------------------------------- // Data members. - private class Data + private class DataMembers { // Construction. - public Data (ISacsDatabase database, String query) + public DataMembers (ISacsDatabase database, String query) { Database = database; Query = query; @@ -43,14 +43,14 @@ namespace Sarand.Net.Standard.Dbas.Data } } } - private readonly Data data; + private readonly DataMembers data; //------------------------------------------------------------------- // Construction. [Obsolete("Constructor is deprecated. Use ExecuteQuery[Async] instead.")] public DbResultSet_DataReader (SacsDatabase database, String query) { - data = new Data(database, query); + data = new DataMembers(database, query); String fn = GetType().Name + ".CTR"; try { @@ -64,7 +64,7 @@ namespace Sarand.Net.Standard.Dbas.Data } } /// Private construction - created from ExecuteQuery{Async]. - private DbResultSet_DataReader (Data data) + private DbResultSet_DataReader (DataMembers data) { this.data = data; } @@ -77,7 +77,7 @@ namespace Sarand.Net.Standard.Dbas.Data // Execute query. public static DbResultSet_DataReader ExecuteQuery (ISacsDatabase database, String query) { - Data data = new Data(database, query); + DataMembers data = new DataMembers(database, query); String fn = typeof(DbResultSet_DataReader).Name + ".ExecuteQuery"; String errorState = ""; try @@ -96,7 +96,7 @@ namespace Sarand.Net.Standard.Dbas.Data } public static async Task ExecuteQueryAsync (SacsDatabase database, String query) { - Data data = new Data(database, query); + DataMembers data = new DataMembers(database, query); String fn = typeof(DbResultSet_DataReader).Name + ".ExecuteQueryAsync"; String errorState = ""; try @@ -134,7 +134,7 @@ namespace Sarand.Net.Standard.Dbas.Data //------------------------------------------------------------------- // Execute query. - private static void ExecuteQuery_Internal (Data data) + private static void ExecuteQuery_Internal (DataMembers data) { data.DbConnection = data.Database.CreateConnection(); data.DbCommand = data.DbConnection.CreateCommand(); diff --git a/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs b/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs index 85d5491..8f3dff8 100644 --- a/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs +++ b/SacsStandardDbas/Dbas/Data/SacsDatabaseOdbc.cs @@ -363,10 +363,10 @@ namespace Sarand.Net.Standard.Dbas.Data //------------------------------------------------------------------- // NB Always use ODBC connection for querying schema. // eg. SQL Connection GetSchema('Indices') doesn't return index columns. - public override List GetTableNames () + public override List GetTableNames (bool refresh = false) { // Only populate table names if not previously done. - if (tables.Count < 1) + if (tables.Count < 1 || refresh) { using (DbConnection dbConnection = CreateConnection(true)) { @@ -388,7 +388,7 @@ namespace Sarand.Net.Standard.Dbas.Data dbConnection.Open(); if (tables.Count < 1) PopulateTableNames(dbConnection); - foreach (DbDfnTable table in tables) + foreach (DbDfnTable table in tables.ToList()) { if (!table.HasColumns()) { @@ -398,7 +398,7 @@ namespace Sarand.Net.Standard.Dbas.Data } } } - return new List(tables); + return tables.ToList(); } public void ClearTableDfns () { @@ -488,7 +488,7 @@ namespace Sarand.Net.Standard.Dbas.Data } } } - List tablesUnsorted = new List(tables); + List tablesUnsorted = tables.ToList(); tables.Clear(); tables.AddRange(tablesUnsorted.OrderBy(item => item.Name).ToList()); } diff --git a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceDataItems.cs b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceDataItems.cs index 3f6156a..808f934 100644 --- a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceDataItems.cs +++ b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceDataItems.cs @@ -71,7 +71,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterfaceDataItem\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterfaceDataItem\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaceProcessDataItem; @@ -531,7 +531,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterfaceDataItemList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterfaceDataItemList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaces; diff --git a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcessMessages.cs b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcessMessages.cs index 4f7ceff..fc7f2e6 100644 --- a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcessMessages.cs +++ b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcessMessages.cs @@ -72,7 +72,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterfaceProcessMessage\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterfaceProcessMessage\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaceProcessMessage; @@ -417,7 +417,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterfaceProcessMessageList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterfaceProcessMessageList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaces; diff --git a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcesses.cs b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcesses.cs index 43c8e69..f55f988 100644 --- a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcesses.cs +++ b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-InterfaceProcesses.cs @@ -93,7 +93,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterfaceProcess\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterfaceProcess\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaceProcess; @@ -655,7 +655,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterfaceProcessList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterfaceProcessList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaces; diff --git a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-Interfaces.cs b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-Interfaces.cs index 28187ea..8c421cb 100644 --- a/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-Interfaces.cs +++ b/SacsStandardDbas/Dbas/Interfaces/SaInterfaceMgr_Dbas-Interfaces.cs @@ -104,7 +104,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterface\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterface\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaceObj; @@ -490,7 +490,7 @@ namespace Sarand.Net.Standard.Dbas.Interfaces } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetInterfaceList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetInterfaceList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return interfaces; diff --git a/SacsStandardDbas/Dbas/ItemData/SaItemDataMgr_Dbas.cs b/SacsStandardDbas/Dbas/ItemData/SaItemDataMgr_Dbas.cs index ec1f9a8..fec82ff 100644 --- a/SacsStandardDbas/Dbas/ItemData/SaItemDataMgr_Dbas.cs +++ b/SacsStandardDbas/Dbas/ItemData/SaItemDataMgr_Dbas.cs @@ -158,7 +158,7 @@ namespace Sarand.Net.Standard.Dbas.ItemData } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetItemData\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetItemData\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return itemData; @@ -520,7 +520,7 @@ namespace Sarand.Net.Standard.Dbas.ItemData } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetItemDataList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetItemDataList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return itemDatas; diff --git a/SacsStandardDbas/Dbas/ItemDocs/SaItemDocMgr_Dbas.cs b/SacsStandardDbas/Dbas/ItemDocs/SaItemDocMgr_Dbas.cs index f7bd2c2..445614a 100644 --- a/SacsStandardDbas/Dbas/ItemDocs/SaItemDocMgr_Dbas.cs +++ b/SacsStandardDbas/Dbas/ItemDocs/SaItemDocMgr_Dbas.cs @@ -136,7 +136,7 @@ namespace Sarand.Net.Standard.Dbas.ItemDocs } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetItemDoc\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetItemDoc\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return itemDoc; @@ -556,7 +556,7 @@ namespace Sarand.Net.Standard.Dbas.ItemDocs } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetItemDocList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetItemDocList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return itemDocs; diff --git a/SacsStandardDbas/Dbas/ItemOptions/SaItemOptionMgr_Dbas.cs b/SacsStandardDbas/Dbas/ItemOptions/SaItemOptionMgr_Dbas.cs index fff3c80..adcd031 100644 --- a/SacsStandardDbas/Dbas/ItemOptions/SaItemOptionMgr_Dbas.cs +++ b/SacsStandardDbas/Dbas/ItemOptions/SaItemOptionMgr_Dbas.cs @@ -123,7 +123,7 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetItemOption\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetItemOption\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return itemOption; @@ -509,7 +509,7 @@ namespace Sarand.Net.Standard.Dbas.ItemOptions } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetItemOptionList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetItemOptionList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return itemOptions; diff --git a/SacsStandardDbas/Dbas/Proc/SaDbProcess_CompareDatabaseSchemas.cs b/SacsStandardDbas/Dbas/Proc/SaDbProcess_CompareDatabaseSchemas.cs index 8a81b67..034c629 100644 --- a/SacsStandardDbas/Dbas/Proc/SaDbProcess_CompareDatabaseSchemas.cs +++ b/SacsStandardDbas/Dbas/Proc/SaDbProcess_CompareDatabaseSchemas.cs @@ -19,13 +19,19 @@ namespace Sarand.Net.Standard.Dbas.Proc // Configuration. public new class Config : SacsProcess.Config { - public Config (SacsDatabase sourceDatabase, SacsDatabase targetDatabase) + public Config(ISacsDatabase sourceDatabase, ISacsDatabase targetDatabase) { SourceDatabase = sourceDatabase; TargetDatabase = targetDatabase; } - public SacsDatabase SourceDatabase { get; } - public SacsDatabase TargetDatabase { get; } + public Config(List sourceTables, ISacsDatabase targetDatabase) + { + SourceTables = sourceTables; + TargetDatabase = targetDatabase; + } + public ISacsDatabase SourceDatabase { get; } + public List SourceTables { get; } + public ISacsDatabase TargetDatabase { get; } public bool HideIdenticalObjects { get; set; } public bool IgnoreNullable { get; set; } public bool IgnorePosition { get; set; } @@ -37,11 +43,11 @@ namespace Sarand.Net.Standard.Dbas.Proc // Definitions. public interface IProcessNotifier : ISacsProcessNotifier { - void OnSchemaComparisonItemAdded (SaDbProcess_CompareDatabaseSchemas proc); + void OnSchemaComparisonItemAdded(SaDbProcess_CompareDatabaseSchemas proc); } public class SchemaComparisonItem { - internal SchemaComparisonItem (String tableName, String columnName, int columnPosition, String indexName, String comment) + internal SchemaComparisonItem(String tableName, String columnName, int columnPosition, String indexName, String comment) { Id = ++SeedId; TableName = tableName; @@ -67,11 +73,11 @@ namespace Sarand.Net.Standard.Dbas.Proc //------------------------------------------------------------------- // Construction. - public SaDbProcess_CompareDatabaseSchemas (Config config) : base(config) + public SaDbProcess_CompareDatabaseSchemas(Config config) : base(config) { this.config = config; } - protected override void Dispose (bool disposing) + protected override void Dispose(bool disposing) { if (disposing) { @@ -95,7 +101,7 @@ namespace Sarand.Net.Standard.Dbas.Proc //------------------------------------------------------------------- // S c h e m a D i f f e r e n c e s //------------------------------------------------------------------- - public List GetSchemaComparisonItems (int minId = 0) + public List GetSchemaComparisonItems(int minId = 0) { return new List(schemaComparisonItems.FindAll(item => item.Id >= minId)); } @@ -103,21 +109,23 @@ namespace Sarand.Net.Standard.Dbas.Proc //------------------------------------------------------------------- // P r o c e s s i n g //------------------------------------------------------------------- - protected override bool Run () + protected override bool Run() { schemaComparisonItems.Clear(); - if (config.SourceDatabase == null) return SetProcessError("Source database must be supplied."); + if (config.SourceDatabase == null && config.SourceTables == null) return SetProcessError("Source database must be supplied."); CompareTables(); return OK; } //------------------------------------------------------------------- - private void CompareTables () + private void CompareTables() { - List sourceTables = config.SourceDatabase.GetTableNames().OrderBy(item => item).ToList(); - List targetTables = config.TargetDatabase.GetTableNames().OrderBy(item => item).ToList(); - for (int sourceTableIdx = 0, targetTableIdx = 0; sourceTableIdx <= sourceTables.Count && targetTableIdx <= targetTables.Count;) + // Database schemas. + List sourceTables = (config.SourceDatabase?.GetTableNames(true) ?? config.SourceTables.Select(item => item.Name)).OrderBy(item => item).ToList(); + List targetTables = config.TargetDatabase.GetTableNames(true).OrderBy(item => item).ToList(); + + for (int sourceTableIdx = 0, targetTableIdx = 0; sourceTableIdx < sourceTables.Count || targetTableIdx < targetTables.Count;) { String sourceTableName = (sourceTableIdx < sourceTables.Count ? sourceTables[sourceTableIdx] : ""); String targetTableName = (targetTableIdx < targetTables.Count ? targetTables[targetTableIdx] : ""); @@ -143,8 +151,8 @@ namespace Sarand.Net.Standard.Dbas.Proc Debugger.Break(); #endif // Retrieve table definition from each database. - DbDfnTable sourceTableDfn = config.SourceDatabase.GetTableDfn (sourceTableName); - DbDfnTable targetTableDfn = config.TargetDatabase.GetTableDfn (targetTableName); + DbDfnTable sourceTableDfn = config.SourceDatabase?.GetTableDfn(sourceTableName, true) ?? config.SourceTables.GetTableByName(sourceTableName); + DbDfnTable targetTableDfn = config.TargetDatabase.GetTableDfn(targetTableName, true); // Compare the columns and indices. CompareTableColumns(sourceTableDfn, targetTableDfn); CompareTableIndices(sourceTableDfn, targetTableDfn); @@ -155,7 +163,7 @@ namespace Sarand.Net.Standard.Dbas.Proc } //------------------------------------------------------------------- - private bool CompareTableColumns (DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn) + private bool CompareTableColumns(DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn) { String tableName = sourceTableDfn.Name; #if DEBUG_X @@ -177,7 +185,7 @@ namespace Sarand.Net.Standard.Dbas.Proc String sourceColumnName = sourceColumnIdx < sourceColumnNames.Count() ? sourceColumnNames[sourceColumnIdx] : ""; String targetColumnName = targetColumnIdx < targetColumnNames.Count() ? targetColumnNames[targetColumnIdx] : ""; // Retrieve Column definition from each database. - DbDfnColumn sourceColumn = sourceColumns.GetColumnByName (sourceColumnName); + DbDfnColumn sourceColumn = sourceColumns.GetColumnByName(sourceColumnName); if (sourceColumn != null) iPosition = sourceColumn.Pos; DbDfnColumn targetColumn = targetColumns.GetColumnByName(targetColumnName); // Compare Columns. @@ -225,7 +233,7 @@ namespace Sarand.Net.Standard.Dbas.Proc return OK; } private static long iLargeSizeThreshold = 4000; - private bool ColumnSizesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn) + private bool ColumnSizesDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn) { if (sourceColumn.Size == targetColumn.Size) return false; // If both columns are large, treat then as equal: @@ -240,33 +248,33 @@ namespace Sarand.Net.Standard.Dbas.Proc if (config.IgnoreSimilarNumericTypes) { // Floating point types. - List numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric",","); + List numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric", ","); if (numericTypes.ContainsCI(sourceDataType) && numericTypes.ContainsCI(targetDataType)) return false; } // DateTimes: - List dateTimeTypes = StringListUtil.Split("DateTime",","); + List dateTimeTypes = StringListUtil.Split("DateTime", ","); if (dateTimeTypes.ContainsCI(sourceDataType) && dateTimeTypes.ContainsCI(targetDataType)) return false; return true; } - private bool ColumnDecimalsDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn) + private bool ColumnDecimalsDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn) { if (sourceColumn.DecimalDigits == targetColumn.DecimalDigits) return false; // Check for specific data types: String sourceDataType = sourceColumn.DataTypeNameNative; String targetDataType = targetColumn.DataTypeNameNative; // Numeric types - float/double columns report decimals as 0. - List floatTypes = StringListUtil.Split("Real,Float,Double",","); - List decimalTypes = StringListUtil.Split("Decimal,Numeric",","); + List floatTypes = StringListUtil.Split("Real,Float,Double", ","); + List decimalTypes = StringListUtil.Split("Decimal,Numeric", ","); if (sourceColumn.DecimalDigits == 0 && floatTypes.ContainsCI(sourceDataType) && targetColumn.DecimalDigits > 0 && decimalTypes.ContainsCI(targetDataType)) return false; if (sourceColumn.DecimalDigits > 0 && decimalTypes.ContainsCI(sourceDataType) && targetColumn.DecimalDigits == 0 && floatTypes.ContainsCI(targetDataType)) return false; // DateTimes: - List dateTimeTypes = StringListUtil.Split("DateTime",","); + List dateTimeTypes = StringListUtil.Split("DateTime", ","); if (dateTimeTypes.ContainsCI(sourceDataType) && dateTimeTypes.ContainsCI(targetDataType)) return false; return true; } - private bool ColumnDataTypesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn) + private bool ColumnDataTypesDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn) { if (sourceColumn.DataType == targetColumn.DataType) return false; @@ -279,13 +287,13 @@ namespace Sarand.Net.Standard.Dbas.Proc if (config.IgnoreSimilarNumericTypes) { // Similar numeric type. - List numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric",","); + List numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric", ","); if (numericTypes.ContainsCI(sourceDataType) && numericTypes.ContainsCI(targetDataType)) return false; } return true; } - private bool ColumnNativeDataTypesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn) + private bool ColumnNativeDataTypesDiffer(DbDfnColumn sourceColumn, DbDfnColumn targetColumn) { if (sourceColumn.DataTypeNative == targetColumn.DataTypeNative) return false; @@ -295,20 +303,20 @@ namespace Sarand.Net.Standard.Dbas.Proc if (config.IgnoreSimilarCharTypes) { // Similar Char types. - List varCharTypes = StringListUtil.Split("VarChar,LongVarChar,LongChar,NVarChar,VarWChar",","); + List varCharTypes = StringListUtil.Split("VarChar,LongVarChar,LongChar,NVarChar,VarWChar", ","); if (varCharTypes.ContainsCI(sourceDataType) && varCharTypes.ContainsCI(targetDataType)) return false; } if (config.IgnoreSimilarNumericTypes) { // Similar numeric types. - List numericTypes = StringListUtil.Split("Real,Float,Double,Numeric,Decimal",","); + List numericTypes = StringListUtil.Split("Real,Float,Double,Numeric,Decimal", ","); if (numericTypes.ContainsCI(sourceDataType) && numericTypes.ContainsCI(targetDataType)) return false; } return true; } //------------------------------------------------------------------- - private bool CompareTableIndices (DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn) + private bool CompareTableIndices(DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn) { String sTable = sourceTableDfn.Name; @@ -317,7 +325,7 @@ namespace Sarand.Net.Standard.Dbas.Proc List targetIndices = targetTableDfn.Indices; List sourceIndexNames = sourceIndices.GetNames().OrderBy(item => item).ToList(); List targetIndexNames = targetIndices.GetNames().OrderBy(item => item).ToList(); - for (int sourceIndexIdx = 0, targetIndexIdx = 0; OK && sourceIndexIdx < sourceIndexNames.Count && targetIndexIdx < targetIndexNames.Count; ) + for (int sourceIndexIdx = 0, targetIndexIdx = 0; OK && sourceIndexIdx < sourceIndexNames.Count && targetIndexIdx < targetIndexNames.Count;) { // Retrieve the Index names. String sourceIndexName = sourceIndexIdx < sourceIndexNames.Count ? sourceIndexNames[sourceIndexIdx] : ""; @@ -382,7 +390,7 @@ namespace Sarand.Net.Standard.Dbas.Proc } //------------------------------------------------------------------- - private void AddSchemaComparisonItem (String tableName, String columnName, int position, String indexName, String comment) + private void AddSchemaComparisonItem(String tableName, String columnName, int position, String indexName, String comment) { schemaComparisonItems.Add(new SchemaComparisonItem(tableName, columnName, position, indexName, comment)); if (ProcessNotifier != null) ProcessNotifier.OnSchemaComparisonItemAdded(this); @@ -395,7 +403,7 @@ namespace Sarand.Net.Standard.Dbas.Proc public static class SchemaComparisonItemList { /// Identify the maximum Id value in the list. - public static int GetMaxId (this IEnumerable values) + public static int GetMaxId(this IEnumerable values) { int maxId = 0; foreach (SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem schemaComparisonItem in values) diff --git a/SacsStandardDbas/Dbas/Proc/SaDbProcess_ConvertDbSchema.cs b/SacsStandardDbas/Dbas/Proc/SaDbProcess_ConvertDbSchema.cs new file mode 100644 index 0000000..a698cd7 --- /dev/null +++ b/SacsStandardDbas/Dbas/Proc/SaDbProcess_ConvertDbSchema.cs @@ -0,0 +1,183 @@ +using Sarand.Net.Standard.Base.App; +using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.Dbas; +using Sarand.Net.Standard.Base.IO; +using Sarand.Net.Standard.Base.Procs; +using Sarand.Net.Standard.Base.Utils; +using Sarand.Net.Standard.Dbas.Base; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace Sarand.Net.Standard.Dbas.Proc +{ + //======================================================================= + public class SaDbProcess_ConvertDbSchema : SacsProcess + { + //------------------------------------------------------------------- + // Configuration. + public new class Config : SacsProcess.Config + { + public Config() + { + } + } + + //------------------------------------------------------------------- + // Data members. + private Config config; + + //------------------------------------------------------------------- + // Construction. + public SaDbProcess_ConvertDbSchema(Config config) : base(config) + { + this.config = config; + } + protected override void Dispose(bool disposing) + { + if (disposing) + { + } + base.Dispose(disposing); + } + + //------------------------------------------------------------------- + // Properties. + public override string ProcessDescription { get; } = "Database Definition Convertor"; + public String XmlSchemaRootElementName { get; } = "DbDfnDatabase"; + + // Processing. + protected override bool Run() + { + throw new NotSupportedException(ProcessDescription + " - 'Run' not supported. Use a specific conversion method."); + } + + //------------------------------------------------------------------- + // X M L T o T a b l e s + //------------------------------------------------------------------- + public List ConvertXmlToTables(String xmlSchemaData) + { + ClearProcessError(); + String fn = GetType().Name + ".ConvertXmlToTables"; + Dictionary tables = new Dictionary(StringComparer.OrdinalIgnoreCase); + + try + { + // Load XML data. + XDocument xmlSchema = XDocument.Parse(xmlSchemaData); + + // Root element. + XElement rootElement = xmlSchema.Root; + if (rootElement == null) + throw new NotSupportedException("XML schema missing root node"); + String rootElementName = rootElement.GetLocalName(); + if (!rootElementName.EqualsCI(XmlSchemaRootElementName)) + throw new NotSupportedException("XML schema has invalid root node. Expected: " + XmlSchemaRootElementName + ". Found: " + rootElementName); + + // 'Tables' element. + XElement tablesElement = rootElement.GetFirstChildElement("Tables"); + if (tablesElement == null) + throw new NotSupportedException("XML schema missing tables node"); + + // Iterate tables. + foreach (XElement tableElement in tablesElement.GetChildElements("DbDfnTable")) + { + DbDfnTable tableDfn = new DbDfnTable() + { + Schema = tableElement.GetChildText("Schema"), + Name = tableElement.GetChildText("Name"), + Remarks = tableElement.GetChildText("Remarks") + }; + if (tableDfn.Name.IsEmpty()) + throw new NotSupportedException("XML schema contains blank table name."); + if (tables.ContainsKey(tableDfn.QualifiedName)) + throw new NotSupportedException("XML schema contains duplicate table: " + tableDfn.QualifiedName); + tables[tableDfn.QualifiedName] = tableDfn; + + // Columns. + XElement columnsElement = tableElement.GetFirstChildElement("Columns"); + if (tablesElement == null) + throw new NotSupportedException("XML schema table missing columns node: " + tableDfn.QualifiedName); + + // Iterate columns. + foreach (XElement columnElement in columnsElement.GetChildElements("DbDfnColumn")) + { + DbDfnColumn columnDfn = new DbDfnColumn() + { + Schema = tableDfn.Schema, + Table = tableDfn.Name, + Pos = StringUtil.ToShort(columnElement.GetChildText("Pos")), + Name = columnElement.GetChildText("Name"), + DataType = EnumUtil.ParseEnum(columnElement.GetChildText("DataType"), DbColumnDataType.Unknown), + DataTypeName = columnElement.GetChildText("DataTypeName"), + DataTypeNative = StringUtil.ToShort(columnElement.GetChildText("DataTypeNative")), + DataTypeNameNative = columnElement.GetChildText("DataTypeNameNative"), + IsIdentity = StringUtil.ToBool(columnElement.GetChildText("IsIdentity")), + Size = StringUtil.ToLong(columnElement.GetChildText("Size")), + BufferLen = StringUtil.ToLong(columnElement.GetChildText("BufferLen")), + DecimalDigits = StringUtil.ToShort(columnElement.GetChildText("DecimalDigits")), + Nullable = EnumUtil.ParseEnum(columnElement.GetChildText("Nullable"), DbColumnNullable.Unknown), + IsNullable = StringUtil.ToBool(columnElement.GetChildText("IsNullable")), + Remarks = columnElement.GetChildText("Remarks") + }; + tableDfn.AddColumn(columnDfn); + } + + // Indices. + XElement IndicesElement = tableElement.GetFirstChildElement("Indices"); + if (IndicesElement == null) + throw new NotSupportedException("XML schema table missing indices node: " + tableDfn.QualifiedName); + + // Iterate indices. + foreach (XElement indexElement in IndicesElement.GetChildElements("DbDfnIndex")) + { + DbDfnIndex indexDfn = new DbDfnIndex() + { + Schema = tableDfn.Schema, + Table = tableDfn.Name, + Name = indexElement.GetChildText("Name"), + IndexType = StringUtil.ToInt(indexElement.GetChildText("IndexType")), + Unique = StringUtil.ToBool(indexElement.GetChildText("Unique")), + Primary = StringUtil.ToBool(indexElement.GetChildText("Primary")), + Clustered = StringUtil.ToBool(indexElement.GetChildText("Clustered")), + Nullable = StringUtil.ToBool(indexElement.GetChildText("Nullable")), + Pages = StringUtil.ToInt(indexElement.GetChildText("Pages")), + UniqueValues = StringUtil.ToInt(indexElement.GetChildText("UniqueValues")), + HasColumns = StringUtil.ToBool(indexElement.GetChildText("HasColumns")), + }; + + // Index columns. + XElement IndexColumnsElement = indexElement.GetFirstChildElement("Columns"); + foreach (XElement indexColumnElement in IndexColumnsElement?.GetChildElements("DbDfnIndexColumn") ?? Enumerable.Empty()) + { + DbDfnIndexColumn indexColumn = new DbDfnIndexColumn() + { + Seq = StringUtil.ToShort(indexColumnElement.GetChildText("Seq")), + Name = indexColumnElement.GetChildText("Name"), + Ascend = StringUtil.ToBool(indexColumnElement.GetChildText("Ascend")), + }; + indexDfn.AddColumn(indexColumn); + } + tableDfn.AddIndex(indexDfn); + } + } + } + catch (Exception exc) + { + SetProcessError(exc.GetErrorStateMessage()); + SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc)); + } + + return tables.Values.ToList(); + } + + //------------------------------------------------------------------- + } + + //======================================================================= +} diff --git a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Currency.cs b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Currency.cs index 2495a7e..71d8c5f 100644 --- a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Currency.cs +++ b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Currency.cs @@ -86,7 +86,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData catch (Exception exc) { SetErrorState("Database query exception"); - SaLogger.Warn(GetType().Name + ".GetCurrency\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCurrency\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return currency; @@ -451,7 +451,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetCurrencyList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetCurrencyList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return currencies; diff --git a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Language.cs b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Language.cs index 4eb9365..a233f32 100644 --- a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Language.cs +++ b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Language.cs @@ -86,7 +86,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData catch (Exception exc) { SetErrorState("Database query exception"); - SaLogger.Warn(GetType().Name + ".GetLanguage\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetLanguage\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return language; @@ -457,7 +457,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetLanguageList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetLanguageList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return languages; diff --git a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Region.cs b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Region.cs index e947b12..1ac9bde 100644 --- a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Region.cs +++ b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-Region.cs @@ -86,7 +86,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData catch (Exception exc) { SetErrorState("Database query exception"); - SaLogger.Warn(GetType().Name + ".GetRegion\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetRegion\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return region; @@ -239,7 +239,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData //------------------------------------------------------------------- // Region column definitions. - private static readonly String aliasRegion = "aReg"; + private static readonly String aliasRegion = "aRgn"; private void SetRegionColDfn (ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, @@ -436,7 +436,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetRegionList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetRegionList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return regions; diff --git a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-TaxCode.cs b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-TaxCode.cs index 981d282..0610ed3 100644 --- a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-TaxCode.cs +++ b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-TaxCode.cs @@ -86,7 +86,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData catch (Exception exc) { SetErrorState("Database query exception"); - SaLogger.Warn(GetType().Name + ".GetTaxCode\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetTaxCode\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return taxCode; @@ -477,7 +477,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetTaxCodeList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetTaxCodeList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return taxCodes; diff --git a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-UnitMeasure.cs b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-UnitMeasure.cs index 51833f9..6fe8d62 100644 --- a/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-UnitMeasure.cs +++ b/SacsStandardDbas/Dbas/ReferenceData/SbmReferenceDataMgr_Dbas-UnitMeasure.cs @@ -86,7 +86,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData catch (Exception exc) { SetErrorState("Database query exception"); - SaLogger.Warn(GetType().Name + ".GetUnitMeasure\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetUnitMeasure\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return unitMeasure; @@ -486,7 +486,7 @@ namespace Sarand.Net.Standard.Dbas.ReferenceData } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetUnitMeasureList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetUnitMeasureList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return unitMeasures; diff --git a/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityItem.cs b/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityItem.cs index 4484dc7..7505be0 100644 --- a/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityItem.cs +++ b/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityItem.cs @@ -85,7 +85,7 @@ namespace Sarand.Net.Standard.Dbas.Security } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetSecurityItem\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetSecurityItem\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return securityItem; @@ -520,7 +520,7 @@ namespace Sarand.Net.Standard.Dbas.Security } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetSecurityItemList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetSecurityItemList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return secItems; diff --git a/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityLink.cs b/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityLink.cs index 90401ef..52f880e 100644 --- a/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityLink.cs +++ b/SacsStandardDbas/Dbas/Security/SaSecurityMgr_Dbas-SecurityLink.cs @@ -57,7 +57,7 @@ namespace Sarand.Net.Standard.Dbas.Security } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetSecurityLink\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetSecurityLink\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return securityLink; @@ -429,7 +429,7 @@ namespace Sarand.Net.Standard.Dbas.Security } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetSecurityLinkList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetSecurityLinkList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return secLinks; diff --git a/SacsStandardDbas/Dbas/UpdateLog/SaUpdateLogMgr_Dbas.cs b/SacsStandardDbas/Dbas/UpdateLog/SaUpdateLogMgr_Dbas.cs index bfc1205..a1b4c5f 100644 --- a/SacsStandardDbas/Dbas/UpdateLog/SaUpdateLogMgr_Dbas.cs +++ b/SacsStandardDbas/Dbas/UpdateLog/SaUpdateLogMgr_Dbas.cs @@ -99,7 +99,7 @@ namespace Sarand.Net.Standard.Dbas.UpdateLog } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetUpdateLog\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetUpdateLog\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return logEntry; @@ -589,7 +589,7 @@ namespace Sarand.Net.Standard.Dbas.UpdateLog } catch (Exception exc) { - SaLogger.Warn(GetType().Name + ".GetLogEntryList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message); + SaLogger.Warn(GetType().Name + ".GetLogEntryList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc)); } } return logEntries;