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;