Add project files.

This commit is contained in:
Andy Howard
2021-05-05 15:36:28 +01:00
parent 949836d24c
commit a4cf706eb3
353 changed files with 60029 additions and 0 deletions
@@ -0,0 +1,807 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
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.Utils;
namespace Sarand.Net.Standard.Dbas.Base
{
//=======================================================================
public class DatabaseDefinitionGenerator
{
//-------------------------------------------------------------------
// Configuration.
public enum SarandCommonVersion
{
VS2017,
/// <summary>
/// Visual Studio 2019 version. StringListUtil rather than StringListUtil.
/// </summary>
VS2019
}
public enum DotNetVersion
{
Framework,
Core3,
}
public enum Dbms
{
ODBC,
SQL,
}
public class Config
{
public SarandCommonVersion SarandCommonVersion { get; set; } = SarandCommonVersion.VS2017;
public DotNetVersion DotNetVersion { get; set; } = DotNetVersion.Framework;
public SacsDatabase Database { get; set; }
public Dbms DbmsOutput { get; set; } = Dbms.ODBC;
public String OutputDirectory { get; set; } = "";
public bool ConfirmDirectoryClear { get; set; } = true;
// Database schema.
public class SchemaData
{
// Tables to be included (all others excluded) or those to be excluded.
public List<String> Tables_Included { get; } = new List<String>();
public List<String> Tables_Excluded { get; } = new List<String>();
// Alternative table names.
public Dictionary<String, List<String>> AlternativeTableNames { get; } = new Dictionary<string, List<string>>();
public void AddAlternativeTableName(String tableName, String tableNameAlternative)
{
if (!AlternativeTableNames.ContainsKey(tableName)) AlternativeTableNames[tableName] = new List<string>();
AlternativeTableNames[tableName].Add(tableNameAlternative);
}
// Insert only columns - not modified on update:
// Table name - regular expressions allowed.
// Comma separated list of columns
// eg. New StringPair(".*","CreateOn,CreateBy");
public List<StringPair> InsertOnlyColumns { get; } = new List<StringPair>();
}
public SchemaData Schema { get; } = new SchemaData();
// Database definition class.
public class DefinitionClassConfig
{
/// <summary>Using namespaces for database definition and table class usings.</summary>
public List<String> Usings { get; } = new List<String>() { "Sarand.Net.Standard.Base.Core", "Sarand.Net.Standard.Base.Dbas" };
public String Namespace { get; set; } = "Sarand.Application.Core.Base";
public String Classname { get; set; } = "SaDbDfn";
}
public DefinitionClassConfig DefinitionClass { get; } = new DefinitionClassConfig();
// Table class.
public class TableClassConfig
{
/// <summary>Using namespaces for table classes.</summary>
public List<String> Usings { get; } = new List<String>() { "Sarand.Net.Standard.Base.Core", "Sarand.Net.Standard.Base.Dbas" };
public String Namespace_BaseClass { get; set; } = "Sarand.Net.Standard.Dbas.Data";
public String Namespace { get; set; } = "Sarand.Application.Dbas";
public String BaseClass { get; set; } = "DbDataItem";
public String ClassName_DatabaseInfo = "IDbDataItem.IDatabaseInfo";
public bool MandatoryConstructorDbInfo = false;
public bool TreatDoubleFormatAsDecimal { get; set; } = false;
}
public TableClassConfig TableClass { get; } = new TableClassConfig();
}
//-------------------------------------------------------------------
// Data members.
private Config config = null;
private static String /*lf = "\n",*/ crlf = "\r\n", tab1 = "\t", tab2 = "\t\t", tab3 = "\t\t\t", tab4 = "\t\t\t\t", tab5 = "\t\t\t\t\t";
// Reserved words.
private static readonly String[] reservedWords =
{
"ADD", "ALL", "ALTER", "AND", "ANY", "AS", "ASC", "AVG", "BEGIN", "BETWEEN", "BY", "CASE", "CAST", "COLUMN", "COMMIT", "CONSTRAINT",
"CONVERT", "COUNT", "CREATE", "CURRENCY", "DEFAULT", "DELETE", "DESC", "DISTINCT", "DROP", "ELSE", "END", "EXECUTE", "EXISTS", "FALSE",
"FROM", "GRANT", "GROUP", "HAVING", "IN", "INDEX", "INNER", "INSERT", "INTO", "IS", "JOIN", "KEY", "LEFT", "LIKE", "MAX", "MIN", "NOT",
"NULL", "ON", "OR", "ORDER", "OUTER", "OUTPUT", "PRIMARY", "PROCEDURE", "REVOKE", "ROLLBACK", "ROWCOUNT", "SELECT", "SET", "SQL", "SUM",
"TABLE", "THEN", "TRANSACTION", "TRUE", "UNION", "UNIQUE", "UPDATE", "USER", "VALUES", "VIEW", "WHEN", "WHERE"
};
//-------------------------------------------------------------------
public bool Generate(Config config)
{
// Validate configuration.
this.config = config;
if (!FileUtil.IsDirectory(config.OutputDirectory))
throw new Exception("Invalid directory specified [" + config.OutputDirectory + "]");
// Validate and cleanse configuration parameters.
if (StringUtil.IsEmpty(StringUtil.TrimAll(config.TableClass.BaseClass)))
config.TableClass.BaseClass = "DbDataItem";
// Clear files from output firectory.
if (Directory.EnumerateFiles(config.OutputDirectory, "*", SearchOption.TopDirectoryOnly).Count() > 0)
{
SaLogger.Info(GetType().Name + ".Generate Deleting existing files in output folders.");
DirectoryInfo di = new DirectoryInfo(config.OutputDirectory);
foreach (FileInfo file in di.EnumerateFiles())
file.Delete();
}
// Table definitions.
List<DbDfnTable> tableDfns = new List<DbDfnTable>();
foreach (DbDfnTable tableDfn in config.Database.GetTableDfns())
{
if (!IsValidTable(tableDfn.Name)) continue;
tableDfns.Add(tableDfn);
}
// Database schema XML.
GenerateDatabaseSchemaXml(tableDfns);
// Database definition class.
GenerateDatabaseDefinitionClass(tableDfns);
// Database table Classes.
foreach (DbDfnTable tableDfn in tableDfns)
GenerateTableInterfaceClass(tableDfn);
return true;
}
//-------------------------------------------------------------------
private bool IsValidTable(String table)
{
if (String.IsNullOrEmpty(table)) return false;
if (config.Schema.Tables_Included.Count > 0 && !config.Schema.Tables_Included.ContainsCI(table)) return false;
if (config.Schema.Tables_Excluded.Count > 0 && config.Schema.Tables_Excluded.ContainsCI(table)) return false;
return true;
}
//-------------------------------------------------------------------
private void GenerateDatabaseSchemaXml(List<DbDfnTable> tableDfns)
{
String filePath = config.OutputDirectory + Path.DirectorySeparatorChar + config.DefinitionClass.Classname + ".xml";
// Construct database definition.
DbDfnDatabase databaseDfn = new DbDfnDatabase();
foreach (DbDfnTable tableDfn in tableDfns)
{
databaseDfn.AddTable(tableDfn);
}
using (StreamWriter file = new StreamWriter(filePath))
{
file.Write(SerializableUtil.ToXml(databaseDfn));
}
}
//-------------------------------------------------------------------
/// <summary>Intercept column variable type name to replace double/float with decimal where required.</summary>
private String GetColumnVariableTypeName(DbDfnColumn columnDfn)
{
return GetColumnVariableTypeName(columnDfn, config.TableClass.TreatDoubleFormatAsDecimal);
}
/// <summary>Intercept column variable type name to replace double/float with decimal where required.</summary>
private static String GetColumnVariableTypeName(DbDfnColumn columnDfn, bool treatDoubleFormatAsDecimal)
{
if (treatDoubleFormatAsDecimal)
{
switch (columnDfn.DataType)
{
case DbColumnDataType.Single:
case DbColumnDataType.Double:
return "Decimal";
}
}
return columnDfn.GetVariableTypeName();
}
//-------------------------------------------------------------------
/// <summary>Intercept column variable type to replace double/float with decimal where required.</summary>
private String GetColumnVariableType(DbDfnColumn columnDfn)
{
return GetColumnVariableType(columnDfn, config.TableClass.TreatDoubleFormatAsDecimal);
}
/// <summary>Intercept column variable type to replace double/float with decimal where required.</summary>
private static String GetColumnVariableType(DbDfnColumn columnDfn, bool treatDoubleFormatAsDecimal)
{
if (treatDoubleFormatAsDecimal)
{
switch (columnDfn.DataType)
{
case DbColumnDataType.Single:
case DbColumnDataType.Double:
return "Decimal";
}
}
return columnDfn.GetVariableType();
}
//-------------------------------------------------------------------
/// <summary>Intercept column 'Get Field Suffix' to replace double/float with decimal where required.</summary>
private String GetColumnGetFieldSuffix(DbDfnColumn columnDfn)
{
return GetColumnGetFieldSuffix(columnDfn, config.TableClass.TreatDoubleFormatAsDecimal);
}
/// <summary>Intercept column 'Get Field Suffix' to replace double/float with decimal where required.</summary>
private static String GetColumnGetFieldSuffix(DbDfnColumn columnDfn, bool treatDoubleFormatAsDecimal)
{
if (treatDoubleFormatAsDecimal)
{
switch (columnDfn.DataType)
{
case DbColumnDataType.Single:
case DbColumnDataType.Double:
return "Decimal";
}
}
return columnDfn.GetGetFieldSuffix();
}
//-------------------------------------------------------------------
// D a t a b a s e D e f i n i t i o n C l a s s
//-------------------------------------------------------------------
private void GenerateDatabaseDefinitionClass(List<DbDfnTable> tableDfns)
{
String filePath = config.OutputDirectory + Path.DirectorySeparatorChar + config.DefinitionClass.Classname + ".cs";
using (StreamWriter file = new StreamWriter(filePath))
{
// Database definition file:
foreach (String namespace_Base in config.DefinitionClass.Usings.OrderBy(s => s))
file.WriteLine("using " + namespace_Base + ";");
file.WriteLine("using System;");
file.WriteLine("using System.Collections.Generic;");
file.WriteLine("using System.Linq;");
file.WriteLine("");
file.WriteLine("//---------------------------------------------------------------------------");
file.WriteLine("// Code generated by Sarand Database Utilities " + DateTime.Now.Format("ddd d-MMM-yyyy HH:mm:ss"));
file.WriteLine("//---------------------------------------------------------------------------");
file.WriteLine("namespace " + config.DefinitionClass.Namespace);
file.WriteLine("{");
file.WriteLine(tab1 + "public class " + config.DefinitionClass.Classname);
file.WriteLine(tab1 + "{");
file.WriteLine(tab2 + "//-------------------------------------------------------------------");
GenerateDatabaseDefinitionTablesEnum(tableDfns, file);
GenerateDatabaseDefinitionColumnsEnum(tableDfns, file);
GenerateDatabaseDefinitionClass(tableDfns, config.DefinitionClass.Classname, file);
file.WriteLine(tab1 + "}");
file.WriteLine("}");
//file.Close(); - Unecessary as the object will be disposed at the end of the 'using' block which is the same as Close.
}
}
//-------------------------------------------------------------------
// D a t a b a s e E n u m s
//-------------------------------------------------------------------
public static void GenerateDatabaseDefinitionTablesEnum(List<DbDfnTable> tableDfns, StreamWriter file)
{
file.WriteLine(tab2 + "// Table identifiers.");
file.WriteLine(tab2 + "public enum TableIdx");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "Unknown = 0,");
foreach (DbDfnTable tableDfn in tableDfns)
{
file.WriteLine(tab3 + tableDfn.Name + ",");
}
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
}
//-------------------------------------------------------------------
public static void GenerateDatabaseDefinitionColumnsEnum(List<DbDfnTable> tableDfns, StreamWriter file)
{
file.WriteLine(tab2 + "// Column identifiers.");
file.WriteLine(tab2 + "public enum ColumnIdx");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "Unknown = 0,");
foreach (DbDfnTable tableDfn in tableDfns)
{
foreach (var columnDfn in tableDfn.Columns)
file.WriteLine(tab3 + tableDfn.Name + "_" + columnDfn.Name + ",");
}
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
}
//-------------------------------------------------------------------
public static void GenerateDatabaseDefinitionClass(List<DbDfnTable> tableDfns, String classnameDefinition, StreamWriter file)
{
file.WriteLine(tab2 + "// Data members.");
file.WriteLine(tab2 + "private static readonly int tableCount = " + tableDfns.Count + ";");
file.WriteLine(tab2 + "private static readonly int columnCount = " + tableDfns.GetColumnCount() + ";");
file.WriteLine(tab2 + "private static ulong maxTextLen = 0;");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Table methods.
file.WriteLine(tab2 + "// Retrieve Table details (eg. name: 'Company').");
file.WriteLine(tab2 + "public static int GetTableCount ()");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "return tableCount;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static String GetTableName (TableIdx table, bool delimitReservedWords = true)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int tableIdx = (int)table - 1;");
file.WriteLine(tab3 + "if (tableIdx < 0 || tableIdx >= tableCount) return String.Empty;");
file.WriteLine(tab3 + "String tableName = tables[(int)tableIdx];");
file.WriteLine(tab3 + "if (delimitReservedWords) tableName = DelimitReservedWord(tableName);");
file.WriteLine(tab3 + "return tableName;");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Table for Column method.
file.WriteLine(tab2 + "// Identify the table that corresponds with the specified column.");
file.WriteLine(tab2 + "public static TableIdx GetTableForColumn (ColumnIdx column)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return TableIdx.Unknown;");
file.WriteLine(tab3 + "return columns[columnIdx].TableIdx;");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Column methods.
file.WriteLine(tab2 + "// Retrieve the specified Column's name (Qualified include table name: '(<Table>.Column>)').");
file.WriteLine(tab2 + "public static String GetColumnName (ColumnIdx column, bool delimitReservedWords = true)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return String.Empty;");
file.WriteLine(tab3 + "String columnName = columns[columnIdx].Name;");
file.WriteLine(tab3 + "if (delimitReservedWords) columnName = DelimitReservedWord(columnName);");
file.WriteLine(tab3 + "return columnName;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static String GetColumnNameQual (ColumnIdx column, String tableAlias = \"\", bool braces = false)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "String columnName = GetColumnName(column);");
file.WriteLine(tab3 + "if (!String.IsNullOrEmpty(columnName))");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "String tableName = StringUtil.EmptyOnNull(tableAlias);");
file.WriteLine(tab4 + "if (tableName.IsEmpty()) tableName = GetTableName(GetTableForColumn(column));");
file.WriteLine(tab4 + "columnName = tableName + (tableName.Length > 0 ? \".\" : \"\") + columnName;");
file.WriteLine(tab4 + "if (braces)");
file.WriteLine(tab5 + "columnName = \"(\" + columnName + \")\";");
file.WriteLine(tab3 + "}");
file.WriteLine(tab3 + "return columnName;");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Reserved word methods.
file.WriteLine(tab2 + "// Reserved words.");
file.WriteLine(tab2 + "private static DbReservedWordDelim reservedWordDelim = DbReservedWordDelim.SquareBrackets;");
file.WriteLine(tab2 + "public static void SetReservedWordDelim (DbReservedWordDelim reservedWordDelim)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + classnameDefinition + ".reservedWordDelim = reservedWordDelim;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static bool IsReservedWord (String word)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "if (String.IsNullOrEmpty(word)) return false;");
file.WriteLine(tab3 + "if (reservedWords.Contains(word, StringComparer.OrdinalIgnoreCase)) return true;");
file.WriteLine(tab3 + "return false;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static String DelimitReservedWord (String word)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "if (!IsReservedWord(word)) return word;");
file.WriteLine(tab3 + "switch (reservedWordDelim)");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "case DbReservedWordDelim.None:");
file.WriteLine(tab5 + "break;");
file.WriteLine(tab4 + "case DbReservedWordDelim.DoubleQuotes:");
file.WriteLine(tab5 + "word = \"\\\"\" + word + \"\\\"\"; ");
file.WriteLine(tab5 + "break;");
file.WriteLine(tab4 + "case DbReservedWordDelim.SquareBrackets:");
file.WriteLine(tab4 + "default:");
file.WriteLine(tab5 + "word = \"[\" + word + \"]\"; ");
file.WriteLine(tab5 + "break;");
file.WriteLine(tab3 + "}");
file.WriteLine(tab3 + "return word;");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Column information methods.
file.WriteLine(tab2 + "// Retrieve information about the specified Column.");
file.WriteLine(tab2 + "public static DbColumnDataType GetColDataType (ColumnIdx column)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return DbColumnDataType.Unknown;");
file.WriteLine(tab3 + "return columns[columnIdx].DataType;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static short GetColNativeDataType (ColumnIdx column)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return 0;");
file.WriteLine(tab3 + "return columns[columnIdx].NativeDataType;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static void SetMaxTextLen (ulong maxTextLen)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + classnameDefinition + ".maxTextLen = maxTextLen;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static bool IsColFmtText (ColumnIdx column)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return false;");
file.WriteLine(tab3 + "return (columns[columnIdx].DataType == DbColumnDataType.VarChar);");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static ulong GetColTextLen (ColumnIdx column)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return 0;");
file.WriteLine(tab3 + "if (columns[columnIdx].DataType == DbColumnDataType.VarChar)");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "ulong textLen = columns[columnIdx].DataLen;");
file.WriteLine(tab4 + "if (maxTextLen > 0 && textLen > maxTextLen) textLen = maxTextLen;");
file.WriteLine(tab4 + "return textLen;");
file.WriteLine(tab3 + "}");
file.WriteLine(tab3 + "return 0;");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static bool IsColFmtBool (ColumnIdx column)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return false;");
file.WriteLine(tab3 + "return (columns[columnIdx].DataType == DbColumnDataType.Bit);");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public static bool IsColFmtNumeric (ColumnIdx column)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "int columnIdx = (int)column - 1;");
file.WriteLine(tab3 + "if (columnIdx < 0 || columnIdx >= columnCount) return false;");
file.WriteLine(tab3 + "switch (columns[columnIdx].DataType)");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "case DbColumnDataType.TinyInt:");
file.WriteLine(tab4 + "case DbColumnDataType.SmallInt:");
file.WriteLine(tab4 + "case DbColumnDataType.Int:");
file.WriteLine(tab4 + "case DbColumnDataType.BigInt:");
file.WriteLine(tab4 + "case DbColumnDataType.Single:");
file.WriteLine(tab4 + "case DbColumnDataType.Double:");
file.WriteLine(tab4 + "case DbColumnDataType.Decimal:");
file.WriteLine(tab5 + "return true;");
file.WriteLine(tab3 + "}");
file.WriteLine(tab3 + "return false;");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Table definitions.
file.WriteLine(tab2 + "// Table definitions.");
file.WriteLine(tab2 + "private static readonly String[] tables =");
file.WriteLine(tab2 + "{");
foreach (DbDfnTable tableDfn in tableDfns)
file.WriteLine(tab3 + "\"" + tableDfn.Name + "\", ");
file.WriteLine(tab2 + "};");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Table Column definitions.
file.WriteLine(tab2 + "// Table column definitions.");
file.WriteLine(tab2 + "private class ColumnDfn");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "internal TableIdx TableIdx { get; set; }");
file.WriteLine(tab3 + "internal String Name { get; set; }");
file.WriteLine(tab3 + "internal DbColumnDataType DataType { get; set; }");
file.WriteLine(tab3 + "internal short NativeDataType { get; set; }");
file.WriteLine(tab3 + "internal bool IsIdentity { get; set; }");
file.WriteLine(tab3 + "internal ulong DataLen { get; set; }");
file.WriteLine(tab3 + "internal ColumnDfn (int tableIdx, String name, int dataType, short nativeDataType, bool isIdentity, ulong dataLen)");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "this.TableIdx = (TableIdx)tableIdx;");
file.WriteLine(tab4 + "this.Name = name;");
file.WriteLine(tab4 + "this.DataType = (DbColumnDataType)dataType;");
file.WriteLine(tab4 + "this.NativeDataType = nativeDataType;");
file.WriteLine(tab4 + "this.IsIdentity = isIdentity;");
file.WriteLine(tab4 + "this.DataLen = dataLen;");
file.WriteLine(tab3 + "}");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "private static readonly ColumnDfn[] columns =");
file.WriteLine(tab2 + "{");
uint tableIdx = 0;
foreach (DbDfnTable tableDfn in tableDfns)
{
tableIdx++;
foreach (var columnDfn in tableDfn.Columns)
file.WriteLine(tab3 + "new ColumnDfn(" + tableIdx.ToString() + ",\"" + columnDfn.Name + "\"," + ((int)columnDfn.DataType).ToString() + "," + columnDfn.DataTypeNative.ToString() + "," + (columnDfn.IsIdentity ? "true" : "false") + "," + columnDfn.Size.ToString() + "),");
}
file.WriteLine(tab2 + "};");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Reserved words.
file.WriteLine(tab2 + "// Reserved words.");
file.WriteLine(tab2 + "private static readonly List<String> reservedWords = new List<String>()");
file.WriteLine(tab2 + "{");
foreach (String reservedword in reservedWords)
file.WriteLine(tab3 + "\"" + reservedword + "\", ");
file.WriteLine(tab2 + "};");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
}
//-------------------------------------------------------------------
// T a b l e C l a s s
//-------------------------------------------------------------------
private void GenerateTableInterfaceClass(DbDfnTable tableDfn)
{
String className = tableDfn.Name + "_Db";
List<String> primaryColumnNames = tableDfn.GetPrimaryColumnNames();
String identityColumnName = tableDfn.Columns.GetIdentityColumnName();
// Class 'using's.
List<String> usingNamespaces = new List<string>(config.TableClass.Usings);
usingNamespaces.AddRange(new List<String>()
{
config.TableClass.Namespace_BaseClass,
"System",
"System.Collections.Generic",
"System.Data.Common",
config.DotNetVersion == DotNetVersion.Framework? "System.Data.Odbc" : "",
config.DotNetVersion == DotNetVersion.Core3 ? "Microsoft.Data.SqlClient" : "System.Data.SqlClient",
"System.Linq"
});
usingNamespaces.RemoveBlanks();
usingNamespaces.RemoveDuplicatesCI();
usingNamespaces.Sort();
// Alternative table names.
List<String> alternativeTableNames = new List<string>();
if (config.Schema.AlternativeTableNames.ContainsKey(tableDfn.Name))
alternativeTableNames.AddRange(config.Schema.AlternativeTableNames[tableDfn.Name]);
// List of columns to be ignored on update.
List<String> columnsIgnoredOnUpdate = new List<string>();
foreach (StringPair insertOnlyColumns in config.Schema.InsertOnlyColumns.FindAll(x => Regex.IsMatch(tableDfn.Name, x.Item1, RegexOptions.IgnoreCase)))
columnsIgnoredOnUpdate.AddRange(insertOnlyColumns.Item2.Split(','));
for (int i = 0; i < columnsIgnoredOnUpdate.Count; i++)
columnsIgnoredOnUpdate[i] = columnsIgnoredOnUpdate[i].Trim(' ');
String filePath = config.OutputDirectory + Path.DirectorySeparatorChar + className + ".cs";
using (StreamWriter file = new StreamWriter(filePath))
{
// Database definition file.
foreach (String usingNamespace in usingNamespaces)
file.WriteLine("using " + usingNamespace + ";");
file.WriteLine("");
file.WriteLine("//---------------------------------------------------------------------------");
file.WriteLine("// Code generated by Sarand Database Utilities " + DateTime.Now.Format("ddd d-MMM-yyyy HH:mm:ss"));
file.WriteLine("//---------------------------------------------------------------------------");
file.WriteLine("namespace " + config.TableClass.Namespace);
file.WriteLine("{");
file.WriteLine(tab1 + "internal class " + className + " : " + config.TableClass.BaseClass);
file.WriteLine(tab1 + "{");
file.WriteLine(tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "// Column definitions.");
file.WriteLine(tab2 + "public class ColumnsData");
file.WriteLine(tab2 + "{");
foreach (var columnDfn in tableDfn.Columns)
file.WriteLine(tab3 + "public ColumnData" + GetColumnVariableTypeName(columnDfn) + " _" + columnDfn.Name + " { get; } = new ColumnData" + GetColumnVariableTypeName(columnDfn) + "(\"" + columnDfn.Name + "\"" + (columnDfn.IsIdentity ? ", true" : "") + ");");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "// Data members.");
file.WriteLine(tab2 + "protected static List<String> fields { get; } = new List<String>()");
file.WriteLine(tab2 + "{");
foreach (var columnDfn in tableDfn.Columns) file.WriteLine(tab3 + "\"" + columnDfn.Name + "\",");
file.WriteLine(tab2 + "};");
file.WriteLine(tab2 + "protected static List<String> fieldsId { get; } = new List<String>()");
file.WriteLine(tab2 + "{");
foreach (var columnDfn in tableDfn.Columns.FindAll(item => item.IsIdentity)) file.WriteLine(tab3 + "\"" + columnDfn.Name + "\",");
file.WriteLine(tab2 + "};");
file.WriteLine(tab2 + "protected static List<String> fieldsPrimary { get; } = new List<String>()");
file.WriteLine(tab2 + "{");
foreach (String columnName in primaryColumnNames) file.WriteLine(tab3 + "\"" + columnName + "\",");
file.WriteLine(tab2 + "};");
file.WriteLine(tab2 + "protected static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()");
file.WriteLine(tab2 + "{");
foreach (String columnName in columnsIgnoredOnUpdate) file.WriteLine(tab3 + "\"" + columnName + "\",");
file.WriteLine(tab2 + "};");
/*
file.WriteLine(tab2 + "protected static List<String> fieldsNonId { get; } = new List<String>()");
file.WriteLine(tab2 + "{");
foreach (var columnDfn in tableDfn.Columns.FindAll(item => !item.IsIdentity)) file.WriteLine(tab3 + "\"" + columnDfn.Name + "\",");
file.WriteLine(tab2 + "};");
*/
//-----------------------------------------------------------
// Construction.
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "// Construction.");
file.WriteLine(tab2 + "internal " + className + " (" + config.TableClass.ClassName_DatabaseInfo + " dbInfo" + (!config.TableClass.MandatoryConstructorDbInfo ? " = null" : "") + ") : base(dbInfo)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab2 + "}");
//-----------------------------------------------------------
// Properties.
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "// Properties.");
file.WriteLine(tab2 + "public override String SchemaName { get; } = \"" + tableDfn.Schema + "\";");
if (alternativeTableNames.Count == 0)
file.WriteLine(tab2 + "public override String TableName { get; } = \"" + tableDfn.Name + "\";");
else
{
// Logic to handle alternative table names.
file.WriteLine(tab2 + "public override String TableName { get { return GetActualTableName(\"" + tableDfn.Name + "\"); } }");
file.WriteLine(tab2 + "public override List<String> AlternativeTableNames { get; } = new List<string>() { " + alternativeTableNames.Concat(", ", "\"", "\"") + " };");
}
file.WriteLine(tab2 + "public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? \"[\" + SchemaName + \"].\" : \"\") + \"[\" + TableName + \"]\"; } }");
file.WriteLine(tab2 + "public static List<String> Fields { get { return new List<String>(fields); } }");
file.WriteLine(tab2 + "public static List<String> FieldsId { get { return new List<String>(fieldsId); } }");
file.WriteLine(tab2 + "public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }");
file.WriteLine(tab2 + "// Columns.");
file.WriteLine(tab2 + "public ColumnsData Cols { get; } = new ColumnsData();");
foreach (var columnDfn in tableDfn.Columns)
file.WriteLine(tab2 + "public " + GetColumnVariableType(columnDfn) + " _" + columnDfn.Name + " { get { return Cols._" + columnDfn.Name + ".Value; } set { Cols._" + columnDfn.Name + ".Value = value; } }");
file.WriteLine(tab2 + "// Existing columns - confirmed on database if table exists.");
file.WriteLine(tab2 + "public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }");
file.WriteLine(tab2 + "public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }");
//-----------------------------------------------------------
// Population.
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "// Population.");
file.WriteLine(tab2 + "public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "dbCommand.CommandText =");
file.WriteLine(tab4 + "\"SELECT \" + ExistingColumnNames.Concat(\", \", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + \".\" : \"\") + \"[\", \"]\") + \" \" +");
file.WriteLine(tab4 + "\"FROM \" + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? \" \" + tableAlias : \"\") + \" \" + ");
file.WriteLine(tab4 + "(!String.IsNullOrEmpty(filter) ? \"WHERE \" + filter : \"\");");
file.WriteLine(tab3 + "Log(GetType().Name + \".PopulateFrom\", dbCommand.CommandText);");
file.WriteLine(tab3 + "using (DbDataReader dbDataReader = dbCommand.ExecuteReader())");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "dbDataReader.Read();");
file.WriteLine(tab4 + "PopulateFrom(dbDataReader);");
file.WriteLine(tab3 + "}");
file.WriteLine(tab2 + "}");
file.WriteLine(tab2 + "public override void PopulateFrom (DbDataReader dbDataReader)");
file.WriteLine(tab2 + "{");
foreach (var columnDfn in tableDfn.Columns)
file.WriteLine(tab3 + "_" + columnDfn.Name + " = GetField" + GetColumnGetFieldSuffix(columnDfn) + "(dbDataReader, \"" + columnDfn.Name + "\", _" + columnDfn.Name + ");");
file.WriteLine(tab2 + "}");
//-----------------------------------------------------------
// Prepare Insert command.
// SQL:
// Parameters can be named.
// Multiple queries allowed - can append 'SELECT Scope_Identity();' to insert query.
// ODBC:
// Parameters identified as '?' and matched by position in parameter list.
// Single queries only. Use Max(Id) to retrieve identity value.
//-----------------------------------------------------------
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "// Insert command.");
file.WriteLine(tab2 + "public override bool ExecuteInsertCommand (DbCommand dbCommand)");
file.WriteLine(tab2 + "{");
file.WriteLine(tab3 + "List<String> columnNames = ExistingColumnNamesNonId;");
if (!String.IsNullOrEmpty(identityColumnName))
{
file.WriteLine(tab3 + "// Avoid insert if Identity field is already valid.");
file.WriteLine(tab3 + "if (_" + identityColumnName + " != 0) throw new Exception(\"Invalid for Insert - item already has a valid Id\"); ");
}
file.WriteLine(tab3 + "// Construct query.");
file.WriteLine(tab3 + "String query =");
file.WriteLine(tab4 + "\"INSERT INTO \" + TableNameFmt + \" \" +");
file.WriteLine(tab4 + "\"(\"+columnNames.Concat(\",\",\"[\",\"]\")+\") \";");
if (!String.IsNullOrEmpty(identityColumnName))
file.WriteLine(tab3 + "query += \"Output Inserted." + identityColumnName + " \";");
List<String> columnsValuesToInsertSql = new List<String>();
foreach (var columnDfn in tableDfn.Columns)
{
if (!columnDfn.IsIdentity)
columnsValuesToInsertSql.Add("@" + columnDfn.Name);
}
file.WriteLine(tab3 + "if (dbCommand is SqlCommand)");
file.WriteLine(tab4 + "query += \"VALUES (\" + columnNames.Concat(\",\", \"@\", \"\") + \") \";");
file.WriteLine(tab3 + "else query += \"VALUES (\" + " + (config.SarandCommonVersion == SarandCommonVersion.VS2019 ? "StringListUtil" : "StringList") + ".CreateList(\"?\", columnNames.Count).Concat(\",\") + \") \";");
if (!String.IsNullOrEmpty(identityColumnName) && config.DbmsOutput == Dbms.SQL)
file.WriteLine(tab3 + "query += SELECT Scope_Identity();"); // NB @@Identity for Access.
file.WriteLine(tab3 + "dbCommand.CommandText = query;");
file.WriteLine(tab3 + "Log(GetType().Name + \".ExecuteInsertCommand\", dbCommand.CommandText);");
file.WriteLine(tab3 + "// Populate parameters.");
file.WriteLine(tab3 + "dbCommand.Parameters.Clear();");
foreach (var columnDfn in tableDfn.Columns)
{
if (!columnDfn.IsIdentity)
file.WriteLine(tab3 + "if (columnNames.ContainsCI(\"" + columnDfn.Name + "\")) AddCommandParameter(dbCommand, \"@" + columnDfn.Name + "\", _" + columnDfn.Name + ");");
}
file.WriteLine(tab3 + "// Execute insert command.");
file.WriteLine(tab3 + "bool commandSuccess = false;");
if (config.DbmsOutput == Dbms.SQL)
{
if (!String.IsNullOrEmpty(identityColumnName))
{
// Execute single command to insert and query 'Scope_Identity' to retrieve Identity value.
file.WriteLine(tab3 + "_" + identityColumnName + " = Convert.ToInt32(dbCommand.ExecuteScalar());");
file.WriteLine(tab3 + "commandSuccess = (_" + identityColumnName + " > 0);");
}
else
{
// Execute query and retrieve number of records (may return -1).
file.WriteLine(tab3 + "int executeNonQuery = dbCommand.ExecuteNonQuery();");
file.WriteLine(tab3 + "commandSuccess = true;");
}
}
else
{
// Execute query.
file.WriteLine(tab3 + "int executeNonQuery = dbCommand.ExecuteNonQuery();");
file.WriteLine(tab3 + "if (executeNonQuery == 1)"); // No of records inserted? Returns -1?
file.WriteLine(tab3 + "{");
if (!String.IsNullOrEmpty(identityColumnName))
{
// Retrieve Identity value.
file.WriteLine(tab4 + "dbCommand.CommandText = \"SELECT Max(" + identityColumnName + ") FROM \" + TableNameFmt + \";\";");
file.WriteLine(tab4 + "_" + identityColumnName + " = Convert.ToInt32(dbCommand.ExecuteScalar());");
file.WriteLine(tab4 + "commandSuccess = (_" + identityColumnName + " > 0);");
}
else
{
file.WriteLine(tab4 + "commandSuccess = true;");
}
file.WriteLine(tab3 + "}");
}
file.WriteLine(tab3 + "return commandSuccess;");
file.WriteLine(tab2 + "}");
//-----------------------------------------------------------
// Prepare Update command.
// Filter: Primary index values.
// Update: Non-primary index values.
// SQL:
// Parameters can be named.
// ODBC:
// Parameters identified as '?' and matched by position in parameter list.
// Single queries only. Use Max(Id) to retrieve identity value.
//-----------------------------------------------------------
// Construct update command.
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
file.WriteLine(tab2 + "// Update command.");
file.WriteLine(tab2 + "public override bool ExecuteUpdateCommand (DbCommand dbCommand)");
file.WriteLine(tab2 + "{");
if (!String.IsNullOrEmpty(identityColumnName))
{
file.WriteLine(tab3 + "// Avoid update if Identity field isn't valid.");
file.WriteLine(tab3 + "if (_" + identityColumnName + " == 0) throw new Exception(\"Invalid for Update - item has an invalid Id\"); ");
}
file.WriteLine(tab3 + "// Columns to update.");
file.WriteLine(tab3 + "List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();");
file.WriteLine(tab3 + "// Construct query.");
file.WriteLine(tab3 + "String query = \"UPDATE \" + TableNameFmt + \" SET \";");
List<String> columnsValuesToUpdate = new List<String>();
List<String> columnsValuesToUpdateSql = new List<String>();
foreach (var columnDfn in tableDfn.Columns)
{
if (primaryColumnNames.Any(col => col.EqualsCI(columnDfn.Name))) continue;
if (columnsIgnoredOnUpdate.Any(col => col.EqualsCI(columnDfn.Name))) continue;
// Delimit reserved column names.
String columnNameSql = columnDfn.Name;
if (reservedWords.ToList().ContainsCI(columnNameSql))
columnNameSql = "[" + columnNameSql + "]";
columnsValuesToUpdate.Add(columnDfn.Name + "=?");
columnsValuesToUpdateSql.Add(columnNameSql + "=@" + columnDfn.Name);
}
//-----------------------------------------------------------
// SQL Update.
file.WriteLine(tab3 + "if (dbCommand is SqlCommand)");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "query += StringPairList.CreateFrom(columnNames.Bracket(\"[\",\"]\"),columnNames).Concat(\"=@\").Concat(\", \") + \" \";");
List<String> whereFilterSql = new List<string>();
foreach (var primaryColumnName in primaryColumnNames)
whereFilterSql.Add(primaryColumnName + "=@" + primaryColumnName);
file.WriteLine(tab4 + "query += \"WHERE " + whereFilterSql.Concat(" AND ") + ";\";");
file.WriteLine(tab3 + "}");
//-----------------------------------------------------------
// Non-SQL Update.
file.WriteLine(tab3 + "else");
file.WriteLine(tab3 + "{");
file.WriteLine(tab4 + "query += columnNames.Concat(\", \", \"\", \"=?\") + \" \";");
List<String> whereFilterNonSql = new List<string>();
foreach (var primaryColumnName in primaryColumnNames)
whereFilterNonSql.Add(primaryColumnName + "=?");
file.WriteLine(tab4 + "query += \"WHERE " + whereFilterNonSql.Concat(" AND ") + ";\";");
file.WriteLine(tab3 + "}");
//-----------------------------------------------------------
// Populate parameters and execute update command.
file.WriteLine(tab3 + "dbCommand.CommandText = query;");
file.WriteLine(tab3 + "Log(GetType().Name + \".ExecuteUpdateCommand\", dbCommand.CommandText);");
file.WriteLine(tab3 + "// Populate parameters.");
file.WriteLine(tab3 + "dbCommand.Parameters.Clear();");
foreach (var columnDfn in tableDfn.Columns.FindAll(item => !primaryColumnNames.Contains(item.Name) && !columnsIgnoredOnUpdate.Contains(item.Name)))
file.WriteLine(tab3 + "if (columnNames.ContainsCI(\"" + columnDfn.Name + "\")) AddCommandParameter(dbCommand, \"@" + columnDfn.Name + "\", _" + columnDfn.Name + ");");
foreach (var primaryColumnName in primaryColumnNames)
file.WriteLine(tab3 + "AddCommandParameter(dbCommand, \"@" + primaryColumnName + "\", _" + primaryColumnName + ");");
file.WriteLine(tab3 + "int executeNonQueryResult = dbCommand.ExecuteNonQuery();");
file.WriteLine(tab3 + "return (executeNonQueryResult == 1);");
file.WriteLine(tab2 + "}");
file.WriteLine(crlf + tab2 + "//-------------------------------------------------------------------");
// Close class.
file.WriteLine(tab1 + "}");
file.WriteLine("}");
//file.Close(); - Unecessary as the object will be disposed at the end of the 'using' block.
}
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.Base
{
//=======================================================================
public class SaDbDfnConnection
{
//-------------------------------------------------------------------
// Definitions.
public enum ConnectionType
{
DSN,
ConnectionString,
StaticSchema
}
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public SaDbDfnConnection (ConnectionType type, String databaseConnection)
{
Type = type;
if (Type == ConnectionType.DSN)
DataSourceName = databaseConnection;
else if (Type == ConnectionType.DSN)
ConnectionString = databaseConnection;
else if (Type == ConnectionType.DSN)
StaticSchemaFilePath = databaseConnection;
}
//-------------------------------------------------------------------
// Properties.
public ConnectionType Type { get; }
public String DataSourceName { get; }
public String DataSourceDriver { get; set; }
public String ConnectionString { get; }
public String StaticSchemaFilePath { get; }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,39 @@
using Microsoft.Win32;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.Base
{
//=======================================================================
public class SaDbDfnOdbcDataSource
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public SaDbDfnOdbcDataSource (String name, String driver, String description = "")
{
Name = StringUtil.EmptyOnNull(name);
Driver = StringUtil.EmptyOnNull(driver);
Description = StringUtil.EmptyOnNull(description);
}
//-------------------------------------------------------------------
// Properties.
public String Name { get; } = "";
public String Driver { get; } = "";
public String Description { get; } = "";
//-------------------------------------------------------------------
// Utilities.
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,58 @@
using Microsoft.Win32;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.Base
{
//=======================================================================
public class SaDbDfnOdbcDriver
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public SaDbDfnOdbcDriver (String name)
{
Name = name;
}
//-------------------------------------------------------------------
// Properties.
public String Name { get; }
public Dictionary<String,String> Attributes { get; } = new Dictionary<String, String>();
//-------------------------------------------------------------------
// Utilities.
/// <summary>Add 'Driver' attribute from registry. Fails if driver name not found.</summary>
public bool AddDriverConfig ()
{
if (StringUtil.IsEmpty(Name)) return false;
try
{
// Retrieve 'Driver' (location of DLL) parameter for this driver:
using (RegistryKey localMachineHive = Registry.LocalMachine)
using (RegistryKey odbcDriverKey = localMachineHive.OpenSubKey(@"SOFTWARE\ODBC\ODBCINST.INI\" + Name))
{
if (odbcDriverKey != null)
{
object driverName = odbcDriverKey.GetValue("Driver");
if (driverName != null && driverName is String)
Attributes["Driver"] = driverName.ToString();
}
return true;
}
}
catch (Exception) { }
return true;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
+267
View File
@@ -0,0 +1,267 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Base.App;
namespace Sarand.Net.Standard.Dbas.Base
{
//=======================================================================
public abstract class SacsDatabase : SacsStateItem, ISacsDatabase
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
protected SacsDatabase (DbmsType dbms, String databaseName, String connectionString)
{
DbmsType = dbms;
DatabaseName = databaseName;
ConnectionString = connectionString;
}
//-------------------------------------------------------------------
// Database properties.
public String ConnectionString { get; }
public DbmsType DbmsType { get; }
public String DatabaseName { get; }
public SelectLockMode SelectLockMode { get; set; } = SelectLockMode.Default;
public bool DisplayErrors { get; set; } = true;
public abstract void OnConnectionChanged ();
public abstract DbConnection CreateConnection (bool forceOdbc = false);
public abstract DbDataAdapter CreateDataAdapter ();
// Profile properties.
public static String ProfileSection_DbUtilities { get; } = "DbUtilities";
public static String ProfileValue_DbExportFile { get; } = "DbExportFile";
public static String ProfileValue_DbExportDsn { get; } = "DbExportDsn";
public static String ProfileValue_DbExportFmt { get; } = "DbExportFmt";
public static String ProfileValue_SecondArchivePath { get; } = "SecondaryArchivePath";
public static String ProfileValue_SecondArchive { get; } = "SecondaryArchive";
public static String ProfileValue_CompareSourceDbDsn { get; } = "CompareDbSourceDsn";
public static String ProfileValue_CompareTargetDbDsn { get; } = "CompareDbTargetDsn";
public static String ProfileValue_DlgPos_DbView { get; } = "DlgPos:DbView";
public static String ProfileValue_DlgPos_DbCompare { get; } = "DlgPos:DbCompare";
//-------------------------------------------------------------------
// I d e n t i t y G e n e r a t i o n
//-------------------------------------------------------------------
protected String NextIdTable { get; set; } = "NextId";
protected String NextIdColumn_Object { get; set; } = "Object";
protected String NextIdColumn_NextId { get; set; } = "NextId";
public abstract SysId GetNextId (String objectName, DbUpdateInfo dbUpdateInfo, bool databaseTable = true, String idColumn = "Id");
public abstract int GetNextIdFromTable(string objectName, string idColumn = "Id");
public abstract bool SetMinNextId (String objectName, SysId id, DbUpdateInfo dbUpdateInfo, bool databaseTable = true, String idColumn = "Id", bool force = false);
//-------------------------------------------------------------------
// O D B C D r i v e r s
//-------------------------------------------------------------------
[DllImport("odbccp32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern bool SQLGetInstalledDriversW (char[] lpszBuf, ushort cbufMax, out ushort pcbBufOut);
/// <summary>
/// Gets the ODBC driver names from the SQLGetInstalledDrivers function.
/// <para>Ref. https://stackoverflow.com/questions/6457973/odbc-driver-list-from-net</para>
/// </summary>
/// <returns>List of ODBC driver names, if successfull.</returns>
public static List<String> GetOdbcDriverNames ()
{
try
{
// ToDo Switch to SQLDrivers to get name and attributes.
// Ref. https://social.msdn.microsoft.com/Forums/en-US/e98d3beb-35d5-4899-b277-0f7c568c6215/list-of-odbc-drivers-installed?forum=visualfoxprogeneral.
// P/Invoke to SQLGetInstalledDriversW.
// NB Only returns names and not attributes.
char[] driverNamesBuffer = new char[ushort.MaxValue];
ushort size;
bool succeeded = SQLGetInstalledDriversW(driverNamesBuffer, ushort.MaxValue, out size);
if (succeeded == true)
{
char[] driverNames = new char[size - 1];
Array.Copy(driverNamesBuffer, driverNames, size - 1);
return new List<String>(new string(driverNames).Split('\0')).OrderBy(item => item).ToList();
}
}
catch (Exception) { }
try
{
// Alternatively, use the registry.
using (RegistryKey localMachineHive = Registry.LocalMachine)
using (RegistryKey odbcDriversKey = localMachineHive.OpenSubKey(@"SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"))
{
if (odbcDriversKey != null)
return new List<String>(odbcDriversKey.GetValueNames()).OrderBy(item => item).ToList();
}
// 64-BitConverter machines.
using (RegistryKey localMachineHive = Registry.LocalMachine)
using (RegistryKey odbcDriversKey = localMachineHive.OpenSubKey(@"SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers"))
{
if (odbcDriversKey != null)
return new List<String>(odbcDriversKey.GetValueNames()).OrderBy(item => item).ToList();
}
}
catch (Exception) { }
return new List<String>();
}
//-------------------------------------------------------------------
// O D B C D a t a S o u r c e s
//-------------------------------------------------------------------
[DllImport("odbc32.dll")]
public static extern int SQLDataSources (int EnvHandle, int Direction, StringBuilder ServerName, int ServerNameBufferLenIn, ref int ServerNameBufferLenOut, StringBuilder Driver, int DriverBufferLenIn, ref int DriverBufferLenOut);
[DllImport("odbc32.dll")]
public static extern int SQLAllocEnv (ref int EnvHandle);
public static List<SaDbDfnOdbcDataSource> GetOdbcDatasources ()
{
List<SaDbDfnOdbcDataSource> dataSources = new List<SaDbDfnOdbcDataSource>();
int envHandle=0;
const int SQL_FETCH_NEXT = 1;
const int SQL_FETCH_FIRST_SYSTEM = 32;
if (SQLAllocEnv(ref envHandle) != -1)
{
int ret;
StringBuilder serverName = new StringBuilder(1024);
StringBuilder driverName = new StringBuilder(1024);
int snLen = 0;
int driverLen = 0;
ret = SQLDataSources(envHandle, SQL_FETCH_FIRST_SYSTEM, serverName, serverName.Capacity, ref snLen, driverName, driverName.Capacity, ref driverLen);
while (ret == 0)
{
SaDbDfnOdbcDataSource dataSource = new SaDbDfnOdbcDataSource(serverName.ToString(), driverName.ToString());
dataSources.Add(dataSource);
ret = SQLDataSources(envHandle, SQL_FETCH_NEXT, serverName, serverName.Capacity, ref snLen, driverName, driverName.Capacity, ref driverLen);
}
}
return dataSources.OrderBy(item => item.Name).ToList();
}
//-------------------------------------------------------------------
// Q u e r y D a t a b a s e
//-------------------------------------------------------------------
public String GetSelectQueryPrefix ()
{
// Query prefix.
switch (SelectLockMode)
{
case SelectLockMode.ReadCommitted:
if (DbmsType == DbmsType.MsSql)
{
// Recommended for SQL2005+ to allow committed reads the same visibility as uncommitted reads:
// -- Enable row versioning for the default Read Committed isolation level
// ALTER DATABASE DevSchoolOneLMS SET READ_COMMITTED_SNAPSHOT ON;
// -- Enable row versioning as a separate Snapshot isolation level
// ALTER DATABASE DevSchoolOneLMS SET ALLOW_SNAPSHOT_ISOLATION ON;
// Enabling row versioning allows the default READ COMMITTED isolation level to see a consistant
// version of the row without resorting to SHARE locks that block UPDATE statements.
return "Set Transaction Isolation Level Read Committed; ";
}
break;
case SelectLockMode.ReadUncommitted:
if (DbmsType == DbmsType.MsSql)
return "Set Transaction Isolation Level Read Uncommitted; ";
break;
case SelectLockMode.RepeatableRead:
if (DbmsType == DbmsType.MsSql)
return "Set Transaction Isolation Level Repeatable Read; ";
break;
case SelectLockMode.Serializable:
if (DbmsType == DbmsType.MsSql)
return "Set Transaction Isolation Level Serializable; ";
break;
}
return "";
}
public abstract IDbDataTable ExecuteQuery (String query);
public abstract int ExecuteNonQuery (String query);
public abstract int ExecuteInsert (String tableName, List<StringPair> columnNameValues);
public abstract int ExecuteUpdate (String tableName, List<StringPair> columnNameValues, String filter);
public abstract int ExecuteDelete (String tableName, String filter);
/// <summary>
/// Add value pair - used to build value lists for insert and update.
/// <para>Caters for delimiting text values and uses 'NULL' for empty text values.</para>
/// </summary>
public static void AddValuePair (List<StringPair> columnNameValues, String columnName, String value, bool delimitString = false)
{
if (delimitString)
{
if (!StringUtil.IsEmpty(value))
value = "'" + value.Duplicate('\'') + "'";
else value = "NULL";
}
columnNameValues.Add(columnName, value);
}
/// <summary>Add SysId value pair - used to build value lists for insert and update.</summary>
public static void AddValuePair (List<StringPair> columnNameValues, String columnName, SysId value)
{
columnNameValues.Add(columnName, SysId.ToInt(value).ToString());
}
/// <summary>Add numeric value pair - used to build value lists for insert and update.</summary>
public static void AddValuePair (List<StringPair> columnNameValues, String columnName, long value)
{
columnNameValues.Add(columnName, value.ToString());
}
/// <summary>Add decimal value pair - used to build value lists for insert and update.</summary>
public static void AddValuePair (List<StringPair> columnNameValues, String columnName, decimal value)
{
columnNameValues.Add(columnName, value.ToString());
}
/// <summary>Add date/time value pair - used to build value lists for insert and update.</summary>
public static void AddValuePair (List<StringPair> columnNameValues, String columnName, DateTime value)
{
AddValuePair(columnNameValues, columnName, DateUtil.Format(value, "yyyy/MM/dd HH:mm:ss"), true);
}
// Specific queries.
public abstract long GetRowCount (String tableName, String filter);
public abstract DataValue GetRowValue (String tableName, String columnName, String filter);
public abstract DataValue GetRowValue (String tableName, String columnName, String filter, DbGetValueType getValueType);
//-------------------------------------------------------------------
// D a t a b a s e S c h e m a
//-------------------------------------------------------------------
public abstract List<String> GetTableNames ();
public abstract List<DbDfnTable> GetTableDfns (bool refresh = false);
public abstract DbDfnTable GetTableDfn (String name, bool refresh = false);
public bool TableExists (String tableName)
{
if (StringUtil.IsEmpty(tableName)) return false;
return GetTableNames().Exists(table => table.EqualsCI(tableName));
}
public bool ColumnExists (String tableName, String columnName)
{
if (StringUtil.IsEmpty(tableName) || StringUtil.IsEmpty(columnName)) return false;
DbDfnTable table = GetTableDfn(tableName);
if (table != null)
return table.HasColumnByName(columnName);
return false;
}
public bool IndexExists (String tableName, String indexName)
{
if (StringUtil.IsEmpty(tableName) || StringUtil.IsEmpty(indexName)) return false;
DbDfnTable table = GetTableDfn(tableName);
if (table != null)
return table.HasIndexByName(indexName);
return false;
}
//-------------------------------------------------------------------
// Logging.
public static SaMessageLevel LoggingLevel { get; set; } = SaMessageLevel.None;
public static String LoggingPrefix { get; set; } = " ~~~ ";
protected static void Log (String fn, String message, SaMessageLevel level = SaMessageLevel.Debug)
{
if ((int)level > (int)LoggingLevel) return;
SaLogger.Log((fn + "\n\t" + message).Trim(), level);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,301 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Base
{
//=======================================================================
public class SacsDatabaseConsole : SaErrorStateItem
{
//-------------------------------------------------------------------
// Database configuration
public class OdbcConfig
{
public DbmsType dbms = DbmsType.General;
public String connectionString; // Raw connection string.
public String location, user, pword; // Application properties.
}
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
//-------------------------------------------------------------------
// Utilities.
private void LogSql (String sql)
{
SaLogger.Debug(GetType().Name + " SQL: " + sql);
}
//-------------------------------------------------------------------
// O p e n O D B C D a t a b a s e
//-------------------------------------------------------------------
public static SacsDatabase OpenOdbcDatabase (OdbcConfig config)
{
// Construct connection string.
String databaseName = "";
String connectionString = config.connectionString;
String sqlConnectionString = String.Empty;
DbmsType dbms = DbmsType.General;
// SQL connection.
if (config.location.Left(6).EqualsCI("MsSql:"))
{
// MsSql:Server:Port\Instance.Database
dbms = DbmsType.MsSql;
String sqlDriver = OdbcUtil.GetOdbcSqlDriverName();
String sqlLocation = config.location.Substring(6);
String sqlServer = "."; /* Assume local host */
String sqlInstance = "";
String sqlPort = "";
String sqlDatabase = sqlLocation;
if (!String.IsNullOrEmpty(sqlLocation) && sqlLocation.IndexOf('\\') >= 0)
{
// Server=[protocol:]Server;
String[] locationSplit = sqlLocation.Split('\\');
sqlServer = locationSplit[0];
sqlDatabase = locationSplit[1];
}
if (!String.IsNullOrEmpty(sqlServer) && sqlServer.IndexOf(':') > 0)
{
// Server=[protocol:]Server[,port];
String[] serverSplit = sqlServer.Split(':');
sqlServer = serverSplit[0];
sqlPort = serverSplit[1];
}
if (!String.IsNullOrEmpty(sqlDatabase) && sqlDatabase.IndexOf('.') > 0)
{
// Server=[protocol:]Server[\instancename];
String[] databaseSplit = sqlDatabase.Split('.');
sqlInstance = databaseSplit[0];
sqlDatabase = databaseSplit[1];
}
if (!StringUtil.IsEmpty(sqlPort)) sqlServer += "," + sqlPort;
if (!StringUtil.IsEmpty(sqlInstance)) sqlServer += "\\" + sqlInstance;
databaseName = sqlDatabase;
//-----------------------------------------------------------
// SQL Server ODBC connection string:
// Ref. https://docs.microsoft.com/en-us/sql/relational-databases/native-client/applications/using-connection-string-keywords-with-sql-server-native-client
// Address Network address of the server running an instance of SQL Server.
// Driver=<OdbcDriver>;
// Description=<DSN Caption>;
// UID=<User>;
// APP=<ApplicationCaption>;
// WsId=<WorkstationId>;
// Server=[protocol:]Server[,port][\instancename];
// Database=<Default database>;
// Trusted_Connection=<Yes|No>;
// UseProcForPrepare=2
connectionString = "Driver={" + sqlDriver + "};";
connectionString += "Server=" + sqlServer + ";";
connectionString += "Database=" + sqlDatabase + ";";
if (!config.user.IsEmpty())
{
connectionString += "UID=" + config.user + ";";
connectionString += "PWD=" + config.pword + ";";
}
connectionString += (String)"Trusted_Connection=" + (config.user.IsEmpty() ? "Yes" : "No") + ";";
// Multiple Active Result Sets.
connectionString += "MARS_Connection=yes;";
//if (iQueryLogTime > 0)
// connectionString += "QueryLogTime="+String(iQueryLogTime)+";";
//if (iCommandTimeout > 0)
// connectionString += "CommandTimeout=" + String(iCommandTimeout) + ";";
//-----------------------------------------------------------
// SQL Connection string.
sqlConnectionString = "";
sqlConnectionString += "Server=" + sqlServer + ";";
sqlConnectionString += "Database=" + sqlDatabase + ";";
if (!config.user.IsEmpty())
{
sqlConnectionString += "User Id=" + config.user + ";";
sqlConnectionString += "Password=" + config.pword + ";";
}
sqlConnectionString += (String)"Trusted_Connection=" + (config.user.IsEmpty() ? "Yes" : "No") + ";";
//-----------------------------------------------------------
SaLogger.Info("DatabaseConsole.OpenOdbcDatabase Driver: " + sqlDriver + ". Server: " + sqlServer + ". Database: " + sqlDatabase + ". Connection: " + connectionString + (!StringUtil.IsEmpty(sqlConnectionString) ? " [SQL: " + sqlConnectionString + "]" : ""));
}
// Open database.
DbGlobalDbms.Type = dbms;
SacsDatabaseOdbc database = new SacsDatabaseOdbc(dbms,databaseName,connectionString);
database.SelectLockMode = SelectLockMode.ReadUncommitted;
database.SqlConnectionString = sqlConnectionString;
return database;
}
//-------------------------------------------------------------------
// D a t a b a s e I n d i c e s
//-------------------------------------------------------------------
// Database Index stats.
public class IndexStats
{
public int PrimaryIndicesCreated { get; set; } = 0;
public int IndicesCreated { get; set; } = 0;
public int IndicesDropped { get; set; } = 0;
public List<String> Stats
{
get
{
List<String> stats = new List<string>();
if (PrimaryIndicesCreated > 0)
stats.Add("Primary indices created: " + PrimaryIndicesCreated.ToString());
if (IndicesCreated > 0)
stats.Add("Indices created: " + IndicesCreated.ToString());
if (IndicesDropped > 0)
stats.Add("Indices dropped: " + IndicesDropped.ToString());
return stats;
}
}
}
//-------------------------------------------------------------------
// Drop index.
protected bool DropDbIndex (ISacsDatabase database, IndexStats indexStats, String tableName, String indexName)
{
if (database == null || HasErrorState()) return false;
if (!database.TableExists(tableName)) return true;
DbDfnTable dfnTbl = database.GetTableDfn(tableName,true);
if (!dfnTbl.HasIndexByName(indexName)) // Should also check the columns and their sequence in the index.
{
// Drop index:
// MS Access: DROP INDEX index_name ON table_name
// MS SQL Server: DROP INDEX table_name.index_name
// DB2/Oracle: DROP INDEX index_name
// MySQL: ALTER TABLE table_name DROP INDEX index_name
String query = "DROP INDEX ["+indexName+"] ON ["+tableName+"]";
LogSql(query);
if (database.DbmsType == DbmsType.MsSql)
query = "DROP INDEX [" + tableName + "].[" + indexName + "]";
if (!StringUtil.IsEmpty(query))
{
database.ExecuteNonQuery(query);
if (!database.HasErrorState())
indexStats.IndicesDropped++;
else
{
#if DEBUG
SaLogger.Debug("DropDbIndex Table: " + tableName + "; Index: " + indexName + "; Exception: " + database.ErrorStateMessage);
#endif
SetErrorState("Failed to drop index " + indexName + " on " + tableName + " - " + database.ErrorStateMessage);
}
}
}
else
{
// Assume this is the Primary Key:
String query = "ALTER TABLE ["+tableName+"] DROP CONSTRAINT ["+indexName+"]";
LogSql(query);
//if (database.DbmsType() == eSaDbmsMsSql)
// sQry = "DROP INDEX ["+tableName+"].["+indexName+"]";
if (!StringUtil.IsEmpty(query))
{
database.ExecuteNonQuery(query);
if (!database.HasErrorState())
indexStats.IndicesDropped++;
else
{
#if DEBUG
SaLogger.Debug("DropDbIndex Table: " + tableName + "; Index: " + indexName + "; Exception: " + database.ErrorStateMessage);
#endif
SetErrorState("Failed to drop primary key " + indexName + " on " + tableName + " - " + database.ErrorStateMessage);
}
}
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Create primary index.
protected bool CreatePrimaryDbIndex (ISacsDatabase database, IndexStats indexStats, String tableName, String columnsCsv, bool dropIndicesIfNotExist = true)
{
if (database == null || HasErrorState()) return false;
if (!database.TableExists(tableName)) return true;
List<String> lColumn = StringListUtil.Split(columnsCsv,",");
DbDfnTable dfnTbl = database.GetTableDfn(tableName,true);
String indexName = "PK_"+tableName;
if (!dfnTbl.HasIndexByName(indexName))
{
if (dropIndicesIfNotExist)
{
foreach (DbDfnIndex indexDfn in dfnTbl.Indices)
{
DropDbIndex(database, indexStats, tableName, indexDfn.Name);
}
}
if (!HasErrorState())
{
// Examples:
// MS Access: ALTER TABLE <table> ADD PRIMARY KEY (<ColumnList>)
// 1. ALTER TABLE Customer ADD PRIMARY KEY (SID);
// 2. ALTER TABLE [Sales].[Individual]
// ADD CONSTRAINT [PK_Individual_CustomerID]
// PRIMARY KEY CLUSTERED
// ([CustomerID] ASC)
String query = "ALTER TABLE ["+tableName+"] ADD CONSTRAINT ["+indexName+"] PRIMARY KEY ("+lColumn.Concat(",","[","]")+")";
if (database.DbmsType == DbmsType.MsSql)
query = "ALTER TABLE [" + tableName + "] ADD CONSTRAINT [" + indexName + "] PRIMARY KEY CLUSTERED (" + lColumn.Concat(",", "[", "]") + ")";
LogSql(query);
if (!StringUtil.IsEmpty(query))
{
database.ExecuteNonQuery(query);
if (!database.HasErrorState())
indexStats.PrimaryIndicesCreated++;
else
{
#if DEBUG
SaLogger.Debug("CreatePrimaryDbIndex Table: %" + tableName + "; Index: " + indexName + "; Exception: " + database.ErrorStateMessage);
#endif
SetErrorState("Failed to create primary index " + indexName + " on " + tableName + " - " + database.ErrorStateMessage);
}
}
}
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Create database index.
protected bool CreateDbIndex (ISacsDatabase database, IndexStats indexStats, String tableName, String indexName, String columnsCsv, bool unique = false)
{
if (database == null || HasErrorState()) return false;
if (!database.TableExists(tableName)) return true;
List<String> columns = StringListUtil.Split(columnsCsv,",");
DbDfnTable dfnTbl = database.GetTableDfn(tableName,true);
// Construct the index name:
String indexNamePrefix = "IDX_" + tableName + "_";
if (!indexName.StartsWith(indexNamePrefix)) indexName = indexNamePrefix + indexName;
if (!dfnTbl.HasIndexByName(indexName)) // Should also check the columns and their sequence in the index.
{
String query = "CREATE "+(unique?"UNIQUE ":"")+"INDEX ";
query += "[" + indexName + "] ON [" + tableName + "] (" + columns.Concat(",", "[", "]") + ")";
LogSql(query);
if (!StringUtil.IsEmpty(query))
{
database.ExecuteNonQuery(query);
if (!database.HasErrorState())
indexStats.IndicesCreated++;
else
{
#if DEBUG
SaLogger.Debug("CreateDbIndex Table: " + tableName + "; Index: " + indexName + "; Exception: " + database.ErrorStateMessage);
#endif
SetErrorState("Failed to create index " + indexName + " on " + tableName + " - " + database.ErrorStateMessage);
}
}
}
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,683 @@
<?xml version="1.0"?>
<DbDfnDatabase xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Tables>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>SaCode</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>1</Pos>
<Name>Id</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>2</Pos>
<Name>CodeTypeId</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>3</Pos>
<Name>Code</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>32</Size>
<BufferLen>64</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>4</Pos>
<Name>Description</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>128</Size>
<BufferLen>256</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>5</Pos>
<Name>Seq</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>6</Pos>
<Name>Data</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>7</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>8</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>9</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>6</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>10</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>11</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>12</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>13</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>14</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Pos>15</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Name>PK_SaCode</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>20</Pages>
<UniqueValues>990</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Id</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Name>IDX_SaCode_TypeCode</Name>
<IndexType>3</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>CodeTypeId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>Code</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Name>IDX_SaCode_Status</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Status</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Name>IDX_SaCode_Type</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>CodeTypeId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaCode</Table>
<Name>IDX_SaCode_TypeSeq</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>CodeTypeId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>Seq</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>SaCodeType</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>1</Pos>
<Name>Id</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>2</Pos>
<Name>Code</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>32</Size>
<BufferLen>64</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>3</Pos>
<Name>Name</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>128</Size>
<BufferLen>256</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>4</Pos>
<Name>MaxCodeLen</Name>
<DataType>TinyInt</DataType>
<DataTypeName />
<DataTypeNative>-6</DataTypeNative>
<DataTypeNameNative>tinyint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>1</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>5</Pos>
<Name>CodeFormat</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>32</Size>
<BufferLen>64</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>6</Pos>
<Name>NextCode</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>32</Size>
<BufferLen>64</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>7</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>8</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>9</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>6</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>10</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>11</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>12</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>13</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>14</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Pos>15</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Name>PK_SaCodeType</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>12</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Id</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaCodeType</Table>
<Name>IDX_SaCodeType_Code</Name>
<IndexType>3</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Code</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
</Tables>
</DbDfnDatabase>
@@ -0,0 +1,226 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:33
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.CodeTypes.Internal
{
internal class SaCodeType_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataString _Name { get; } = new ColumnDataString("Name");
public ColumnDataByte _MaxCodeLen { get; } = new ColumnDataByte("MaxCodeLen");
public ColumnDataString _CodeFormat { get; } = new ColumnDataString("CodeFormat");
public ColumnDataString _NextCode { get; } = new ColumnDataString("NextCode");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Code",
"Name",
"MaxCodeLen",
"CodeFormat",
"NextCode",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Code",
"CodeTypeId",
"Code",
};
//-------------------------------------------------------------------
// Construction.
internal SaCodeType_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "SaCodeType";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public String _Name { get { return Cols._Name.Value; } set { Cols._Name.Value = value; } }
public Byte _MaxCodeLen { get { return Cols._MaxCodeLen.Value; } set { Cols._MaxCodeLen.Value = value; } }
public String _CodeFormat { get { return Cols._CodeFormat.Value; } set { Cols._CodeFormat.Value = value; } }
public String _NextCode { get { return Cols._NextCode.Value; } set { Cols._NextCode.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_Name = GetFieldString(dbDataReader, "Name", _Name);
_MaxCodeLen = GetFieldByte(dbDataReader, "MaxCodeLen", _MaxCodeLen);
_CodeFormat = GetFieldString(dbDataReader, "CodeFormat", _CodeFormat);
_NextCode = GetFieldString(dbDataReader, "NextCode", _NextCode);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("MaxCodeLen")) AddCommandParameter(dbCommand, "@MaxCodeLen", _MaxCodeLen);
if (columnNames.ContainsCI("CodeFormat")) AddCommandParameter(dbCommand, "@CodeFormat", _CodeFormat);
if (columnNames.ContainsCI("NextCode")) AddCommandParameter(dbCommand, "@NextCode", _NextCode);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("MaxCodeLen")) AddCommandParameter(dbCommand, "@MaxCodeLen", _MaxCodeLen);
if (columnNames.ContainsCI("CodeFormat")) AddCommandParameter(dbCommand, "@CodeFormat", _CodeFormat);
if (columnNames.ContainsCI("NextCode")) AddCommandParameter(dbCommand, "@NextCode", _NextCode);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,224 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:33
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.CodeTypes.Internal
{
internal class SaCode_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataInt32 _CodeTypeId { get; } = new ColumnDataInt32("CodeTypeId");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataString _Description { get; } = new ColumnDataString("Description");
public ColumnDataInt16 _Seq { get; } = new ColumnDataInt16("Seq");
public ColumnDataString _Data { get; } = new ColumnDataString("Data");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"CodeTypeId",
"Code",
"Description",
"Seq",
"Data",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"CodeTypeId",
"Code",
};
//-------------------------------------------------------------------
// Construction.
internal SaCode_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "SaCode";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int32 _CodeTypeId { get { return Cols._CodeTypeId.Value; } set { Cols._CodeTypeId.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public String _Description { get { return Cols._Description.Value; } set { Cols._Description.Value = value; } }
public Int16 _Seq { get { return Cols._Seq.Value; } set { Cols._Seq.Value = value; } }
public String _Data { get { return Cols._Data.Value; } set { Cols._Data.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_CodeTypeId = GetFieldInt32(dbDataReader, "CodeTypeId", _CodeTypeId);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_Description = GetFieldString(dbDataReader, "Description", _Description);
_Seq = GetFieldInt16(dbDataReader, "Seq", _Seq);
_Data = GetFieldString(dbDataReader, "Data", _Data);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("CodeTypeId")) AddCommandParameter(dbCommand, "@CodeTypeId", _CodeTypeId);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Description")) AddCommandParameter(dbCommand, "@Description", _Description);
if (columnNames.ContainsCI("Seq")) AddCommandParameter(dbCommand, "@Seq", _Seq);
if (columnNames.ContainsCI("Data")) AddCommandParameter(dbCommand, "@Data", _Data);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Description")) AddCommandParameter(dbCommand, "@Description", _Description);
if (columnNames.ContainsCI("Seq")) AddCommandParameter(dbCommand, "@Seq", _Seq);
if (columnNames.ContainsCI("Data")) AddCommandParameter(dbCommand, "@Data", _Data);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,494 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.CodeTypes;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.CodeTypes
{
//=======================================================================
public abstract class SaCodeTypeConsole_Dbas : SaCodeTypeConsole
{
//-------------------------------------------------------------------
// Data members.
private SaCodeTypeMgr_Dbas codeTypeMgr = null;
//-------------------------------------------------------------------
// Static initialisation.
static SaCodeTypeConsole_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaCodeTypeConsole_Dbas (SacsDatabase database)
{
Database = database;
codeTypeMgr = new SaCodeTypeMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return codeTypeMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return codeTypeMgr.CanUpdateDatabase; } }
//*******************************************************************
// C o d e T y p e D e f i n i t i o n s
//*******************************************************************
public override SaCodeTypeDfn GetCodeTypeDefinition (SysId codeTypeId)
{
ClearErrorState();
SaCodeType codeType = codeTypeMgr.GetCodeTypeById(codeTypeId);
if (codeType == null) return null;
foreach (SaCodeTypeDfn codeTypeDfn in codeTypeDfns)
if (codeTypeDfn.Code.EqualsCI(codeType.Code))
return codeTypeDfn;
return null;
}
//*******************************************************************
// C o d e T y p e s
//*******************************************************************
public override bool CodeTypeExists (String codeTypeCode)
{
ClearErrorState();
SaCodeType.Params prmCodeType = new SaCodeType.Params();
prmCodeType.Code = codeTypeCode;
prmCodeType.StatusCat = SaCodeType.StatusCat.Any;
return (codeTypeMgr.GetCodeTypeCount(prmCodeType) > 0);
}
public override String GetDescForCodeType (String codeTypeCode)
{
ClearErrorState();
SaCodeType codeTypeData = codeTypeMgr.GetCodeTypeByCode(codeTypeCode);
if (codeTypeData != null)
return codeTypeData.Description;
return base.GetDescForCodeType(codeTypeCode);
}
public override int GetCodeTypeCount (SaCodeType.Params prmCodeType)
{
ClearErrorState();
return (int)codeTypeMgr.GetCodeTypeCount(prmCodeType);
}
public override SaCodeType GetCodeType (SaCodeType.Params prmCodeType)
{
ClearErrorState();
return codeTypeMgr.GetCodeType(prmCodeType);
}
public override List<SaCodeType> GetCodeTypeList (SaCodeType.Params prmCodeType)
{
ClearErrorState();
return codeTypeMgr.GetCodeTypeList(prmCodeType);
}
public override ColumnDfn GetCodeTypeColumnDfn (SaCodeType.Column columnId, String caption = "", int width = 0)
{
ClearErrorState();
return codeTypeMgr.GetCodeTypeColumnDfn(columnId, caption, width);
}
public override DbResultSet ExecuteCodeTypeQuery (List<ColumnDfn> columns, SaCodeType.Params prm)
{
ClearErrorState();
return codeTypeMgr.ExecuteCodeTypeQuery(columns, prm);
}
public override DataValue GetCodeTypeDataValue (ColumnDfn column, NamedValue.Map values)
{
ClearErrorState();
return codeTypeMgr.GetCodeTypeDataValue(column, values);
}
//-------------------------------------------------------------------
// Maintain code types - returns true if changes made.
public override bool MaintainCodeTypes (bool userCanManageCodeTypes, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
MaintainCodeTypesFn?.Invoke(this, userCanManageCodeTypes, dbUpdateInfo);
return false;
}
// Method to display Code Type management dialog.
protected delegate bool MaintainCodeTypesFunction (SaCodeTypeConsole codeTypeConsole, bool userCanManageCodeTypes, DbUpdateInfo dbUpdateInfo);
protected abstract MaintainCodeTypesFunction MaintainCodeTypesFn { get; }
//-------------------------------------------------------------------
// Maintain code type - returns true if changes made.
public override bool MaintainCodeType (String codeTypeCode, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
return false;
}
//*******************************************************************
// C o d e s
//*******************************************************************
// Check whether code exists.
public override bool CodeExistsForCodeType (String codeTypeCode, String code, bool activeOnly)
{
ClearErrorState();
if (StringUtil.IsEmpty(codeTypeCode) || StringUtil.IsEmpty(code)) return false;
// Query filter.
SaCode.Params prmCode = new SaCode.Params();
prmCode.CodeTypeCodes.Add(codeTypeCode);
prmCode.Code = code;
prmCode.StatusCat = (activeOnly ? SaCode.StatusCat.ActiveOnly : SaCode.StatusCat.Any);
return (codeTypeMgr.GetCodeCount(prmCode) == 1);
}
//-------------------------------------------------------------------
// Codes exist for code type.
public override bool CodeTypeHasCodes (String codeTypeCode, bool activeOnly = true)
{
return GetCodeCountForCodeType(codeTypeCode, activeOnly) > 0;
}
public override int GetCodeCountForCodeType (String codeTypeCode, bool activeOnly = true)
{
ClearErrorState();
if (StringUtil.IsEmpty(codeTypeCode)) return 0;
SaCode.Params prmCode = new SaCode.Params();
prmCode.CodeTypeCodes.Add(codeTypeCode);
prmCode.StatusCat = (activeOnly ? SaCode.StatusCat.ActiveOnly : SaCode.StatusCat.Any);
return (int)codeTypeMgr.GetCodeCount(prmCode);
}
//-------------------------------------------------------------------
// Get code for code type.
public override SaCode GetCodeForCodeType (String codeTypeCode, String code, bool activeOnly = true)
{
ClearErrorState();
if (StringUtil.IsEmpty(codeTypeCode) || StringUtil.IsEmpty(code)) return null;
SaCode.Params prmCode = new SaCode.Params();
prmCode.CodeTypeCodes.Add(codeTypeCode);
prmCode.Code = code;
prmCode.StatusCat = (activeOnly ? SaCode.StatusCat.ActiveOnly : SaCode.StatusCat.Any);
List<SaCode> codes = codeTypeMgr.GetCodeList(prmCode);
if (codes.Count > 0)
return codes[0];
return null;
}
//-------------------------------------------------------------------
// Get codes for code type.
public override List<CodeDesc> GetCodeDescsForCodeType (String codeTypeCode, bool activeOnly = true)
{
ClearErrorState();
List<CodeDesc> codes = new List<CodeDesc>();
if (StringUtil.IsEmpty(codeTypeCode)) return codes;
SaCodeTypeDfn codeTypeDfn = GetCodeTypeDefinition(codeTypeCode);
// Query columns.
ColumnDfn colCode = codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Code);
ColumnDfn colDesc = codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Description);
List<ColumnDfn> columns = new List<ColumnDfn>() { colCode, colDesc };
// Query filter.
SaCode.Params prmCode = new SaCode.Params();
prmCode.CodeTypeCodes.Add(codeTypeCode);
prmCode.StatusCat = (activeOnly ? SaCode.StatusCat.ActiveOnly : SaCode.StatusCat.Any);
// Sort columns.
if (codeTypeDfn != null && codeTypeDfn.AllowSequence)
prmCode.SortColumns.Add(codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Sequence));
prmCode.SortColumns.Add(codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Code));
// Query codes.
using (DbResultSet dbResultSet = codeTypeMgr.ExecuteCodeQuery(columns, prmCode))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
codes.Add(values.GetValue(colCode.DataName).ToString(), values.GetValue(colDesc.DataName).ToString());
}
if (dbResultSet != null) dbResultSet.Close();
}
return codes;
}
public override List<SaCode> GetCodeListForCodeType (String codeTypeCode, bool activeOnly = true)
{
ClearErrorState();
if (StringUtil.IsEmpty(codeTypeCode)) return new List<SaCode>();
SaCodeTypeDfn codeTypeDfn = GetCodeTypeDefinition(codeTypeCode);
// Query filter.
SaCode.Params prmCode = new SaCode.Params();
prmCode.CodeTypeCodes.Add(codeTypeCode);
prmCode.StatusCat = (activeOnly ? SaCode.StatusCat.ActiveOnly : SaCode.StatusCat.Any);
// Sort columns.
if (codeTypeDfn != null && codeTypeDfn.AllowSequence)
prmCode.SortColumns.Add(codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Sequence));
prmCode.SortColumns.Add(codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Code));
// Query codes.
return codeTypeMgr.GetCodeList(prmCode);
}
//-------------------------------------------------------------------
// Codes by filter.
public override int GetCodeCount (SaCode.Params prmCode)
{
ClearErrorState();
return (int)codeTypeMgr.GetCodeCount(prmCode);
}
public override SaCode GetCode (SaCode.Params prmCode)
{
ClearErrorState();
return codeTypeMgr.GetCode(prmCode);
}
public override List<SaCode> GetCodeList (SaCode.Params prmCode)
{
ClearErrorState();
return codeTypeMgr.GetCodeList(prmCode);
}
public override ColumnDfn GetCodeColumnDfn (SaCode.Column columnId, String caption = "", int width = 0)
{
ClearErrorState();
return codeTypeMgr.GetCodeColumnDfn(columnId, caption, width);
}
public override DbResultSet ExecuteCodeQuery (List<ColumnDfn> columns, SaCode.Params prm)
{
ClearErrorState();
return codeTypeMgr.ExecuteCodeQuery(columns, prm);
}
//-------------------------------------------------------------------
public override DataValue GetCodeDataValue (ColumnDfn column, NamedValue.Map values)
{
ClearErrorState();
return codeTypeMgr.GetCodeDataValue(column, values);
}
//-------------------------------------------------------------------
// Get filtered codes, indexed by Code Type code.
public override Dictionary<String, List<SaCode>> GetCodesByCodeType (SaCode.Params prmCode)
{
ClearErrorState();
// Retrieve codes and index by Code Type Id.
Dictionary<SysId, List<SaCode>> codesByCodeTypeId = GetCodesByCodeTypeId(codeTypeMgr.GetCodeList(prmCode));
// Retrieve code type codes.
SaCodeType.Params prmCodeType = new SaCodeType.Params();
prmCodeType.IncludedIds.AddRange(codesByCodeTypeId.Keys);
prmCodeType.StatusCat = SaCodeType.StatusCat.Any;
List<SaCodeType> codeTypes = codeTypeMgr.GetCodeTypeList(prmCodeType);
// Convert Code Type identity from Id to code and sort each list of codes appropriately.
return ConvertCodeTypeIdentityAndSortCodes(codesByCodeTypeId, codeTypes);
}
public override async Task<Dictionary<String, List<SaCode>>> GetCodesByCodeTypeAsync (SaCode.Params prmCode)
{
ClearErrorState();
// Retrieve codes and index by Code Type Id.
Dictionary<SysId, List<SaCode>> codesByCodeTypeId = GetCodesByCodeTypeId(await codeTypeMgr.GetCodeListAsync(prmCode));
// Retrieve code type codes.
SaCodeType.Params prmCodeType = new SaCodeType.Params();
prmCodeType.IncludedIds.AddRange(codesByCodeTypeId.Keys);
prmCodeType.StatusCat = SaCodeType.StatusCat.Any;
List<SaCodeType> codeTypes = await codeTypeMgr.GetCodeTypeListAsync(prmCodeType);
// Convert Code Type identity from Id to code and sort each list of codes appropriately.
return ConvertCodeTypeIdentityAndSortCodes(codesByCodeTypeId, codeTypes);
}
private Dictionary<SysId, List<SaCode>> GetCodesByCodeTypeId (List<SaCode> codes)
{
// Retrieve codes and index by Code Type Id.
Dictionary<SysId, List<SaCode>> codesByCodeTypeId = new Dictionary<SysId, List<SaCode>>();
foreach (SaCode saCode in codes)
{
if (!codesByCodeTypeId.ContainsKey(saCode.CodeTypeId))
codesByCodeTypeId[saCode.CodeTypeId] = new List<SaCode>();
codesByCodeTypeId[saCode.CodeTypeId].Add(saCode);
}
return codesByCodeTypeId;
}
private Dictionary<String, List<SaCode>> ConvertCodeTypeIdentityAndSortCodes (Dictionary<SysId, List<SaCode>> codesByCodeTypeId, List<SaCodeType> codeTypes)
{
// Convert identity from Code Type Id to Code and sort list foc deos associated with each code type.
Dictionary<String, List<SaCode>> codesByCodeType = new Dictionary<string, List<SaCode>>();
foreach (KeyValuePair<SysId, List<SaCode>> codeTypeData in codesByCodeTypeId)
{
SaCodeType codeType = codeTypes.Find(item => item.Id.Equals(codeTypeData.Key));
if (codeType == null) continue;
SaCodeTypeDfn codeTypeDfn = GetCodeTypeDefinition(codeType.Code);
// Sort codes for this code type.
List<SaCode> codes = null;
if (codeTypeDfn != null && codeTypeDfn.AllowSequence)
codes = codeTypeData.Value.OrderBy(code => code.Sequence).ThenBy(code => code.Code).ToList();
else
codes = codeTypeData.Value.OrderBy(code => code.Code).ToList();
// Populate to result set.
codesByCodeType[codeType.Code] = new List<SaCode>(codes);
}
return codesByCodeType;
}
//-------------------------------------------------------------------
// Get all codes and their descriptions that match the parameters.
// Results are indexed by code type code.
private class CodeData
{
public String Code { get; set; } = "";
public String Desc { get; set; } = "";
public int Sequence { get; set; } = 0;
public static explicit operator CodeDesc (CodeData codeData)
{
return new CodeDesc(codeData.Code, codeData.Desc);
}
}
public override Dictionary<String, List<CodeDesc>> GetCodeDescsByCodeType (SaCode.Params prmCode)
{
ClearErrorState();
// Query columns.
ColumnDfn colCodeTypeCode = codeTypeMgr.GetCodeColumnDfn(SaCode.Column.CodeType_Code);
ColumnDfn colCode = codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Code);
ColumnDfn colDesc = codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Description);
ColumnDfn colSeq = codeTypeMgr.GetCodeColumnDfn(SaCode.Column.Sequence);
List<ColumnDfn> columns = new List<ColumnDfn>() { colCodeTypeCode, colCode, colDesc, colSeq };
// Query codes.
Dictionary<String, List<CodeData>> codeTypesData = new Dictionary<String, List<CodeData>>();
using (DbResultSet dbResultSet = codeTypeMgr.ExecuteCodeQuery(columns, prmCode))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
// Store code in work list to be sorted later.
NamedValue.Map values = dbResultSet.GetRecordValues();
String codeTypeCode = values.GetValue(colCodeTypeCode.DataName).ToString();
CodeData codeData = new CodeData
{
Code = values.GetValue(colCode.DataName).ToString(),
Desc = values.GetValue(colDesc.DataName).ToString(),
Sequence = (int)values.GetValue(colSeq.DataName).AsLong()
};
if (!codeTypesData.ContainsKey(codeTypeCode)) codeTypesData[codeTypeCode] = new List<CodeData>();
codeTypesData[codeTypeCode].Add(codeData);
}
if (dbResultSet != null) dbResultSet.Close();
}
// Compile list of codes for each code type, sorting as required.
Dictionary<String, List<CodeDesc>> codes = new Dictionary<String, List<CodeDesc>>();
foreach (KeyValuePair<String, List<CodeData>> codeTypeData in codeTypesData)
{
SaCodeTypeDfn codeTypeDfn = GetCodeTypeDefinition(codeTypeData.Key);
// Sort codes for this code type.
List<CodeData> codesData = null;
if (codeTypeDfn != null && codeTypeDfn.AllowSequence)
codesData = codeTypeData.Value.OrderBy(code => code.Sequence).ThenBy(code => code.Code).ToList();
else
codesData = codeTypeData.Value.OrderBy(code => code.Code).ToList();
// Populate to result set.
codes[codeTypeData.Key] = new List<CodeDesc>(codesData.Select(code => (CodeDesc)code));
}
return codes;
}
//-------------------------------------------------------------------
// Create codes.
public override bool CreateCodeOfType (SysId codeTypeId, String code, String desc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!SysId.IsValid(codeTypeId)) return SetErrorState("Code type must be identified");
SaCode codeData = codeTypeMgr.CreateCode(codeTypeId, code);
codeData.Description = desc;
if (!codeTypeMgr.InsertCode(codeData, dbUpdateInfo))
return SetErrorState("Failed to insert code - " + codeTypeMgr.ErrorStateMessage);
return true;
}
public override bool CreateCodeOfType (String codeTypeCode, String code, String desc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaCodeType codeTypeData = codeTypeMgr.GetCodeTypeByCode(codeTypeCode);
if (codeTypeData == null)
return SetErrorState("Code type not found");
return CreateCodeOfType(codeTypeData.Id, code, desc, dbUpdateInfo);
}
//-------------------------------------------------------------------
// Populate code types - application specific.
public override bool PopulateCodeType (String codeTypeCode, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (StringUtil.IsEmpty(codeTypeCode)) return SetErrorState("Code type code must be supplied");
// Retrieve code type definition.
SaCodeTypeDfn codeTypeDfn = GetCodeTypeDefinition(codeTypeCode);
if (codeTypeDfn == null) return SetErrorState("Code type not defined: " + codeTypeCode);
// Retrieve code type.
SaCodeType codeType = codeTypeMgr.GetCodeTypeByCode(codeTypeCode);
if (codeType == null)
{
// Create code type.
codeType = codeTypeMgr.CreateCodeType(codeTypeCode);
codeType.Description = codeTypeDfn.Description;
codeType.Notes = codeTypeDfn.Notes;
codeType.Status = SaCodeType.DefaultStatus;
if (!codeTypeMgr.InsertCodeType(codeType, dbUpdateInfo))
return SetErrorState("Failed to create code type - " + codeTypeMgr.ErrorStateMessage);
}
else
{
// Code type exists - refresh properties.
codeType.Description = codeTypeDfn.Description;
if (StringUtil.IsEmpty(codeType.Notes))
codeType.Notes = codeTypeDfn.Notes;
codeType.Status = SaCodeType.DefaultStatus;
if (!codeTypeMgr.UpdateCodeType(codeType, dbUpdateInfo))
return SetErrorState("Failed to update code type - " + codeTypeMgr.ErrorStateMessage);
}
// Populate default codes.
List<CodeDesc> codes = GetCodeDescsForCodeType(codeType.Code);
foreach (SaCodeDfn codeDfn in codeTypeDfn.DefaultCodeDefinitions)
{
// Check whether code exists.
if (codes.FindCode(codeDfn.Code)) continue;
// Create code.
SaCode code = codeTypeMgr.CreateCode(codeType.Id, codeDfn.Code);
code.Description = codeDfn.Description;
code.DataValue = codeDfn.Data;
code.Notes = codeDfn.Notes;
code.Status = SaCode.DefaultStatus;
if (!codeTypeMgr.InsertCode(code, dbUpdateInfo))
return SetErrorState("Failed to create code - " + codeTypeMgr.ErrorStateMessage);
}
return true;
}
public override bool PopulateCode (String codeTypeCode, String code, String desc, bool active, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (StringUtil.IsEmpty(codeTypeCode)) return SetErrorState("Code type code must be supplied");
if (StringUtil.IsEmpty(code)) return SetErrorState("Code must be supplied");
// Retrieve code type.
SaCodeType codeType = codeTypeMgr.GetCodeTypeByCode(codeTypeCode);
if (codeType == null)
return SetErrorState("Code type not available");
SaCode saCode = codeTypeMgr.GetCodeByCodeTypeCode(codeTypeCode, code);
if (saCode == null)
{
// Create code.
SaCode codeData = codeTypeMgr.CreateCode(codeType.Id, code);
codeData.Description = desc;
codeData.Status = (active ? SaCode.ActiveStatus : SaCode.InactiveStatus);
if (!codeTypeMgr.InsertCode(codeData, dbUpdateInfo))
return SetErrorState("Failed to create code - " + codeTypeMgr.ErrorStateMessage);
}
return true;
}
//-------------------------------------------------------------------
// Select codes.
public override List<String> SelectCodes (String codeTypeCode, List<String> codesSelected)
{
ClearErrorState();
List<String> codes = new List<String>();
return codes;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,113 @@
using System;
using System.IO;
using System.Reflection;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.CodeType
{
//=======================================================================
public static class SaCodeTypeDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand Code Type Module database definition generator";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate(String connectionString)
{
String fn = nameof(SaCodeTypeDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition(SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory,
};
// Schema - Tables.
config.Schema.Tables_Included.AddRange(new String[] { "SaCodeType", "SaCode" });
config.Schema.Tables_Excluded.AddRange(new String[] { });
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("SaCodeType", "Code");
config.Schema.InsertOnlyColumns.Add("SaCode", "CodeTypeId,Code");
// Database Definition class.
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.CodeTypes";
config.DefinitionClass.Classname = "SaCodeTypeDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.CodeTypes.Internal";
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder()
{
String fn = nameof(SaCodeTypeDbDfnGenerator) + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug(fn + " Assembly folder: " + directory);
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\CodeTypes\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "CodeTypes";
SaLogger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,13 @@
using Sarand.Net.Standard.Base.CodeTypes;
namespace Sarand.Net.Standard.Dbas.CodeTypes
{
internal static class SaCodeTypeInternal
{
internal static SaCodeTypeMgr CreateCodeTypeMgr (this SaCodeTypeConsole codeTypeConsole)
{
if (!(codeTypeConsole is SaCodeTypeConsole_Dbas)) return null;
return new SaCodeTypeMgr_Dbas((SaCodeTypeConsole_Dbas)codeTypeConsole);
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,21 @@
using System;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.CodeTypes;
namespace Sarand.Net.Standard.Dbas.CodeTypes
{
//=======================================================================
class SaCodeType_Dbas : SaCodeType
{
//-------------------------------------------------------------------
// Construction.
public SaCodeType_Dbas (SysId id, String code, ushort flags) :
base(id,code)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,21 @@
using System;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.CodeTypes;
namespace Sarand.Net.Standard.Dbas.CodeTypes
{
//=======================================================================
class SaCode_Dbas : SaCode
{
//-------------------------------------------------------------------
// Construction.
public SaCode_Dbas (SysId id, SysId codeTypeId, String code, ushort flags) :
base(id,codeTypeId,code)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
+539
View File
@@ -0,0 +1,539 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Dbas.Base;
using Microsoft.Data.SqlClient;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Base.App;
namespace Sarand.Net.Standard.Dbas.Data
{
//=======================================================================
public abstract class DbDataItem : IDbDataItem
{
//-------------------------------------------------------------------
// D a t a b a s e I n f o
//-------------------------------------------------------------------
// Definitions.
/// <summary>
/// Database information - object supplied by main application.
/// <para>NB Application may have multiple databases with schema differences.</para>
/// <para>Each instance of a DbDataItem must be database specific.</para>
/// </summary>
public class DatabaseInfo : IDatabaseInfo
{
// Data members.
private readonly List<DbDfnTable> tables;
private static readonly String defaultSchemaName = "dbo";
// Construction.
public DatabaseInfo (ISacsDatabase db)
{
this.DatabaseName = db.DatabaseName;
this.tables = db.GetTableDfns();
}
// Properties.
public String DatabaseName { get; }
public String Context { get { return StringUtil.OnEmpty(DatabaseName, "UnknownDb"); } }
// Database schema.
public DbDfnTable GetTableDefinition (String schemaName, String tableName)
{
foreach (DbDfnTable table in tables.FindAll(item => item.Name.EqualsCI(tableName)))
{
if (StringUtil.OnEmpty(table.Schema, defaultSchemaName).EqualsCI(StringUtil.OnEmpty(schemaName, defaultSchemaName)))
return table;
}
return null;
}
public bool TableExists (String schemaName, String tableName)
{
return GetTableDefinition(schemaName, tableName) != null;
}
public bool ColumnExists (String schemaName, String tableName, String columnName)
{
DbDfnTable table = GetTableDefinition(schemaName, tableName);
if (table == null) return false;
return table.HasColumnByName(columnName);
}
public List<DbDfnColumn> GetColumnsForTable (String schemaName, String tableName)
{
DbDfnTable table = GetTableDefinition(schemaName, tableName);
if (table != null) return table.Columns;
return new List<DbDfnColumn>();
}
}
//-------------------------------------------------------------------
// C o l u m n D a t a
//-------------------------------------------------------------------
/// <summary>Column data - column definition for DbDataItem.</summary>
public class ColumnData
{
protected ColumnData (String name, bool identity = false)
{
Name = name;
Identity = identity;
}
public String Name { get; }
public bool Identity { get; }
}
public class ColumnDataString : ColumnData
{
public ColumnDataString (String name, bool identity = false) : base(name, identity) { }
public String Value { get; set; } = String.Empty;
}
public class ColumnDataBoolean : ColumnData
{
public ColumnDataBoolean (String name, bool identity = false) : base(name, identity) { }
public Boolean Value { get; set; } = false;
}
public class ColumnDataByte : ColumnData
{
public ColumnDataByte (String name, bool identity = false) : base(name, identity) { }
public Byte Value { get; set; } = 0;
}
public class ColumnDataInt16 : ColumnData
{
public ColumnDataInt16 (String name, bool identity = false) : base(name, identity) { }
public Int16 Value { get; set; } = 0;
}
public class ColumnDataInt32 : ColumnData
{
public ColumnDataInt32 (String name, bool identity = false) : base(name, identity) { }
public Int32 Value { get; set; } = 0;
}
public class ColumnDataInt64 : ColumnData
{
public ColumnDataInt64 (String name, bool identity = false) : base(name, identity) { }
public Int64 Value { get; set; } = 0;
}
public class ColumnDataSingle : ColumnData
{
public ColumnDataSingle (String name, bool identity = false) : base(name, identity) { }
public Single Value { get; set; } = 0;
}
public class ColumnDataDouble : ColumnData
{
public ColumnDataDouble (String name, bool identity = false) : base(name, identity) { }
public Double Value { get; set; } = 0;
}
public class ColumnDataDecimal : ColumnData
{
public ColumnDataDecimal (String name, bool identity = false) : base(name, identity) { }
public Decimal Value { get; set; } = 0;
}
public class ColumnDataDateTime : ColumnData
{
public ColumnDataDateTime (String name, bool identity = false) : base(name, identity) { }
public DateTime Value { get; set; } = DateTime.MinValue;
}
public class ColumnDataByteArray : ColumnData
{
public ColumnDataByteArray (String name, bool identity = false) : base(name, identity) { }
public Byte[] Value { get; set; } = null;
}
//-------------------------------------------------------------------
// D b D a t a I t e m
//-------------------------------------------------------------------
// Data members.
private List<String> existingColumnNamesFull = null;
//-------------------------------------------------------------------
// Construction.
protected DbDataItem (IDatabaseInfo dbInfo = null)
{
DbInfo = dbInfo;
}
//-------------------------------------------------------------------
// Properties.
protected IDatabaseInfo DbInfo { get; }
public abstract String SchemaName { get; }
public abstract String TableName { get; }
public virtual List<String> AlternativeTableNames { get; } = new List<string>();
public static List<String> MissingColumns { get { columnsMissing.Sort(); return new List<string>(columnsMissing); } }
//-------------------------------------------------------------------
/// <summary>Determine the table name used on the database which can differ if alternative names are available.</summary>
protected String GetActualTableName (String tableName)
{
if (DbInfo != null)
{
if (DbInfo.TableExists(SchemaName, tableName)) return tableName;
foreach (String tableNameAlternate in AlternativeTableNames)
if (DbInfo.TableExists(SchemaName, tableNameAlternate)) return tableNameAlternate;
}
return tableName;
}
//-------------------------------------------------------------------
// Population.
public abstract void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter);
public abstract void PopulateFrom (DbDataReader dbdataReader);
//-------------------------------------------------------------------
// Database schema.
public bool ColumnExists (String columnName)
{
if (DbInfo != null)
return DbInfo.ColumnExists(SchemaName, TableName, columnName);
return true;
}
public List<String> GetExistingColumnNames (List<String> columnNames)
{
List<String> columnNamesExisting = new List<string>(columnNames);
if (existingColumnNamesFull == null)
{
// 'Existing column names (full)' contains the full list of columns confirmed to be on the database.
// NB The list will be empty if no DbInfo supplied or the table is not found on the database.
if (DbInfo != null)
{
List<DbDfnColumn> existingColumns = DbInfo.GetColumnsForTable(SchemaName,TableName);
existingColumnNamesFull = existingColumns.GetNames();
}
else existingColumnNamesFull = new List<string>();
}
if (existingColumnNamesFull.Count > 0)
{
// Remove columns that don't exist on the table.
columnNamesExisting.RemoveAll(item => !existingColumnNamesFull.ContainsCI(item));
}
return columnNamesExisting;
}
//-------------------------------------------------------------------
// Data Reader interface.
/// <summary>
/// Get column index by name.
/// <para>Returns -1 if not found and logs message.</para>
/// </summary>
protected int GetColumnOrdinal (DbDataReader dbDataReader, String columnName)
{
String fn = GetType().Name+".GetColumnOrdinal";
// Identify whether the specified column name is in the list of columns in the results set.
// NB Efficient as doesn't load the table schema and avoids logging of exception.
// Ref. https://stackoverflow.com/questions/373230/check-for-column-name-in-a-sqldatareader-object
bool columnExists = Enumerable.Range(0, dbDataReader.FieldCount).Any(i => string.Equals(dbDataReader.GetName(i), columnName, StringComparison.OrdinalIgnoreCase));
if (columnExists)
return dbDataReader.GetOrdinal(columnName);
// Invalid column name for result set.
if (DbInfo != null && !ColumnExists(columnName))
LogMissingColumn(columnName);
else SaLogger.Warn(fn + " Column not found in result set: '" + columnName + "'");
return -1;
/*
* Dec-2018 Previous logic trapping specific exception.
* Works well but automatically logs exception to debug console.
try
{
return dbDataReader.GetOrdinal(columnName);
}
catch (Exception exc)
{
if (exc.GetType().Name.EqualsCI("IndexOutOfRangeException"))
{
// Invalid column name for result set.
if (DbInfo != null && !ColumnExists(columnName))
{
String columnIdentifier = DbInfo.Context+"."+(!StringUtil.IsEmpty(SchemaName)?SchemaName+".":"")+TableName+"."+columnName;
if (!missingColumns.ContainsCI(columnIdentifier))
{
missingColumns.Add(columnIdentifier);
// Message is only logged on first occurence.
SaLogger.Debug(fn + " Column not found on database: " + columnIdentifier);
}
}
else SaLogger.Warn(fn + " Column not found in result set: '" + columnName + "'");
return -1;
}
}
return -1;
*/
}
//-------------------------------------------------------------------
// Retrieve field values.
public String GetFieldString (DbDataReader dbDataReader, String columnName, String defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(String))
return dbDataReader.GetString(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(String), dataType);
}
return defaultValue;
}
public Boolean GetFieldBoolean (DbDataReader dbDataReader, String columnName, Boolean defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Boolean))
return dbDataReader.GetBoolean(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Boolean), dataType);
}
return defaultValue;
}
public Byte GetFieldByte (DbDataReader dbDataReader, String columnName, Byte defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Byte))
return dbDataReader.GetByte(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Byte), dataType);
}
return defaultValue;
}
public Int16 GetFieldInt16 (DbDataReader dbDataReader, String columnName, Int16 defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Int16))
return dbDataReader.GetInt16(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Int16), dataType);
}
return defaultValue;
}
public Int32 GetFieldInt32 (DbDataReader dbDataReader, String columnName, Int32 defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Int32))
return dbDataReader.GetInt32(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Int32), dataType);
if (dataType == typeof(Int16))
return (Int32)dbDataReader.GetInt16(columnIdx);
}
return defaultValue;
}
public Int64 GetFieldInt64 (DbDataReader dbDataReader, String columnName, Int64 defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Int64))
return dbDataReader.GetInt64(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Int64), dataType);
if (dataType == typeof(Int32))
return (Int64)dbDataReader.GetInt32(columnIdx);
if (dataType == typeof(Int16))
return (Int64)dbDataReader.GetInt16(columnIdx);
}
return defaultValue;
}
public Single GetFieldSingle (DbDataReader dbDataReader, String columnName, Single defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Single))
return dbDataReader.GetFloat(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Single), dataType);
}
return defaultValue;
}
public Double GetFieldDouble (DbDataReader dbDataReader, String columnName, Double defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Double))
return dbDataReader.GetDouble(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Double), dataType);
if (dataType == typeof(decimal))
return (double)dbDataReader.GetDecimal(columnIdx);
if (dataType == typeof(float))
return (double)dbDataReader.GetFloat(columnIdx);
}
return defaultValue;
}
public Decimal GetFieldDecimal (DbDataReader dbDataReader, String columnName, Decimal defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
// Decimal data values may be alternative data types in result set.
// Avoid using try/catch as failures automatically log cast exceptions.
// Attempt to read value as decimal.
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(Decimal))
return dbDataReader.GetDecimal(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(Decimal), dataType);
// Allow 'double' value.
if (dataType == typeof(double))
return (decimal)dbDataReader.GetDouble(columnIdx);
// Allow 'float' value.
if (dataType == typeof(float))
return (decimal)dbDataReader.GetFloat(columnIdx);
}
return defaultValue;
}
public DateTime GetFieldDateTime (DbDataReader dbDataReader, String columnName, DateTime defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
if (dataType == typeof(DateTime))
return dbDataReader.GetDateTime(columnIdx);
LogAlternativeTypeColumn(columnName, typeof(DateTime), dataType);
}
return defaultValue;
}
public byte[] GetFieldByteArray (DbDataReader dbDataReader, String columnName, byte[] defaultValue)
{
int columnIdx = GetColumnOrdinal(dbDataReader, columnName);
if (columnIdx < 0) return defaultValue;
// Check for null value (to avoid throwing exception).
if (!dbDataReader.IsDBNull(columnIdx))
{
Type dataType = dbDataReader.GetFieldType(columnIdx);
// Expected data type.
object data = dbDataReader[columnIdx];
if (data is byte[])
return (byte[])data;
LogAlternativeTypeColumn(columnName, typeof(Byte[]), dataType);
}
return defaultValue;
}
//-------------------------------------------------------------------
// Populate command parameters.
// Value is passed as a Typed parameter (rather than object) so that it's type is known
// even if the value is null, eg. to assign Db type for correct handling of null values,
// ref. byte[] -> VarBinary.
protected void AddCommandParameter<ValueType> (DbCommand dbCommand, String parameterName, ValueType value)
{
DbParameter dbParameter = dbCommand.CreateParameter();
dbParameter.ParameterName = parameterName;
dbParameter.Value = (Object)value ?? DBNull.Value;
if (typeof(ValueType) == typeof(Int16))
{
dbParameter.DbType = System.Data.DbType.Int16;
}
else if (typeof(ValueType) == typeof(Int32))
{
dbParameter.DbType = System.Data.DbType.Int32;
}
else if (typeof(ValueType) == typeof(DateTime))
{
if (dbCommand is SqlCommand)
dbParameter.DbType = System.Data.DbType.DateTime2;
else dbParameter.DbType = System.Data.DbType.DateTime;
if ((DateTime)(Object)value == DateTime.MinValue)
dbParameter.Value = DBNull.Value;
else
{
DateTime dateTime = (DateTime)dbParameter.Value;
// Resolve millisecond precision inconsistency between c# and odbc/sql.
//dbParameter.Value = new SqlDateTime((DateTime)dbParameter.Value);
dbParameter.Value = dateTime.AddMilliseconds(-dateTime.Millisecond);
// .Net 4.5
//dbParameter.Scale = 3;
}
}
else if (typeof(ValueType) == typeof(byte[]))
{
// Must be explicit with column type to handle null values correctly.
dbParameter.DbType = System.Data.DbType.Binary;
}
dbCommand.Parameters.Add(dbParameter);
}
//-------------------------------------------------------------------
// Database updates via ODBC Command.
public abstract bool ExecuteInsertCommand (DbCommand dbCommand);
public abstract bool ExecuteUpdateCommand (DbCommand dbCommand);
//public abstract bool ExecuteDeleteCommand (DbCommand dbCommand);
//-------------------------------------------------------------------
// Full list of all columns missing from database over life of application.
private static readonly List<String> columnsMissing = new List<string>();
// Missing columns are only logged on their initial discovery.
private void LogMissingColumn (String columnName)
{
String columnIdentifier = DbInfo.Context+"."+(!StringUtil.IsEmpty(SchemaName)?SchemaName+".":"")+TableName+"."+columnName;
if (!columnsMissing.ContainsCI(columnIdentifier))
{
columnsMissing.Add(columnIdentifier);
// Message is only logged on first occurence.
SaLogger.Debug(GetType().Name + " Column not found on database: " + columnIdentifier);
}
}
//-------------------------------------------------------------------
// Full list of all columns found with alternative data type in database over life of application.
private static readonly List<String> columnsAlternativeType = new List<string>();
// Missing columns are only logged on their initial discovery.
private void LogAlternativeTypeColumn (String columnName, Type typeExpected, Type typeFound)
{
String columnIdentifier = DbInfo.Context+"."+(!StringUtil.IsEmpty(SchemaName)?SchemaName+".":"")+TableName+"."+columnName;
if (!columnsAlternativeType.ContainsCI(columnIdentifier))
{
columnsAlternativeType.Add(columnIdentifier);
// Message is only logged on first occurence.
SaLogger.Debug(GetType().Name + " Column has inconsistent type: " + columnIdentifier + ". Expected: " + typeExpected.Name + ". Found: " + typeFound.Name);
}
}
//-------------------------------------------------------------------
// Logging.
public static SaMessageLevel LoggingLevel { get; set; } = SaMessageLevel.None;
public static String LoggingPrefix { get; set; } = " ~~~ ";
protected void Log (String fn, String message, SaMessageLevel level = SaMessageLevel.Debug)
{
if ((int)level > (int)LoggingLevel) return;
SaLogger.Log((fn + "\n\t" + message).Trim(), level);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
+28
View File
@@ -0,0 +1,28 @@
using System.Data;
using Sarand.Net.Standard.Base.Dbas;
namespace Sarand.Net.Standard.Dbas.Data
{
//=======================================================================
/// <summary>
/// Wrapper for System.Data.DataTable
/// </summary>
public class DbDataTable : IDbDataTable
{
//-------------------------------------------------------------------
// Data members.
private DataTable dataTable;
//-------------------------------------------------------------------
// Construction.
public DbDataTable (DataTable dataTable)
{
this.dataTable = dataTable;
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,279 @@
using System;
using System.Data.Common;
using System.Threading.Tasks;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.Data
{
//=======================================================================
public class DbResultSet_DataReader : DbResultSet
{
//-------------------------------------------------------------------
// Data members.
private class Data
{
// Construction.
public Data (ISacsDatabase database, String query)
{
Database = database;
Query = query;
}
// Properties.
public ISacsDatabase Database { get; }
public String Query { get; }
public DbConnection DbConnection { get; set; }
public DbCommand DbCommand { get; set; }
public DbDataReader DbDataReader { get; set; }
// Result set schema - to avoid keeping connection open.
public String[] ColumnNames { get; set; }
public String[] ColumnTypeNames { get; set; }
public void PopulateColumns ()
{
int fieldCount = DbDataReader.FieldCount;
ColumnNames = new String[fieldCount];
ColumnTypeNames = new String[fieldCount];
for (int columnIdx = 0; columnIdx < fieldCount; columnIdx++)
{
ColumnNames[columnIdx] = DbDataReader.GetName(columnIdx);
ColumnTypeNames[columnIdx] = DbDataReader.GetDataTypeName(columnIdx);
}
}
}
private readonly Data data;
//-------------------------------------------------------------------
// Construction.
[Obsolete("Constructor is deprecated. Use ExecuteQuery[Async] instead.")]
public DbResultSet_DataReader (SacsDatabase database, String query)
{
data = new Data(database, query);
String fn = GetType().Name + ".CTR";
try
{
ExecuteQuery_Internal(data);
Log(fn, "Query: " + data.Query + (HasRows ? " [has rows]" : " [no rows]"), SaMessageLevel.Debug);
}
catch (Exception exc)
{
SetErrorState(ExceptionUtil.GetErrorStateMessage(exc));
SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc, 6) + "\n\t Query: " + query, true);
}
}
/// <summary>Private construction - created from ExecuteQuery{Async].</summary>
private DbResultSet_DataReader (Data data)
{
this.data = data;
}
protected override void Dispose (bool disposing)
{
if (disposing) Close();
}
//-------------------------------------------------------------------
// Execute query.
public static DbResultSet_DataReader ExecuteQuery (ISacsDatabase database, String query)
{
Data data = new Data(database, query);
String fn = typeof(DbResultSet_DataReader).Name + ".ExecuteQuery";
String errorState = "";
try
{
ExecuteQuery_Internal(data);
Log(fn, "Query: " + data.Query + (data.DbDataReader.HasRows ? " [has rows]" : " [no rows]"), SaMessageLevel.Debug);
}
catch (Exception exc)
{
errorState = ExceptionUtil.GetErrorStateMessage(exc);
SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc, 6) + "\n\t Query: " + query, true);
}
DbResultSet_DataReader resultSet = new DbResultSet_DataReader (data);
resultSet.SetErrorState(errorState);
return resultSet;
}
public static async Task<DbResultSet_DataReader> ExecuteQueryAsync (SacsDatabase database, String query)
{
Data data = new Data(database, query);
String fn = typeof(DbResultSet_DataReader).Name + ".ExecuteQueryAsync";
String errorState = "";
try
{
data.DbConnection = data.Database.CreateConnection();
data.DbCommand = data.DbConnection.CreateCommand();
data.DbConnection.Open();
data.DbCommand.CommandText = data.Database.GetSelectQueryPrefix() + data.Query;
data.DbDataReader = await data.DbCommand.ExecuteReaderAsync();
data.PopulateColumns();
Log(fn, "Query: " + data.Query + (data.DbDataReader.HasRows ? " [has rows]" : " [no rows]"), SaMessageLevel.Debug);
}
catch (Exception exc)
{
errorState = ExceptionUtil.GetErrorStateMessage(exc);
SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc, 6) + "\n\t Query: " + query, true);
}
DbResultSet_DataReader resultSet = new DbResultSet_DataReader (data);
resultSet.SetErrorState(errorState);
return resultSet;
}
//-------------------------------------------------------------------
// Close.
public override void Close ()
{
// Dispose of database objects.
if (data.DbDataReader != null && !data.DbDataReader.IsClosed) data.DbDataReader.Close();
data.DbDataReader = null;
if (data.DbCommand != null) data.DbCommand.Dispose();
data.DbCommand = null;
if (data.DbConnection != null) data.DbConnection.Dispose();
data.DbConnection = null;
}
//-------------------------------------------------------------------
// Execute query.
private static void ExecuteQuery_Internal (Data data)
{
data.DbConnection = data.Database.CreateConnection();
data.DbCommand = data.DbConnection.CreateCommand();
data.DbConnection.Open();
data.DbCommand.CommandText = data.Database.GetSelectQueryPrefix() + data.Query;
data.DbDataReader = data.DbCommand.ExecuteReader();
data.PopulateColumns();
}
//-------------------------------------------------------------------
// Navigation.
public override bool NextRecord ()
{
// Move to next result.
bool nextRecord = false;
if (data.DbDataReader != null)
{
nextRecord = data.DbDataReader.Read();
if (!nextRecord)
{
Close();
}
}
return nextRecord;
}
//-------------------------------------------------------------------
// Attributes.
public override int FieldCount
{
get
{
if (data.DbDataReader != null)
return data.DbDataReader.FieldCount;
return 0;
}
}
public override bool HasRows
{
get
{
if (data.DbDataReader != null)
return data.DbDataReader.HasRows;
return false;
}
}
public override int GetOrdinal (String columnName)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetOrdinal(columnName);
return -1;
}
public override String GetDataTypeName (int columnIdx)
{
if (data.ColumnTypeNames != null)
return data.ColumnTypeNames[columnIdx];
return String.Empty;
}
public override String GetName (int columnIdx)
{
if (data.ColumnNames != null)
return data.ColumnNames[columnIdx];
return String.Empty;
}
public override bool IsDbNull (int columnIdx)
{
if (data.DbDataReader != null && data.DbDataReader.IsDBNull(columnIdx))
return true;
object value = GetValue(columnIdx);
return (value is System.DBNull);
}
public override object GetValue (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetValue(columnIdx);
return false;
}
public override bool GetBoolean (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetBoolean(columnIdx);
return false;
}
public override byte GetByte (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetByte(columnIdx);
return 0;
}
public override short GetInt16 (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetInt16(columnIdx);
return 0;
}
public override int GetInt32 (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetInt32(columnIdx);
return 0;
}
public override long GetInt64 (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetInt64(columnIdx);
return 0;
}
public override float GetFloat (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetFloat(columnIdx);
return 0.0f;
}
public override double GetDouble (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetDouble(columnIdx);
return 0.0;
}
public override decimal GetDecimal (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetDecimal(columnIdx);
return 0.0m;
}
public override String GetString (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetString(columnIdx);
return String.Empty;
}
public override DateTime GetDateTime (int columnIdx)
{
if (data.DbDataReader != null)
return data.DbDataReader.GetDateTime(columnIdx);
return DateTime.MinValue;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,200 @@
using System;
using System.Data;
using System.Data.Common;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.Data
{
//=======================================================================
public class DbResultSet_DataTableReader : DbResultSet
{
//-------------------------------------------------------------------
// Data members.
private SacsDatabase database = null;
private String query = String.Empty;
private DbConnection dbConnection = null;
private DbCommand dbCommand = null;
private DbDataAdapter dbDataAdapter = null;
private DataTableReader dataTableReader = null;
//-------------------------------------------------------------------
// Construction.
public DbResultSet_DataTableReader (SacsDatabase database, String query)
{
this.database = database;
this.query = query;
ExecuteQuery();
}
//-------------------------------------------------------------------
// Execute query.
private void ExecuteQuery ()
{
ClearErrorState();
String fn = GetType().Name + ".ExecuteQuery";
Close();
try
{
dbConnection = database.CreateConnection();
dbCommand = dbConnection.CreateCommand();
dbDataAdapter = database.CreateDataAdapter();
dbDataAdapter.SelectCommand = dbCommand;
dbDataAdapter.SelectCommand.CommandText = database.GetSelectQueryPrefix() + query;
DataTable dataTable = new DataTable();
dbDataAdapter.Fill(dataTable);
dataTableReader = new DataTableReader(dataTable);
Log(fn, GetType().Name + ".ExecuteQuery Query: " + query + (HasRows ? " [has rows]" : " [no rows]"), SaMessageLevel.Debug);
}
catch (Exception exc)
{
SetErrorState(exc.GetType().Name + ": " + exc.Message);
SaLogger.Warn(fn + " " + exc.GetType().Name + ": " + exc.Message + "\n\t Query: " + query, true);
}
}
//-------------------------------------------------------------------
protected override void Dispose (bool disposing)
{
Close();
}
public override void Close ()
{
// Dispose of database objects.
if (dataTableReader != null) dataTableReader.Close();
dataTableReader = null;
if (dbDataAdapter != null) dbDataAdapter.Dispose();
if (dbCommand != null) dbCommand.Dispose();
if (dbConnection != null) dbConnection.Dispose();
dataTableReader = null;
dbDataAdapter = null;
dbCommand = null;
dbConnection = null;
}
//-------------------------------------------------------------------
// Navigation.
public override bool NextRecord ()
{
// Move to next result.
bool nextRecord = false;
if (dataTableReader != null)
{
nextRecord = dataTableReader.Read();
if (!nextRecord)
{
Close();
}
}
return nextRecord;
}
//-------------------------------------------------------------------
// Attributes.
public override int FieldCount
{
get
{
if (dataTableReader != null)
return dataTableReader.FieldCount;
return 0;
}
}
public override bool HasRows
{
get
{
if (dataTableReader != null)
return dataTableReader.HasRows;
return false;
}
}
public override int GetOrdinal (String columnName)
{
if (dataTableReader != null)
return dataTableReader.GetOrdinal(columnName);
return -1;
}
public override String GetDataTypeName (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetDataTypeName(columnIdx);
return String.Empty;
}
public override String GetName (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetName(columnIdx);
return String.Empty;
}
public override bool IsDbNull (int columnIdx)
{
return (GetValue(columnIdx) is System.DBNull);
}
public override object GetValue (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetValue(columnIdx);
return false;
}
public override bool GetBoolean (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetBoolean(columnIdx);
return false;
}
public override byte GetByte (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetByte(columnIdx);
return 0;
}
public override short GetInt16 (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetInt16(columnIdx);
return 0;
}
public override int GetInt32 (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetInt32(columnIdx);
return 0;
}
public override long GetInt64 (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetInt64(columnIdx);
return 0;
}
public override float GetFloat (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetFloat(columnIdx);
return 0.0f;
}
public override double GetDouble (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetDouble(columnIdx);
return 0.0;
}
public override decimal GetDecimal (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetDecimal(columnIdx);
return 0.0m;
}
public override String GetString (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetString(columnIdx);
return String.Empty;
}
public override DateTime GetDateTime (int columnIdx)
{
if (dataTableReader != null)
return dataTableReader.GetDateTime(columnIdx);
return DateTime.MinValue;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,910 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Data
{
//=======================================================================
internal class SacsDatabaseOdbc : SacsDatabase
{
//-------------------------------------------------------------------
// Data members.
private String sqlConnectionString = "";
private readonly List<DbDfnTable> tables = new List<DbDfnTable>();
public static readonly String DbCol_CreateOn = "CreateOn";
public static readonly String DbCol_CreateBy = "CreateBy";
public static readonly String DbCol_UpdateOn = "UpdateOn";
public static readonly String DbCol_UpdateBy = "UpdateBy";
//-------------------------------------------------------------------
// Construction.
public SacsDatabaseOdbc (DbmsType dbms, String databaseName, String connectionString) : base(dbms, databaseName, connectionString)
{
if (dbms == DbmsType.MsSql)
sqlConnectionString = connectionString;
}
//-------------------------------------------------------------------
// Properties.
public String SqlConnectionString
{
get { return sqlConnectionString; }
set
{
if (sqlConnectionString.Equals(value)) return;
sqlConnectionString = value;
OnConnectionChanged();
}
}
//-------------------------------------------------------------------
// Connection.
public override void OnConnectionChanged ()
{
}
public override DbConnection CreateConnection (bool forceOdbc = false)
{
if (!forceOdbc && DbmsType == DbmsType.MsSql && !StringUtil.IsEmpty(sqlConnectionString))
return new SqlConnection(sqlConnectionString);
return new OdbcConnection(ConnectionString);
}
public override DbDataAdapter CreateDataAdapter ()
{
return new OdbcDataAdapter();
}
//-------------------------------------------------------------------
// I d e n t i t y G e n e r a t i o n
//-------------------------------------------------------------------
private DbDfnTable nextIdTableDfn = null;
public override SysId GetNextId (String objectName, DbUpdateInfo dbUpdateInfo, bool databaseTable = true, String idColumn = "Id")
{
PopulateNextIdTableDfn();
// Next Id database definitions.
String colObject = NextIdTable+"."+NextIdColumn_Object;
String colNextId = NextIdTable+"."+NextIdColumn_NextId;
String colAliasNextId = "NxtId";
String filter = "("+colObject+")='"+objectName+"'";
bool hasCreateCols = (nextIdTableDfn.HasColumnByName (DbCol_CreateOn) && nextIdTableDfn.HasColumnByName (DbCol_CreateBy));
bool hasUpdateCols = (nextIdTableDfn.HasColumnByName (DbCol_UpdateOn) && nextIdTableDfn.HasColumnByName (DbCol_UpdateBy));
// Query the data.
int nextIdValue = 1;
DbQuery qry = new DbQuery(DbmsType);
qry.Tables.Add(NextIdTable);
qry.Columns.Add(colNextId, colAliasNextId);
qry.Filters.Add(filter);
//SaLogger.Debug(GetType().Name + ".GetNextId Query: " + qry.BuildQuery());
DbResultSet_DataReader resultsSet = DbResultSet_DataReader.ExecuteQuery(this,qry.BuildQuery());
if (resultsSet != null && resultsSet.NextRecord())
{
NamedValue.Map values = resultsSet.GetRecordValues();
nextIdValue = Math.Max(1, (int)values.GetValue(colAliasNextId).AsLong());
// Update the record with the next available value.
List<StringPair> updateColumnValues = new List<StringPair>();
updateColumnValues.Add(NextIdColumn_NextId, (nextIdValue + 1).ToString());
if (hasUpdateCols)
{
updateColumnValues.Add(DbCol_UpdateOn, DbQuery.FormatDateTimeForCondition(DateTime.Now));
updateColumnValues.Add(DbCol_UpdateBy, SysId.IsValid(dbUpdateInfo.UserId) ? SysId.ToString(dbUpdateInfo.UserId) : "0");
}
String updateQry = "Update " + NextIdTable + " Set " + updateColumnValues.Concat("=").Concat(", ") + " Where " + filter;
//SaLogger.Debug(GetType().Name + ".GetNextId Update query: " + updateQry);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = updateQry;
dbCommand.ExecuteNonQuery();
}
}
else
{
// Object not found on NextId table.
// If object is a database table, query maximum value.
if (databaseTable)
nextIdValue = GetNextIdFromTable(objectName, idColumn);
// Construct query to store Next Id value.
List<StringPair> insertColumnValues = new List<StringPair>();
insertColumnValues.Add(NextIdColumn_Object, "'" + DbQuery.FormatForCondition(objectName) + "'");
insertColumnValues.Add(NextIdColumn_NextId, (nextIdValue + 1).ToString());
if (hasCreateCols)
{
insertColumnValues.Add(DbCol_CreateOn, DbQuery.FormatDateTimeForCondition(DateTime.Now));
insertColumnValues.Add(DbCol_CreateBy, SysId.IsValid(dbUpdateInfo.UserId) ? SysId.ToString(dbUpdateInfo.UserId) : "0");
}
if (hasUpdateCols)
{
insertColumnValues.Add(DbCol_UpdateOn, DbQuery.FormatDateTimeForCondition(DateTime.Now));
insertColumnValues.Add(DbCol_UpdateBy, SysId.IsValid(dbUpdateInfo.UserId) ? SysId.ToString(dbUpdateInfo.UserId) : "0");
}
String insertQry = "Insert Into " + NextIdTable + " (" + insertColumnValues.GetValues(StringPair.Value.Value1).Concat(",") + ") Values (" +insertColumnValues.GetValues(StringPair.Value.Value2).Concat(",") + ")";
SaLogger.Debug(GetType().Name + ".GetNextId Insert query: " + insertQry);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = insertQry;
dbCommand.ExecuteNonQuery();
}
}
if (resultsSet != null) resultsSet.Dispose();
return new SysId(nextIdValue);
}
public override int GetNextIdFromTable(String objectName, String idColumn = "Id")
{
DataValue maxId = GetRowValue(objectName, "Max(" + idColumn + ")", "");
if (maxId != null && maxId.GetDataType() != DataValue.DataType.Unknown)
return Math.Max(0, (int)maxId.AsLong()) + 1;
return 1;
}
public override bool SetMinNextId (String objectName, SysId id, DbUpdateInfo dbUpdateInfo, bool databaseTable = true, String idColumn = "Id", bool force = false)
{
PopulateNextIdTableDfn();
throw new NotSupportedException(GetType().Name + ".SetMinNextId Not yet implemented");
//return true;
}
private void PopulateNextIdTableDfn ()
{
if (nextIdTableDfn != null && nextIdTableDfn.Name.Equals(NextIdTable)) return;
nextIdTableDfn = GetTableDfn(NextIdTable);
}
//-------------------------------------------------------------------
// Q u e r y D a t a b a s e
//-------------------------------------------------------------------
// Query records.
public override IDbDataTable ExecuteQuery (String query)
{
String fn = GetType().Name + ".ExecuteQuery";
ClearErrorState();
DataTable dataTable = null;
Log(fn, "Query: " + query, SaMessageLevel.Debug);
try
{
using (DbConnection dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = query;
dataTable = new DataTable();
dataTable.Load(dbCommand.ExecuteReader());
}
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true);
SetErrorState(exc.Message);
}
return new DbDataTable(dataTable);
}
//-------------------------------------------------------------------
/// <summary>Execute a non-query statement and return the row count.</summary>
public override int ExecuteNonQuery (string query)
{
String fn = GetType().Name + ".ExecuteNonQuery";
ClearErrorState();
Log(fn, "Query: " + query, SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = query;
return dbCommand.ExecuteNonQuery();
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true);
SetErrorState(exc.Message);
}
}
return 0;
}
//-------------------------------------------------------------------
/// <summary>Compile and execute an insert statement and return the row count.</summary>
public override int ExecuteInsert (String tableName, List<StringPair> columnNameValues)
{
String fn = GetType().Name + ".ExecuteInsert";
ClearErrorState();
String query =
"INSERT INTO " + tableName + " " +
"(" + columnNameValues.GetValues(StringPair.Value.Value1).Concat(", ") + ") " +
"VALUES (" + columnNameValues.GetValues(StringPair.Value.Value2).Concat(", ") + ")";
Log(fn, "Query: " + query, SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = query;
return dbCommand.ExecuteNonQuery();
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true);
SetErrorState(exc.Message);
}
}
return 0;
}
//-------------------------------------------------------------------
/// <summary>Compile and execute an update statement and return the row count.</summary>
public override int ExecuteUpdate (String tableName, List<StringPair> columnNameValues, String filter)
{
String fn = GetType().Name + ".ExecuteUpdate";
ClearErrorState();
String query =
"UPDATE " + tableName + " " +
"SET " + columnNameValues.Concat("=").Concat(", ");
if (!StringUtil.IsEmpty(filter))
query += (String)" WHERE " + filter;
Log(fn, "Query: " + query, SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = query;
return dbCommand.ExecuteNonQuery();
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true);
SetErrorState(exc.Message);
}
}
return 0;
}
//-------------------------------------------------------------------
/// <summary>Compile and execute a delete statement and return the row count.</summary>
public override int ExecuteDelete (String tableName, String filter)
{
String fn = GetType().Name + ".ExecuteDelete";
ClearErrorState();
String query = "DELETE FROM " + tableName;
if (!StringUtil.IsEmpty(filter))
query += " WHERE " + filter;
Log(fn, "Query: " + query, SaMessageLevel.Debug);
using (var dbConnection = CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = query;
return dbCommand.ExecuteNonQuery();
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc) + "\n\tQuery: " + query, true);
SetErrorState(exc.Message);
}
}
return 0;
}
//-------------------------------------------------------------------
/// <summary>Retrieve specific row value.</summary>
public override DataValue GetRowValue (String tableName, String columnName, String filter)
{
ClearErrorState();
try
{
String colAlias = "DataValue";
String query = "SELECT "+columnName+" '"+colAlias+"' FROM "+tableName+(!StringUtil.IsEmpty(filter)?" WHERE "+filter:"");
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(this, query))
{
if (dbResultSet.NextRecord())
return dbResultSet.GetRecordValues().GetValue(colAlias);
else if (dbResultSet.HasErrorState())
SetErrorState(dbResultSet.ErrorStateMessage);
}
}
catch (Exception exc)
{
SaLogger.Error(GetType().Name + ".GetRowValue " + ExceptionUtil.GetLogMessage(exc) + "\n\tTable: " + tableName + ". Column: " + columnName + ". Filter: " + (!StringUtil.IsEmpty(filter) ? filter : "<none>"), true);
SetErrorState(exc.Message);
}
return null;
}
//-------------------------------------------------------------------
/// <summary>Get row count from Table applying optional filter.</summary>
public override long GetRowCount (String tableName, String filter)
{
ClearErrorState();
DataValue dataValue = GetRowValue(tableName, "Count(*)", filter);
if (dataValue != null) return dataValue.AsLong();
return 0;
}
//-------------------------------------------------------------------
/// <summary>Get calculated value from table - Sum, Min or Max.</summary>
public override DataValue GetRowValue (String tableName, String columnName, String filter, DbGetValueType getValueType)
{
ClearErrorState();
String fn = "";
if (getValueType == DbGetValueType.eDbValueSum)
fn = "SUM";
else if (getValueType == DbGetValueType.eDbValueMin)
fn = "MIN";
else if (getValueType == DbGetValueType.eDbValueMax)
fn = "MAX";
return GetRowValue(tableName, fn + "(" + columnName + ")", filter);
}
//-------------------------------------------------------------------
// D a t a b a s e S c h e m a
//-------------------------------------------------------------------
// NB Always use ODBC connection for querying schema.
// eg. SQL Connection GetSchema('Indices') doesn't return index columns.
public override List<String> GetTableNames ()
{
// Only populate table names if not previously done.
if (tables.Count < 1)
{
using (DbConnection dbConnection = CreateConnection(true))
{
dbConnection.Open();
PopulateTableNames(dbConnection);
}
}
return tables.GetNames();
}
public override List<DbDfnTable> GetTableDfns (bool refresh = false)
{
if (refresh) ClearTableDfns();
// Only populate table names and/or table schemas where not previously done.
if (tables.Count < 1 || tables.Exists(item => item.Columns.Count < 1))
{
// Use a single connection for table and schaema population.
using (DbConnection dbConnection = CreateConnection(true))
{
dbConnection.Open();
if (tables.Count < 1)
PopulateTableNames(dbConnection);
foreach (DbDfnTable table in tables)
{
if (table.Columns.Count < 1)
{
PopulateTableColumns(dbConnection, table);
PopulateTableIndices(dbConnection, table);
}
}
}
}
return new List<DbDfnTable>(tables);
}
public void ClearTableDfns ()
{
tables.Clear();
}
public override DbDfnTable GetTableDfn (String tableName, bool refresh = false)
{
if (!tables.GetNames().Contains(tableName) || refresh)
{
// Remove current table definition.
tables.RemoveAll(item => item.Name.EqualsCI(tableName));
}
// Only populate the specified table if required.
if (!tables.Exists(item => item.Name.EqualsCI(tableName) && item.Columns.Count > 0))
{
using (DbConnection dbConnection = CreateConnection(true))
{
dbConnection.Open();
if (!tables.Exists(item => item.Name.EqualsCI(tableName)))
PopulateTableNames(dbConnection, tableName);
DbDfnTable table = tables.GetTableByName(tableName);
if (table != null && (!table.HasColumns() || refresh))
{
PopulateTableColumns(dbConnection, table);
PopulateTableIndices(dbConnection, table);
}
}
}
return tables.GetTableByName(tableName);
}
//-------------------------------------------------------------------
private void PopulateTableNames (DbConnection dbConnection, String tableNameRestriction = null)
{
if (StringUtil.IsEmpty(tableNameRestriction) && tables.Count > 0) return;
if (!StringUtil.IsEmpty(tableNameRestriction) && tables.Exists(item => item.Name.Equals(tableNameRestriction))) return;
String fn = GetType().Name+".PopulateTableNames";
if (SacsSystem.DebugMode) SaLogger.Debug(fn + (!StringUtil.IsEmpty(tableNameRestriction) ? " Table: " + tableNameRestriction : " "));
String[] restrictions = new String[] { null, null, tableNameRestriction }; // database, owner, table name, type
using (DataTable tableSchema = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Tables, restrictions))
{
//DataSet set = tableSchema.DataSet;
foreach (DataRow row in tableSchema.Rows)
{
//-----------------------------------------------------------
// Columns are: Name Size Data Type Values
// 1. TABLE_CAT 255 12 VarChar
// 2. TABLE_SCHEM 128 12 VarChar
// 3. TABLE_NAME 128 12 VarChar
// 4. TABLE_TYPE 128 12 VarChar 'SYSTEM TABLE' 'TABLE' 'VIEW'
// 'GLOBAL TEMPORARY' 'LOCAL TEMPORARY'
// 'ALIAS' 'SYNONYM'
// 5. REMARKS 254 12 VarChar
// TABLE_CATALOG is the SQL alternative to TABLE_CAT
// TABLE_QUALIFIER is the ODBC 2.0 alternative to TABLE_CAT (ODBC 3.0).
// TABLE_SCHEMA is the SQL alternative to TABLE_SCHEM
// TABLE_OWNER is the ODBC 2.0 alternative to TABLE_SCHEM (ODBC 3.0).
// Variations:
// Sage Line 50: TABLE_QUALIFIER, TABLE_OWNER, TABLE_NAME, TABLE_TYPE, REMARKS.
// Sybase Advantage: QUALIFIERNAME, OWNERNAME, TABLENAME, TYPENAME, REMARKS
//-----------------------------------------------------------
String database = String.Empty, schema = String.Empty, tableName = String.Empty, type = String.Empty, remarks = String.Empty;
foreach (DataColumn column in tableSchema.Columns)
{
String colName = column.ColumnName;
String value = row[colName].ToString();
if (colName.EqualsCI("TABLE_CAT") || colName.EqualsCI("TABLE_CATALOG") || colName.EqualsCI("TABLE_QUALIFIER") || colName.EqualsCI("QualifierName"))
database = value;
else if (colName.EqualsCI("TABLE_SCHEM") || colName.EqualsCI("TABLE_SCHEMA") || colName.EqualsCI("TABLE_OWNER") || colName.EqualsCI("OwnerName"))
schema = value;
else if (colName.EqualsCI("TABLE_NAME") || colName.EqualsCI("TableName"))
tableName = value;
else if (colName.EqualsCI("TABLE_TYPE") || colName.EqualsCI("TypeName"))
type = value;
else if (colName.EqualsCI("REMARKS"))
remarks = value;
else
SaLogger.Warn(fn + " Unrecognised column name: '" + colName + "'");
}
// TODO Why is Type sometimes "BASE TABLE"?
if (!StringUtil.IsEmpty(tableName) && (type.EqualsCI("Table") || type.EqualsCI("Base Table")) && (!schema.EqualsCI("sys") || !tableName.Left(9).EqualsCI("trace_xe_")))
{
#if DEBUG
//SaLogger.Trace(fn+" Database="+database+", Schema="+schema+", Table="+tableName+", Type="+ type);
#endif
tables.Add(new DbDfnTable(schema, tableName, remarks));
}
}
}
List<DbDfnTable> tablesUnsorted = new List<DbDfnTable>(tables);
tables.Clear();
tables.AddRange(tablesUnsorted.OrderBy(item => item.Name).ToList());
}
//-------------------------------------------------------------------
private void PopulateTableColumns (DbConnection dbConnection, DbDfnTable table)
{
String fn = GetType().Name+".PopulateTableColumns";
if (SacsSystem.DebugMode) SaLogger.Debug(fn + " Table: " + table.Name);
short columnPos = 0;
String[] restrictions = new String[] { null, table.Schema, table.Name, null }; // database, owner, table name, column name
using (DataTable columnSchema = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Columns, restrictions))
{
foreach (DataRow row in columnSchema.Rows)
{
//-----------------------------------------------------------
// Columns are: Name Size Data Type Values
// 1. TABLE_CAT 255 12 VarChar
// 2. TABLE_SCHEM 128 12 VarChar
// 3. TABLE_NAME 128 12 VarChar
// 4. COLUMN_NAME 128 12 VarChar
// 5. DATA_TYPE 5 5 SmallInt
// 6. TYPE_NAME 64 12 VarChar
// 7. COLUMN_SIZE 10 4 Integer (Counter)
// 8. BUFFER_LENGTH 10 4 Integer (Counter)
// 9. DECIMAL_DIGITS 5 5 SmallInt
// 10. NUM_PREC_RADIX 5 5 SmallInt 10 or 2.
// 11. NULLABLE 5 5 SmallInt SQL_NO_NULLS,SQL_NULLABLE,SQL_NULLABLE_UNKNOWN
// 12. REMARKS 254 12 VarChar
// 13. COLUMN_DEF 128 12 VarChar Default value.
// 14. SQL_DATA_TYPE 5 5 SmallInt
// 15. SQL_DATETIME_SUB 5 5 SmallInt
// 16. CHAR_OCTET_LENGTH 10 4 Integer (Counter)
// 17. ORDINAL_POSITION 10 4 Integer (Counter)
// 18. IS_NULLABLE 128 12 VarChar 'YES' or 'NO'
// 19. ORDINAL 10 4 Integer (Counter)
// Alternative column names:
// ODBC 2.0 column ODBC 3.x column
// TABLE_QUALIFIER TABLE_CAT
// TABLE_OWNER TABLE_SCHEM
// PRECISION COLUMN_SIZE
// LENGTH BUFFER_LENGTH
// SCALE DECIMAL_DIGITS
// RADIX NUM_PREC_RADIX
// SQL Server columns:
// TABLE_CATALOG, TABLE_SCHEMA, ORDINAL_POSITION, COLUMN_DEFAULT
// CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH
// NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE, DATETIME_PRECISION
// CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, COLLATION_CATALOG
// IS_SPARSE, IS_COLUMN_SET, IS_FILESTREAM
// SQL Server columns returned by ODBC conection:
// NUM_PREC_RADIX, COLUMN_DEF, SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH
// SS_IS_SPARSE, SS_IS_COLUMN_SET, SS_IS_COMPUTED, SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME
// SS_UDT_ASSEMBLY_TYPE_NAME, SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SS_XML_SCHEMACOLLECTION_SCHEMA_NAME, SS_XML_SCHEMACOLLECTION_NAME, SS_DATA_TYPE
// Sage ODBC data sources quote the following columns:
// TABLE_QUALIFIER,TABLE_OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,
// TYPE_NAME,PRECISION,LENGTH,SCALE,RADIX,NULLABLE,REMARKS
// Sybase Advantage data sources quote the following columns:
// QUALIFIERNAME,OWNERNAME,TABLENAME,colName,TYPE
// TYPENAME,PRECISION,LENGTH,SCALE,RADIX,NULLABLE
// REMARKS,DEFAULT,DATATYPE,DATETIME_SUBTYPE
// OCTET_LENGTH,ORDINAL_POSITION,IS_NULLABLE
// Notes.
// - SQL Connection doesn't show if a column is Identity.
// - Unclear how to deterine column size for datetime values between SQL and ODBC.
//-----------------------------------------------------------
String database = String.Empty, schema = String.Empty, tableName = String.Empty, columnName = String.Empty, nativeDataTypeName = String.Empty, remarks = String.Empty;
short nativeDataType = 0, decimalDigits = 0;
long columnSize = 0, bufferLen = 0;
DbColumnNullable nullable = DbColumnNullable.Unknown;
bool isIdentity = false, isNullable = false;
foreach (DataColumn column in columnSchema.Columns)
{
String colName = column.ColumnName;
String value = row[colName].ToString();
//if (columnName.EqualsCI("CreateOn")) SaLogger.Debug(GetType().Name+".PopulateTableColumns Schema column name: " + colName + " [" + value + "]");
if (colName.EqualsCI("TABLE_CAT") || colName.EqualsCI("TABLE_CATALOG") || colName.EqualsCI("TABLE_QUALIFIER") || colName.EqualsCI("QualifierName"))
database = value;
else if (colName.EqualsCI("TABLE_SCHEM") || colName.EqualsCI("TABLE_SCHEMA") || colName.EqualsCI("TABLE_OWNER") || colName.EqualsCI("OwnerName"))
schema = value;
else if (colName.EqualsCI("TABLE_NAME") || colName.EqualsCI("TableName"))
tableName = value;
else if (colName.EqualsCI("Column_Name") || colName.EqualsCI("ColumnName"))
columnName = value;
else if (colName.EqualsCI("Data_Type") || colName.EqualsCI("Type"))
{
if (value.IsNumeric(true))
nativeDataType = value.ToShort();
else
{
// SQL returns data type name (non numeric).
nativeDataTypeName = value;
nativeDataType = OdbcUtil.GetSqlNativeDataType(value);
}
}
else if (colName.EqualsCI("Type_Name") || colName.EqualsCI("TypeName"))
{
nativeDataTypeName = value;
if (value.EndsWith(" identity"))
{
nativeDataTypeName = value.Left(value.Length - " identity".Length);
isIdentity = true;
}
}
else if (colName.EqualsCI("Column_Size") || colName.EqualsCI("CHARACTER_MAXIMUM_LENGTH") || colName.EqualsCI("NUMERIC_PRECISION") || colName.EqualsCI("DATETIME_PRECISION") || colName.EqualsCI("Precision"))
{
if (!StringUtil.IsEmpty(value)) columnSize = value.ToLong();
if (colName.EqualsCI("CHARACTER_MAXIMUM_LENGTH") && value.Equals("-1")) columnSize = 0;
}
else if (colName.EqualsCI("Buffer_Length") || colName.EqualsCI("Length"))
{
if (!StringUtil.IsEmpty(value)) bufferLen = value.ToLong();
}
else if (colName.EqualsCI("Decimal_Digits") || colName.EqualsCI("Scale") || colName.EqualsCI("NUMERIC_SCALE"))
{
if (!StringUtil.IsEmpty(value)) decimalDigits = value.ToShort();
}
else if (colName.EqualsCI("Nullable"))
{
if (!StringUtil.IsEmpty(value)) nullable = (DbColumnNullable)value.ToShort();
}
else if (colName.EqualsCI("Is_Nullable"))
isNullable = !value.EqualsCI("No");
else if (colName.EqualsCI("REMARKS"))
remarks = value;
// SqlServer specific.
else if (colName.EqualsCI("ORDINAL_POSITION")) { }
else if (colName.EqualsCI("COLUMN_DEFAULT")) { }
else if (colName.EqualsCI("CHARACTER_OCTET_LENGTH")) { }
else if (colName.EqualsCI("NUMERIC_PRECISION_RADIX")) { }
else if (colName.EqualsCI("CHARACTER_SET_CATALOG")) { }
else if (colName.EqualsCI("CHARACTER_SET_SCHEMA")) { }
else if (colName.EqualsCI("CHARACTER_SET_NAME")) { }
else if (colName.EqualsCI("COLLATION_CATALOG")) { }
else if (colName.EqualsCI("IS_SPARSE")) { }
else if (colName.EqualsCI("IS_COLUMN_SET")) { }
else if (colName.EqualsCI("IS_FILESTREAM")) { }
// SQL Server ODBC.
else if (colName.EqualsCI("SS_IS_IDENTITY")) isIdentity = value.ToBool();
else if (colName.EqualsCI("NUM_PREC_RADIX")) { }
else if (colName.EqualsCI("COLUMN_DEF")) { }
else if (colName.EqualsCI("SQL_DATA_TYPE")) { }
else if (colName.EqualsCI("SQL_DATETIME_SUB")) { }
else if (colName.EqualsCI("CHAR_OCTET_LENGTH")) { }
else if (colName.EqualsCI("SS_IS_SPARSE")) { }
else if (colName.EqualsCI("SS_IS_COLUMN_SET")) { }
else if (colName.EqualsCI("SS_IS_COMPUTED")) { }
else if (colName.EqualsCI("SS_UDT_CATALOG_NAME")) { }
else if (colName.EqualsCI("SS_UDT_SCHEMA_NAME")) { }
else if (colName.EqualsCI("SS_UDT_ASSEMBLY_TYPE_NAME")) { }
else if (colName.EqualsCI("SS_XML_SCHEMACOLLECTION_CATALOG_NAME")) { }
else if (colName.EqualsCI("SS_XML_SCHEMACOLLECTION_SCHEMA_NAME")) { }
else if (colName.EqualsCI("SS_XML_SCHEMACOLLECTION_NAME")) { }
else if (colName.EqualsCI("SS_DATA_TYPE")) { }
// Unrecognised columns.
else SaLogger.Debug(GetType().Name + ".PopulateTableColumns Unrecognised Schema column name: " + colName + " [" + value + "]");
}
if (!StringUtil.IsEmpty(columnName))
{
//SaLogger.Debug(GetType().Name+".PopulateTableColumns Database=" + database + ", Schema=" + schema + ", Table=" + tableName + ", Column=" + columnName);
DbDfnColumn column = new DbDfnColumn(schema, tableName, ++columnPos, columnName);
column.DataTypeNative = nativeDataType;
column.DataTypeNameNative = nativeDataTypeName;
DbColumnDataType dataType = OdbcUtil.OdbcToDataType(nativeDataType);
column.DataType = dataType;
column.IsIdentity = isIdentity;
column.BufferLen = bufferLen;
column.Size = columnSize;
column.DecimalDigits = decimalDigits;
column.Nullable = nullable;
column.IsNullable = isNullable;
column.Remarks = remarks;
table.AddColumn(column);
}
}
}
// Additional logic for SQL connections.
SqlConnection sqlConnection = dbConnection as SqlConnection;
if (sqlConnection != null)
{
// Retrieve additional information via SqlDataReader.
using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
{
sqlCommand.CommandText = "Select Top 1 * From [" + table.Name + "]";
using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(CommandBehavior.SchemaOnly))
using (DataTable dataTable = sqlDataReader.GetSchemaTable())
{
foreach (DataRow row in dataTable.Rows)
{
String columnName = "";
bool isIdentity = false;
foreach (DataColumn col in dataTable.Columns)
{
String value = row[col].ToString();
if (col.ColumnName.EqualsCI("ColumnName")) columnName = value;
else if (col.ColumnName.EqualsCI("IsIdentity")) isIdentity = value.ToBool();
//if (columnName.EqualsCI("CreateOn")) SaLogger.Debug(GetType().Name+".PopulateTableColumns Column name: " + col.ColumnName + " [" + value + "]");
}
DbDfnColumn columnDfn = table.Columns.GetColumnByName(columnName);
if (columnDfn != null)
{
if (isIdentity) columnDfn.IsIdentity = isIdentity;
}
}
}
}
}
}
//-------------------------------------------------------------------
private void PopulateTableIndices (DbConnection dbConnection, DbDfnTable table)
{
String fn = GetType().Name+".PopulateTableIndices";
String[] restrictions = new String[] { null, table.Schema, table.Name }; // database, owner, table name
using (DataTable columnSchema = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Indexes, restrictions))
{
foreach (DataRow row in columnSchema.Rows)
{
//---------------------------------------------------------
// Columns are: Name Size Data Type Values
// 1. TABLE_CAT 255 12 VarChar
// Catalog name of the table to which the statistic or index applies.
// 2. TABLE_SCHEM 128 12 VarChar
// Schema name of the table to which the statistic or index applies.
// 3. TABLE_NAME 128 12 VarChar
// Table name of the table to which the statistic or index applies.
// 4. NON_UNIQUE 5 5 SmallInt
// Indicates whether the index prohibits duplicate values (SQL_TRUE or SQL_FALSE).
// 5. INDEX_QUALIFIER VarChar
// The identifier that is used to qualify the index name doing a DROP INDEX.
// 6. INDEX_NAME VarChar Index name.
// 7. TYPE SmallInt
// Type of information being returned:
// 0 SQL_TABLE_STAT indicates a statistic for the table (in the CARDINALITY or PAGES column).
// ? SQL_INDEX_BTREE indicates a B-Tree index.
// 1 SQL_INDEX_CLUSTERED indicates a clustered index.
// ? SQL_INDEX_CONTENT indicates a content index.
// 2 SQL_INDEX_HASHED indicates a hashed index.
// 3 SQL_INDEX_OTHER indicates another type of index.
// 8. ORDINAL_POSITION SmallInt
// Column sequence number in index (starting with 1).
// 9. COLUMN_NAME VarChar
// Column name. If the column is based on an expression,
// such as SALARY + BENEFITS, the expression is returned.
// 10. ASC_OR_DESC Char(1)
// Sort sequence for the column: "A" for ascending; "D" for descending.
// 11. CARDINALITY Integer
// Number of rows in table if TYPE is SQL_TABLE_STAT.
// Number of unique values in the index if TYPE is not SQL_TABLE_STAT.
// 12. PAGES Integer
// Number of pages for the table if TYPE is SQL_TABLE_STAT.
// Number of pages for the index if TYPE is not SQL_TABLE_STAT.
// 13. FILTER_CONDITION VarChar
// If the index is a filtered index, this is the filter condition, such as 'SALARY > 30000'.
// Alternative column names:
// ODBC 2.0 column ODBC 3.x column
// TABLE_QUALIFIER TABLE_CAT
// TABLE_OWNER TABLE_SCHEM
// SEQ_IN_INDEX ORDINAL_POSITION
// COLLATION ASC_OR_DESC
// Sybase Advantage column names:
// QUALIFIERNAME,OWNERNAME,TABLENAME,NONUNIQUE
// INDEXQUALIFIERNAME,INDEXNAME,TYPE,SEQININDEX
// COLUMNNAME,COLLATION,CARDINALITY,PAGES,FILTER
//---------------------------------------------------------
String database = String.Empty, schema = String.Empty, tableName = String.Empty, indexQualifier = String.Empty, indexName = String.Empty, columnName = String.Empty, ascOrDesc = String.Empty, filterCondition = String.Empty;
bool unique = false, primary = false, clustered = false, nullable = false;
int indexType = 0;
short ordinalPos = 0;
int cardinality = 0, pages = 0;
foreach (DataColumn column in columnSchema.Columns)
{
String colName = column.ColumnName;
String value = row[colName].ToString();
if (colName.EqualsCI("TABLE_CAT") || colName.EqualsCI("TABLE_QUALIFIER") || colName.EqualsCI("QualifierName"))
database = value;
else if (colName.EqualsCI("TABLE_SCHEM") || colName.EqualsCI("TABLE_OWNER") || colName.EqualsCI("OwnerName"))
schema = value;
else if (colName.EqualsCI("TABLE_NAME") || colName.EqualsCI("TableName"))
tableName = value;
else if (colName.EqualsCI("NON_UNIQUE") || colName.EqualsCI("NONUNIQUE"))
unique = (value.ToShort() == 0);
else if (colName.EqualsCI("INDEX_QUALIFIER") || colName.EqualsCI("INDEXQUALIFIERNAME"))
indexQualifier = value;
else if (colName.EqualsCI("INDEX_NAME") || colName.EqualsCI("INDEXNAME"))
indexName = value;
else if (colName.EqualsCI("TYPE"))
indexType = value.ToInt();
else if (colName.EqualsCI("TYPE_DESC"))
{
if (value.EqualsCI("CLUSTERED"))
clustered = true;
}
else if (colName.EqualsCI("ORDINAL_POSITION") || colName.EqualsCI("SEQININDEX"))
ordinalPos = value.ToShort();
else if (colName.EqualsCI("Column_Name") || colName.EqualsCI("ColumnName"))
columnName = value;
else if (colName.EqualsCI("ASC_OR_DESC"))
ascOrDesc = value;
else if (colName.EqualsCI("CARDINALITY"))
cardinality = value.ToInt();
else if (colName.EqualsCI("PAGES"))
pages = value.ToInt();
else if (colName.EqualsCI("FILTER_CONDITION") || colName.EqualsCI("FILTER"))
filterCondition = value;
//else SaLogger.Debug(GetType().Name+".PopulateTableIndices Unrecognised Schema column name: "+colName);
//SaLogger.Debug(GetType().Name+".PopulateTableIndices Column name: " + colName+", Value="+value);
}
//-------------------------------------------------------
String debugIndex = "PK_SaAttrUpdate";
if (indexName.EqualsCI(debugIndex) && false)
{
/*
StockTracker Address table.
SQL:
Column: constraint_catalog. Value: SaStockTracker_Solent_STN
Column: constraint_schema. Value: dbo
Column: constraint_name. Value: PK_Address
Column: table_catalog. Value: SaStockTracker_Solent_STN
Column: table_schema. Value: dbo
Column: table_name. Value: Address
Column: index_name. Value: PK_Address
Column: type_desc. Value: CLUSTERED
ODBC:
Column: TABLE_CAT. Value: SaStockTracker_Solent_STN
Column: TABLE_SCHEM. Value: dbo
Column: TABLE_NAME. Value: Address
Column: NON_UNIQUE. Value: 0
Column: INDEX_QUALIFIER. Value: Address
Column: INDEX_NAME. Value: PK_Address
Column: TYPE. Value: 1
Column: ORDINAL_POSITION. Value: 1
Column: COLUMN_NAME. Value: Id
Column: ASC_OR_DESC. Value: A
Column: CARDINALITY. Value: 6
Column: PAGES. Value: 1
Column: FILTER_CONDITION. Value:
*/
foreach (DataColumn column in columnSchema.Columns)
{
String colName = column.ColumnName;
String value = row[colName].ToString();
SaLogger.Debug(debugIndex + " Column: " + colName + ". Value: " + value);
}
}
//-------------------------------------------------------
if (!StringUtil.IsEmpty(indexName))
{
//SaLogger.Debug(GetType().Name+".PopulateTableIndices Database=" + database + ", Schema=" + schema + ", Table=" + tableName + ", Index="+indexName+", Column=" + columnName);
// Retrieve index or populate if not found.
DbDfnIndex index = table.GetIndexByName(indexName);
if (index == null)
{
index = new DbDfnIndex(schema, tableName, indexName, unique);
index.IndexType = indexType;
index.Primary = primary;
index.Clustered = clustered;
index.Nullable = nullable;
index.Pages = pages;
index.UniqueValues = cardinality;
table.AddIndex(index);
}
// Add column to index:
if (!StringUtil.IsEmpty(columnName))
{
DbDfnIndexColumn indexColumn = new DbDfnIndexColumn(ordinalPos, columnName, (!ascOrDesc.EqualsCI("D")));
index.AddColumn(indexColumn);
}
}
}
}
// Attempt to retrieve included columns (SQL only).
SqlConnection sqlConnection = dbConnection as SqlConnection;
if (sqlConnection != null)
{
using (DataTable columnSchema = dbConnection.GetSchema("IndexColumns", restrictions))
{
foreach (DataRow row in columnSchema.Rows)
{
foreach (DataColumn column in columnSchema.Columns)
{
String colName = column.ColumnName;
String value = row[colName].ToString();
String constraintCatalog, constraintSchema, constraintName, tableCatalog, tableSchema, tableName, columnName, ordinalPosition, keyType, indexName;
#if DEBUG
//SaLogger.Trace(fn+" Column name=" + colName);
#endif
if (colName.EqualsCI("constraint_catalog"))
constraintCatalog = value;
else if (colName.EqualsCI("constraint_schema"))
constraintSchema = value;
else if (colName.EqualsCI("constraint_name"))
constraintName = value;
else if (colName.EqualsCI("table_catalog"))
tableCatalog = value;
else if (colName.EqualsCI("table_schema"))
tableSchema = value;
else if (colName.EqualsCI("table_name"))
tableName = value;
else if (colName.EqualsCI("column_name"))
columnName = value;
else if (colName.EqualsCI("ordinal_position"))
ordinalPosition = value;
else if (colName.EqualsCI("KeyType"))
keyType = value;
else if (colName.EqualsCI("index_name"))
indexName = value;
}
}
}
}
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,39 @@
using Sarand.Net.Standard.Base.Diary;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.Diary
{
//=======================================================================
public abstract class SaDiaryConsole_Dbas : SaDiaryConsole
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Static initialisation.
static SaDiaryConsole_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaDiaryConsole_Dbas (SacsDatabase database)
{
Database = database;
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return true; } }
public override bool CanUpdateDatabase { get { return true; } }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,258 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:58
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Interfaces.Internal
{
internal class SaInterfaceDataItem_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataInt32 _InterfaceId { get; } = new ColumnDataInt32("InterfaceId");
public ColumnDataInt16 _Direction { get; } = new ColumnDataInt16("Direction");
public ColumnDataString _ExternalRef { get; } = new ColumnDataString("ExternalRef");
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId");
public ColumnDataString _ProcessStatus { get; } = new ColumnDataString("ProcessStatus");
public ColumnDataInt32 _ProcessStatusBy { get; } = new ColumnDataInt32("ProcessStatusBy");
public ColumnDataDateTime _ProcessStatusAt { get; } = new ColumnDataDateTime("ProcessStatusAt");
public ColumnDataString _ItemStatus { get; } = new ColumnDataString("ItemStatus");
public ColumnDataInt32 _ItemStatusBy { get; } = new ColumnDataInt32("ItemStatusBy");
public ColumnDataDateTime _ItemStatusAt { get; } = new ColumnDataDateTime("ItemStatusAt");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"InterfaceId",
"Direction",
"ExternalRef",
"ItemType",
"ItemId",
"ProcessStatus",
"ProcessStatusBy",
"ProcessStatusAt",
"ItemStatus",
"ItemStatusBy",
"ItemStatusAt",
"Notes",
"Flags",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Context",
"Category",
"Type",
"InterfaceId",
};
//-------------------------------------------------------------------
// Construction.
internal SaInterfaceDataItem_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get { return GetActualTableName("SaInterfaceDataItem"); } }
public override List<String> AlternativeTableNames { get; } = new List<string>() { "InterfaceDataItem" };
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int32 _InterfaceId { get { return Cols._InterfaceId.Value; } set { Cols._InterfaceId.Value = value; } }
public Int16 _Direction { get { return Cols._Direction.Value; } set { Cols._Direction.Value = value; } }
public String _ExternalRef { get { return Cols._ExternalRef.Value; } set { Cols._ExternalRef.Value = value; } }
public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } }
public Int32 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } }
public String _ProcessStatus { get { return Cols._ProcessStatus.Value; } set { Cols._ProcessStatus.Value = value; } }
public Int32 _ProcessStatusBy { get { return Cols._ProcessStatusBy.Value; } set { Cols._ProcessStatusBy.Value = value; } }
public DateTime _ProcessStatusAt { get { return Cols._ProcessStatusAt.Value; } set { Cols._ProcessStatusAt.Value = value; } }
public String _ItemStatus { get { return Cols._ItemStatus.Value; } set { Cols._ItemStatus.Value = value; } }
public Int32 _ItemStatusBy { get { return Cols._ItemStatusBy.Value; } set { Cols._ItemStatusBy.Value = value; } }
public DateTime _ItemStatusAt { get { return Cols._ItemStatusAt.Value; } set { Cols._ItemStatusAt.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_InterfaceId = GetFieldInt32(dbDataReader, "InterfaceId", _InterfaceId);
_Direction = GetFieldInt16(dbDataReader, "Direction", _Direction);
_ExternalRef = GetFieldString(dbDataReader, "ExternalRef", _ExternalRef);
_ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType);
_ItemId = GetFieldInt32(dbDataReader, "ItemId", _ItemId);
_ProcessStatus = GetFieldString(dbDataReader, "ProcessStatus", _ProcessStatus);
_ProcessStatusBy = GetFieldInt32(dbDataReader, "ProcessStatusBy", _ProcessStatusBy);
_ProcessStatusAt = GetFieldDateTime(dbDataReader, "ProcessStatusAt", _ProcessStatusAt);
_ItemStatus = GetFieldString(dbDataReader, "ItemStatus", _ItemStatus);
_ItemStatusBy = GetFieldInt32(dbDataReader, "ItemStatusBy", _ItemStatusBy);
_ItemStatusAt = GetFieldDateTime(dbDataReader, "ItemStatusAt", _ItemStatusAt);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("InterfaceId")) AddCommandParameter(dbCommand, "@InterfaceId", _InterfaceId);
if (columnNames.ContainsCI("Direction")) AddCommandParameter(dbCommand, "@Direction", _Direction);
if (columnNames.ContainsCI("ExternalRef")) AddCommandParameter(dbCommand, "@ExternalRef", _ExternalRef);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("ProcessStatus")) AddCommandParameter(dbCommand, "@ProcessStatus", _ProcessStatus);
if (columnNames.ContainsCI("ProcessStatusBy")) AddCommandParameter(dbCommand, "@ProcessStatusBy", _ProcessStatusBy);
if (columnNames.ContainsCI("ProcessStatusAt")) AddCommandParameter(dbCommand, "@ProcessStatusAt", _ProcessStatusAt);
if (columnNames.ContainsCI("ItemStatus")) AddCommandParameter(dbCommand, "@ItemStatus", _ItemStatus);
if (columnNames.ContainsCI("ItemStatusBy")) AddCommandParameter(dbCommand, "@ItemStatusBy", _ItemStatusBy);
if (columnNames.ContainsCI("ItemStatusAt")) AddCommandParameter(dbCommand, "@ItemStatusAt", _ItemStatusAt);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Direction")) AddCommandParameter(dbCommand, "@Direction", _Direction);
if (columnNames.ContainsCI("ExternalRef")) AddCommandParameter(dbCommand, "@ExternalRef", _ExternalRef);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("ProcessStatus")) AddCommandParameter(dbCommand, "@ProcessStatus", _ProcessStatus);
if (columnNames.ContainsCI("ProcessStatusBy")) AddCommandParameter(dbCommand, "@ProcessStatusBy", _ProcessStatusBy);
if (columnNames.ContainsCI("ProcessStatusAt")) AddCommandParameter(dbCommand, "@ProcessStatusAt", _ProcessStatusAt);
if (columnNames.ContainsCI("ItemStatus")) AddCommandParameter(dbCommand, "@ItemStatus", _ItemStatus);
if (columnNames.ContainsCI("ItemStatusBy")) AddCommandParameter(dbCommand, "@ItemStatusBy", _ItemStatusBy);
if (columnNames.ContainsCI("ItemStatusAt")) AddCommandParameter(dbCommand, "@ItemStatusAt", _ItemStatusAt);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,211 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:58
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Interfaces.Internal
{
internal class SaInterfaceProcessDataItem_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _ProcessId { get; } = new ColumnDataInt32("ProcessId");
public ColumnDataInt32 _InterfaceDataItemId { get; } = new ColumnDataInt32("InterfaceDataItemId");
public ColumnDataString _ItemData { get; } = new ColumnDataString("ItemData");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"ProcessId",
"InterfaceDataItemId",
"ItemData",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"ProcessId",
"InterfaceDataItemId",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Context",
"Category",
"Type",
"InterfaceId",
"Direction",
"Reference",
"Sequence",
"ProcessId",
"InterfaceDataItemId",
};
//-------------------------------------------------------------------
// Construction.
internal SaInterfaceProcessDataItem_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get { return GetActualTableName("SaInterfaceProcessDataItem"); } }
public override List<String> AlternativeTableNames { get; } = new List<string>() { "InterfaceProcessDataItem" };
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _ProcessId { get { return Cols._ProcessId.Value; } set { Cols._ProcessId.Value = value; } }
public Int32 _InterfaceDataItemId { get { return Cols._InterfaceDataItemId.Value; } set { Cols._InterfaceDataItemId.Value = value; } }
public String _ItemData { get { return Cols._ItemData.Value; } set { Cols._ItemData.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_ProcessId = GetFieldInt32(dbDataReader, "ProcessId", _ProcessId);
_InterfaceDataItemId = GetFieldInt32(dbDataReader, "InterfaceDataItemId", _InterfaceDataItemId);
_ItemData = GetFieldString(dbDataReader, "ItemData", _ItemData);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ProcessId")) AddCommandParameter(dbCommand, "@ProcessId", _ProcessId);
if (columnNames.ContainsCI("InterfaceDataItemId")) AddCommandParameter(dbCommand, "@InterfaceDataItemId", _InterfaceDataItemId);
if (columnNames.ContainsCI("ItemData")) AddCommandParameter(dbCommand, "@ItemData", _ItemData);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE ProcessId=@ProcessId AND InterfaceDataItemId=@InterfaceDataItemId;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE ProcessId=? AND InterfaceDataItemId=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ItemData")) AddCommandParameter(dbCommand, "@ItemData", _ItemData);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@ProcessId", _ProcessId);
AddCommandParameter(dbCommand, "@InterfaceDataItemId", _InterfaceDataItemId);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,238 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:58
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Interfaces.Internal
{
internal class SaInterfaceProcessMessage_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataInt32 _ProcessId { get; } = new ColumnDataInt32("ProcessId");
public ColumnDataString _MsgType { get; } = new ColumnDataString("MsgType");
public ColumnDataString _Msg { get; } = new ColumnDataString("Msg");
public ColumnDataString _FileName { get; } = new ColumnDataString("FileName");
public ColumnDataInt32 _LineNumber { get; } = new ColumnDataInt32("LineNumber");
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"ProcessId",
"MsgType",
"Msg",
"FileName",
"LineNumber",
"ItemType",
"ItemId",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Context",
"Category",
"Type",
"InterfaceId",
"Direction",
"Reference",
"Sequence",
"ProcessId",
};
//-------------------------------------------------------------------
// Construction.
internal SaInterfaceProcessMessage_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get { return GetActualTableName("SaInterfaceProcessMessage"); } }
public override List<String> AlternativeTableNames { get; } = new List<string>() { "InterfaceProcessMessage" };
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int32 _ProcessId { get { return Cols._ProcessId.Value; } set { Cols._ProcessId.Value = value; } }
public String _MsgType { get { return Cols._MsgType.Value; } set { Cols._MsgType.Value = value; } }
public String _Msg { get { return Cols._Msg.Value; } set { Cols._Msg.Value = value; } }
public String _FileName { get { return Cols._FileName.Value; } set { Cols._FileName.Value = value; } }
public Int32 _LineNumber { get { return Cols._LineNumber.Value; } set { Cols._LineNumber.Value = value; } }
public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } }
public Int32 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_ProcessId = GetFieldInt32(dbDataReader, "ProcessId", _ProcessId);
_MsgType = GetFieldString(dbDataReader, "MsgType", _MsgType);
_Msg = GetFieldString(dbDataReader, "Msg", _Msg);
_FileName = GetFieldString(dbDataReader, "FileName", _FileName);
_LineNumber = GetFieldInt32(dbDataReader, "LineNumber", _LineNumber);
_ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType);
_ItemId = GetFieldInt32(dbDataReader, "ItemId", _ItemId);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("ProcessId")) AddCommandParameter(dbCommand, "@ProcessId", _ProcessId);
if (columnNames.ContainsCI("MsgType")) AddCommandParameter(dbCommand, "@MsgType", _MsgType);
if (columnNames.ContainsCI("Msg")) AddCommandParameter(dbCommand, "@Msg", _Msg);
if (columnNames.ContainsCI("FileName")) AddCommandParameter(dbCommand, "@FileName", _FileName);
if (columnNames.ContainsCI("LineNumber")) AddCommandParameter(dbCommand, "@LineNumber", _LineNumber);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("MsgType")) AddCommandParameter(dbCommand, "@MsgType", _MsgType);
if (columnNames.ContainsCI("Msg")) AddCommandParameter(dbCommand, "@Msg", _Msg);
if (columnNames.ContainsCI("FileName")) AddCommandParameter(dbCommand, "@FileName", _FileName);
if (columnNames.ContainsCI("LineNumber")) AddCommandParameter(dbCommand, "@LineNumber", _LineNumber);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,242 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:58
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Interfaces.Internal
{
internal class SaInterfaceProcess_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataInt32 _InterfaceId { get; } = new ColumnDataInt32("InterfaceId");
public ColumnDataInt16 _Direction { get; } = new ColumnDataInt16("Direction");
public ColumnDataString _ProcRef { get; } = new ColumnDataString("ProcRef");
public ColumnDataInt32 _ProcSeq { get; } = new ColumnDataInt32("ProcSeq");
public ColumnDataDateTime _ProcessAt { get; } = new ColumnDataDateTime("ProcessAt");
public ColumnDataDateTime _BatchAt { get; } = new ColumnDataDateTime("BatchAt");
public ColumnDataInt32 _ElapseSecs { get; } = new ColumnDataInt32("ElapseSecs");
public ColumnDataInt32 _ItemCount { get; } = new ColumnDataInt32("ItemCount");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
protected static List<String> fields { get; } = new List<String>()
{
"Id",
"InterfaceId",
"Direction",
"ProcRef",
"ProcSeq",
"ProcessAt",
"BatchAt",
"ElapseSecs",
"ItemCount",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
protected static List<String> fieldsId { get; } = new List<String>()
{
};
protected static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
protected static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Context",
"Category",
"Type",
"InterfaceId",
"Direction",
"Reference",
"Sequence",
};
//-------------------------------------------------------------------
// Construction.
internal SaInterfaceProcess_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get { return GetActualTableName("SaInterfaceProcess"); } }
public override List<String> AlternativeTableNames { get; } = new List<string>() { "InterfaceProcess" };
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int32 _InterfaceId { get { return Cols._InterfaceId.Value; } set { Cols._InterfaceId.Value = value; } }
public Int16 _Direction { get { return Cols._Direction.Value; } set { Cols._Direction.Value = value; } }
public String _ProcRef { get { return Cols._ProcRef.Value; } set { Cols._ProcRef.Value = value; } }
public Int32 _ProcSeq { get { return Cols._ProcSeq.Value; } set { Cols._ProcSeq.Value = value; } }
public DateTime _ProcessAt { get { return Cols._ProcessAt.Value; } set { Cols._ProcessAt.Value = value; } }
public DateTime _BatchAt { get { return Cols._BatchAt.Value; } set { Cols._BatchAt.Value = value; } }
public Int32 _ElapseSecs { get { return Cols._ElapseSecs.Value; } set { Cols._ElapseSecs.Value = value; } }
public Int32 _ItemCount { get { return Cols._ItemCount.Value; } set { Cols._ItemCount.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_InterfaceId = GetFieldInt32(dbDataReader, "InterfaceId", _InterfaceId);
_Direction = GetFieldInt16(dbDataReader, "Direction", _Direction);
_ProcRef = GetFieldString(dbDataReader, "ProcRef", _ProcRef);
_ProcSeq = GetFieldInt32(dbDataReader, "ProcSeq", _ProcSeq);
_ProcessAt = GetFieldDateTime(dbDataReader, "ProcessAt", _ProcessAt);
_BatchAt = GetFieldDateTime(dbDataReader, "BatchAt", _BatchAt);
_ElapseSecs = GetFieldInt32(dbDataReader, "ElapseSecs", _ElapseSecs);
_ItemCount = GetFieldInt32(dbDataReader, "ItemCount", _ItemCount);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("InterfaceId")) AddCommandParameter(dbCommand, "@InterfaceId", _InterfaceId);
if (columnNames.ContainsCI("Direction")) AddCommandParameter(dbCommand, "@Direction", _Direction);
if (columnNames.ContainsCI("ProcRef")) AddCommandParameter(dbCommand, "@ProcRef", _ProcRef);
if (columnNames.ContainsCI("ProcSeq")) AddCommandParameter(dbCommand, "@ProcSeq", _ProcSeq);
if (columnNames.ContainsCI("ProcessAt")) AddCommandParameter(dbCommand, "@ProcessAt", _ProcessAt);
if (columnNames.ContainsCI("BatchAt")) AddCommandParameter(dbCommand, "@BatchAt", _BatchAt);
if (columnNames.ContainsCI("ElapseSecs")) AddCommandParameter(dbCommand, "@ElapseSecs", _ElapseSecs);
if (columnNames.ContainsCI("ItemCount")) AddCommandParameter(dbCommand, "@ItemCount", _ItemCount);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ProcRef")) AddCommandParameter(dbCommand, "@ProcRef", _ProcRef);
if (columnNames.ContainsCI("ProcSeq")) AddCommandParameter(dbCommand, "@ProcSeq", _ProcSeq);
if (columnNames.ContainsCI("ProcessAt")) AddCommandParameter(dbCommand, "@ProcessAt", _ProcessAt);
if (columnNames.ContainsCI("BatchAt")) AddCommandParameter(dbCommand, "@BatchAt", _BatchAt);
if (columnNames.ContainsCI("ElapseSecs")) AddCommandParameter(dbCommand, "@ElapseSecs", _ElapseSecs);
if (columnNames.ContainsCI("ItemCount")) AddCommandParameter(dbCommand, "@ItemCount", _ItemCount);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,225 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:58
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Interfaces.Internal
{
internal class SaInterface_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataString _Context { get; } = new ColumnDataString("Context");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataInt16 _Category { get; } = new ColumnDataInt16("Category");
public ColumnDataInt16 _Type { get; } = new ColumnDataInt16("Type");
public ColumnDataString _Caption { get; } = new ColumnDataString("Caption");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Context",
"Code",
"Category",
"Type",
"Caption",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Context",
"Category",
"Type",
};
//-------------------------------------------------------------------
// Construction.
internal SaInterface_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get { return GetActualTableName("SaInterface"); } }
public override List<String> AlternativeTableNames { get; } = new List<string>() { "Interface" };
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public String _Context { get { return Cols._Context.Value; } set { Cols._Context.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public Int16 _Category { get { return Cols._Category.Value; } set { Cols._Category.Value = value; } }
public Int16 _Type { get { return Cols._Type.Value; } set { Cols._Type.Value = value; } }
public String _Caption { get { return Cols._Caption.Value; } set { Cols._Caption.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Context = GetFieldString(dbDataReader, "Context", _Context);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_Category = GetFieldInt16(dbDataReader, "Category", _Category);
_Type = GetFieldInt16(dbDataReader, "Type", _Type);
_Caption = GetFieldString(dbDataReader, "Caption", _Caption);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Context")) AddCommandParameter(dbCommand, "@Context", _Context);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Category")) AddCommandParameter(dbCommand, "@Category", _Category);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("Caption")) AddCommandParameter(dbCommand, "@Caption", _Caption);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Caption")) AddCommandParameter(dbCommand, "@Caption", _Caption);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,364 @@
using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
public abstract class SaInterfaceConsole_Dbas : SaInterfaceConsole
{
//-------------------------------------------------------------------
// Data members.
private SaInterfaceMgr_Dbas interfaceMgr = null;
//-------------------------------------------------------------------
// Static initialisation.
static SaInterfaceConsole_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaInterfaceConsole_Dbas (SacsDatabase database)
{
Database = database;
interfaceMgr = new SaInterfaceMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return interfaceMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return interfaceMgr.CanUpdateDatabase; } }
//-------------------------------------------------------------------
// M a n a g e I n t e r f a c e s
//-------------------------------------------------------------------
// Manage interfaces - returns true if changes made.
public override bool ManageInterfaces (String interfaceContext, bool userCanManageInterfaces, bool userCanProcessInterfaces, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
MaintainInterfacesFn?.Invoke(this, interfaceContext, userCanManageInterfaces, userCanProcessInterfaces, dbUpdateInfo);
return false;
}
// Method to display Interface management dialog.
protected delegate bool MaintainInterfacesFunction (SaInterfaceConsole codeTypeConsole, String interfaceContext, bool userCanManageInterfaces, bool userCanProcessInterfaces, DbUpdateInfo dbUpdateInfo);
protected abstract MaintainInterfacesFunction MaintainInterfacesFn { get; }
//-------------------------------------------------------------------
// I n t e r f a c e M a n a g e m e n t
//-------------------------------------------------------------------
// Interface management.
public override SysId CreateInterface (String context, SaInterfaceCategory interfaceCategory, short interfaceType, String code, String caption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaInterface interfaceObj = interfaceMgr.CreateInterface(context,interfaceCategory,interfaceType);
interfaceObj.Code = code;
interfaceObj.Caption = caption;
if (!interfaceMgr.InsertInterface(interfaceObj,dbUpdateInfo))
{
SetErrorState(interfaceMgr.ErrorStateMessage);
return null;
}
return interfaceObj.Id;
}
// Clear configuration options, data items, processes etc.
public override bool ClearDependentData (SaInterface interfaceObj, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
throw new NotImplementedException();
//return !HasErrorState();
}
//---------------------------------------------------------------
// Retrieve interfaces.
public override SaInterface GetInterface (SaInterface.Params prmInterface)
{
return interfaceMgr.GetInterface(prmInterface);
}
public override SaInterface GetInterfaceById (SysId interfaceId)
{
return interfaceMgr.GetInterfaceById(interfaceId);
}
public override List<SaInterface> GetInterfaceList (SaInterface.Params prmInterface)
{
return interfaceMgr.GetInterfaceList(prmInterface);
}
//---------------------------------------------------------------
// Conversion between Interface Category & Type and the equivalent database Id (if only one exists).
public override SysId GetInterfaceIdForContextCategoryType (String context, SaInterfaceCategory interfaceCategory, short interfaceType)
{
ClearErrorState();
SaInterface.Params prmInterface = new SaInterface.Params();
prmInterface.Context = context;
prmInterface.InterfaceCategory = interfaceCategory;
prmInterface.IncludedInterfaceTypes.Add(interfaceType);
prmInterface.ActiveOnly = false;
prmInterface.StatusCat = SaInterface.StatusCat.Any;
SaInterface interfaceObj = interfaceMgr.GetInterface(prmInterface);
if (interfaceObj != null)
return interfaceObj.Id;
return null;
}
// Conversion between Interface Category & Code and the equivalent database Id (if only one exists).
public override SysId GetInterfaceIdForContextCategoryCode (String context, SaInterfaceCategory interfaceCategory, String code)
{
ClearErrorState();
SaInterface.Params prmInterface = new SaInterface.Params();
prmInterface.Context = context;
prmInterface.InterfaceCategory = interfaceCategory;
prmInterface.Code = code;
prmInterface.ActiveOnly = false;
prmInterface.StatusCat = SaInterface.StatusCat.Any;
SaInterface interfaceObj = interfaceMgr.GetInterface(prmInterface);
if (interfaceObj != null)
return interfaceObj.Id;
return null;
}
public override SaInterfaceCategory GetCategoryForInterfaceId (SysId interfaceId)
{
SaInterface interfaceObj = interfaceMgr.GetInterfaceById(interfaceId);
if (interfaceObj != null)
return interfaceObj.Category;
return SaInterfaceCategory.Unknown;
}
public override String GetCodeForInterfaceId (SysId interfaceId)
{
SaInterface interfaceObj = interfaceMgr.GetInterfaceById(interfaceId);
if (interfaceObj != null)
return interfaceObj.Code;
return String.Empty;
}
//---------------------------------------------------------------
// I n t e r f a c e P r o c e s s e s
//---------------------------------------------------------------
// Identify the highest sequence currently in use for an interface.
public override int GetMaxProcessSequence (SysId interfaceId, SaInterfaceProcessDirection processDirection, bool completedOnly = true)
{
ClearErrorState();
int sequence = interfaceMgr.GetMaxProcessSequenceForInterface(interfaceId, processDirection);
if (interfaceMgr.HasErrorState())
SetErrorState(interfaceMgr.ErrorStateMessage);
return sequence;
}
//---------------------------------------------------------------
// Create new process and imediately store details on database (status set to 'In Progress').
public override SaInterfaceProcess StartInterfaceProcess (SysId interfaceId, SaInterfaceProcessDirection eDirection, String batchRef, DateTime batchAt, int sequence, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!interfaceMgr.InterfaceExistsById(interfaceId))
{
SetErrorState("Unable to create process - interface does not exist");
return null;
}
SaInterfaceProcess interfaceProcess = interfaceMgr.CreateInterfaceProcess(interfaceId, eDirection, batchRef, sequence);
interfaceProcess.ProcessAt = DateTime.Now;
interfaceProcess.BatchAt = batchAt;
interfaceProcess.Status = SaStatus.InProgress;
if (!interfaceMgr.InsertInterfaceProcess(interfaceProcess,dbUpdateInfo))
{
interfaceProcess = null;
SetErrorState(interfaceMgr.ErrorStateMessage);
}
return interfaceProcess;
}
//---------------------------------------------------------------
// Retrieve a process using its identity (restricted by interface).
public override SaInterfaceProcess GetInterfaceProcess (SysId interfaceId, SysId interfaceProcessId)
{
ClearErrorState();
SaInterfaceProcess interfaceProcess = interfaceMgr.GetInterfaceProcessById(interfaceProcessId);
if (interfaceMgr.HasErrorState())
{
SetErrorState(interfaceMgr.ErrorStateMessage);
interfaceProcess = null;
}
if (interfaceProcess != null && !interfaceProcess.InterfaceId.Equals(interfaceId))
{
SetErrorState("Process does not match interface");
interfaceProcess = null;
}
return interfaceProcess;
}
//---------------------------------------------------------------
// Update the details for a process.
public override bool StoreInterfaceProcess (SaInterfaceProcess interfaceProcess, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!SysId.IsValid(interfaceProcess.Id))
{
// Insert interface process.
if (!interfaceMgr.InsertInterfaceProcess(interfaceProcess, dbUpdateInfo))
return SetErrorState("Failed to insert process - "+interfaceMgr.ErrorStateMessage);
}
else
{
// Update interface process.
if (!interfaceMgr.UpdateInterfaceProcess(interfaceProcess, dbUpdateInfo))
return SetErrorState("Failed to update process - " + interfaceMgr.ErrorStateMessage);
}
return !HasErrorState();
}
//---------------------------------------------------------------
// I n t e r f a c e P r o c e s s M e s s a g e s
//---------------------------------------------------------------
public override bool LogInterfaceProcessMessage (SysId interfaceProcessId, DbUpdateInfo dbUpdateInfo, String message, SaMessageLevel messageLevel = SaMessageLevel.Info, String filename = "", int lineNumber = 0, ItemId itemId = null)
{
ClearErrorState();
if (!interfaceMgr.InterfaceProcessExistsById(interfaceProcessId)) return SetErrorState("Invalid interface process id supplied");
if (StringUtil.IsEmpty(message)) return true;
// Create and store process message.
SaInterfaceProcessMessage interfaceProcessMessage = interfaceMgr.CreateInterfaceProcessMessage(interfaceProcessId);
interfaceProcessMessage.Message = message;
interfaceProcessMessage.Level = messageLevel;
interfaceProcessMessage.Filename = filename;
interfaceProcessMessage.LineNumber = lineNumber;
interfaceProcessMessage.ItemId = itemId;
if (!interfaceMgr.InsertInterfaceProcessMessage(interfaceProcessMessage, dbUpdateInfo))
return SetErrorState(interfaceMgr.ErrorStateMessage);
return !HasErrorState();
}
//---------------------------------------------------------------
// I n t e r f a c e D a t a I t e m s
//---------------------------------------------------------------
public override bool ItemHasDataItems (ItemId itemId)
{
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.IncludedItemIds.Add(itemId);
return (interfaceMgr.GetInterfaceDataItemCount(prmInterfaceDataItem) > 0);
}
public override bool InterfaceDataItemExistsByRef (SysId interfaceId, SaInterfaceProcessDirection processDirection, short itemType, String externalReference)
{
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.InterfaceId = interfaceId;
prmInterfaceDataItem.Direction = processDirection;
prmInterfaceDataItem.ItemType = itemType;
prmInterfaceDataItem.ExternalReference = externalReference;
return (interfaceMgr.GetInterfaceDataItemCount(prmInterfaceDataItem) > 0);
}
public override SaInterfaceDataItem CreateInterfaceDataItem (SysId interfaceId, SaInterfaceProcessDirection processDirection, ItemId itemId, String externalReference)
{
ClearErrorState();
return interfaceMgr.CreateInterfaceDataItem(interfaceId, processDirection, itemId, externalReference);
}
public override SaInterfaceDataItem GetInterfaceDataItem (SysId interfaceDataItemId)
{
ClearErrorState();
return interfaceMgr.GetInterfaceDataItemById(interfaceDataItemId);
}
public override SaInterfaceDataItem GetInterfaceDataItemByItemRef (SysId interfaceId, SaInterfaceProcessDirection processDirection, ItemId itemId, String externalReference)
{
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.InterfaceId = interfaceId;
prmInterfaceDataItem.Direction = processDirection;
prmInterfaceDataItem.IncludedItemIds.Add(itemId);
prmInterfaceDataItem.ExternalReference = externalReference;
return interfaceMgr.GetInterfaceDataItem(prmInterfaceDataItem);
}
public override SaInterfaceDataItem GetInterfaceDataItemByRef (SysId interfaceId, SaInterfaceProcessDirection processDirection, short itemType, String externalReference)
{
// Fails if more than 1 matching data item.
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.InterfaceId = interfaceId;
prmInterfaceDataItem.Direction = processDirection;
prmInterfaceDataItem.ItemType = itemType;
prmInterfaceDataItem.ExternalReference = externalReference;
return interfaceMgr.GetInterfaceDataItem(prmInterfaceDataItem);
}
public override SaInterfaceDataItem GetInterfaceDataItemByItem (SysId interfaceId, SaInterfaceProcessDirection processDirection, ItemId itemId)
{
// Fails if more than 1 matching data item.
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.InterfaceId = interfaceId;
prmInterfaceDataItem.Direction = processDirection;
prmInterfaceDataItem.IncludedItemIds.Add(itemId);
return interfaceMgr.GetInterfaceDataItem(prmInterfaceDataItem);
}
public override List<SaInterfaceDataItem> GetInterfaceDataItemsByItem (SysId interfaceId, SaInterfaceProcessDirection processDirection, ItemId itemId)
{
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.InterfaceId = interfaceId;
prmInterfaceDataItem.Direction = processDirection;
prmInterfaceDataItem.IncludedItemIds.Add(itemId);
return interfaceMgr.GetInterfaceDataItemList(prmInterfaceDataItem);
}
public override List<SaInterfaceDataItem> GetInterfaceDataItemsByRef (SysId interfaceId, SaInterfaceProcessDirection processDirection, short itemType, String externalReference)
{
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.InterfaceId = interfaceId;
prmInterfaceDataItem.Direction = processDirection;
prmInterfaceDataItem.ItemType = itemType;
prmInterfaceDataItem.ExternalReference = externalReference;
return interfaceMgr.GetInterfaceDataItemList(prmInterfaceDataItem);
}
public override bool StoreInterfaceDataItem (SaInterfaceDataItem interfaceDataItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (interfaceDataItem == null) return SetErrorState("data item must be supplied");
if (!SysId.IsValid(interfaceDataItem.Id))
{
if (!interfaceMgr.InsertInterfaceDataItem(interfaceDataItem, dbUpdateInfo))
return SetErrorState(interfaceMgr.ErrorStateMessage);
}
else
{
if (!interfaceMgr.UpdateInterfaceDataItem(interfaceDataItem, dbUpdateInfo))
return SetErrorState(interfaceMgr.ErrorStateMessage);
}
return true;
}
public override bool StoreInterfaceDataItems (List<SaInterfaceDataItem> interfaceDataItems, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
foreach (SaInterfaceDataItem interfaceDataItem in interfaceDataItems)
{
StoreInterfaceDataItem(interfaceDataItem, dbUpdateInfo);
if (HasErrorState()) return false;
}
return true;
}
public override bool ClearInterfaceDataItem (SaInterfaceDataItem interfaceDataItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!interfaceMgr.DeleteInterfaceDataItem(interfaceDataItem, dbUpdateInfo))
return SetErrorState(interfaceMgr.ErrorStateMessage);
return true;
}
public override bool ClearInterfaceDataItems (ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaInterfaceDataItem.Params prmInterfaceDataItem = new SaInterfaceDataItem.Params();
prmInterfaceDataItem.IncludedItemIds.Add(itemId);
foreach (SaInterfaceDataItem interfaceDataItem in interfaceMgr.GetInterfaceDataItemList(prmInterfaceDataItem))
{
if (!ClearInterfaceDataItem(interfaceDataItem, dbUpdateInfo))
return SetErrorState(interfaceMgr.ErrorStateMessage);
}
return true;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,22 @@
using System;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Interfaces;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
internal class SaInterfaceDataItem_Dbas : SaInterfaceDataItem
{
//-------------------------------------------------------------------
// Construction.
public SaInterfaceDataItem_Dbas (SysId id, SysId interfaceId, SaInterfaceProcessDirection direction, ItemId itemId, String externalReference, ushort flags) :
base(id, interfaceId, direction, itemId, externalReference)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,122 @@
using System;
using System.IO;
using System.Reflection;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.Interface
{
//=======================================================================
public static class SaInterfaceDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand Interface Module database definition generator";
//private static String dbConnectionString = "Driver={SQL Server Native Client 11.0};Server=Sarand106\\SQL2014;Database=SaStockTracker_Solent_STN;Trusted_Connection=Yes;MARS_Connection=yes;";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate (String connectionString)
{
String fn = nameof(SaInterfaceDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition (SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory,
};
// Schema - Tables.
config.Schema.Tables_Included.AddRange(new String[] { "SaInterface", "SaInterfaceProcess", "SaInterfaceProcessMessage", "SaInterfaceDataItem", "SaInterfaceProcessDataItem" });
config.Schema.Tables_Excluded.AddRange(new String[] { });
config.Schema.AddAlternativeTableName("SaInterface", "Interface");
config.Schema.AddAlternativeTableName("SaInterfaceProcess", "InterfaceProcess");
config.Schema.AddAlternativeTableName("SaInterfaceProcessMessage", "InterfaceProcessMessage");
config.Schema.AddAlternativeTableName("SaInterfaceDataItem", "InterfaceDataItem");
config.Schema.AddAlternativeTableName("SaInterfaceProcessDataItem", "InterfaceProcessDataItem");
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("SaInterface", "Context,Category,Type");
config.Schema.InsertOnlyColumns.Add("SaInterfaceProcess", "InterfaceId,Direction,Reference,Sequence");
config.Schema.InsertOnlyColumns.Add("SaInterfaceProcessMessage", "ProcessId");
config.Schema.InsertOnlyColumns.Add("SaInterfaceDataItem", "InterfaceId");
config.Schema.InsertOnlyColumns.Add("SaInterfaceProcessDataItem", "ProcessId,InterfaceDataItemId");
// Database Definition class.
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.Interfaces";
config.DefinitionClass.Classname = "SaInterfaceDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.Interfaces.Internal";
config.TableClass.MandatoryConstructorDbInfo = true;
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder ()
{
String fn = nameof(SaInterfaceDbDfnGenerator) + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof (DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug(fn + " Assembly folder: " + directory);
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\Interfaces\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "Interfaces";
SaLogger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,13 @@
using Sarand.Net.Standard.Base.Interfaces;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
internal static class SaInterfaceInternal
{
internal static SaInterfaceMgr CreateInterfaceMgr (this SaInterfaceConsole codeTypeConsole)
{
if (!(codeTypeConsole is SaInterfaceConsole_Dbas)) return null;
return new SaInterfaceMgr_Dbas((SaInterfaceConsole_Dbas)codeTypeConsole);
}
}
}
@@ -0,0 +1,618 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
public partial class SaInterfaceMgr_Dbas
{
//*******************************************************************
// I n t e r f a c e D a t a I t e m s
//*******************************************************************
// Create Item.
public override SaInterfaceDataItem CreateInterfaceDataItem (SysId interfaceId, SaInterfaceProcessDirection direction, ItemId itemId, String externalReference)
{
return new SaInterfaceDataItem_Dbas(null, interfaceId, direction, itemId, externalReference, 0);
}
private SaInterfaceDataItem CreateInterfaceDataItem (SaInterfaceDataItem_Db dbInterfaceDataItem)
{
ClearErrorState();
SaInterfaceDataItem interfaceDataItem = new SaInterfaceDataItem_Dbas(new SysId(dbInterfaceDataItem._Id), new SysId(dbInterfaceDataItem._InterfaceId), (SaInterfaceProcessDirection)dbInterfaceDataItem._Direction, new ItemId(dbInterfaceDataItem._ItemType, new SysId(dbInterfaceDataItem._ItemId)), dbInterfaceDataItem._ExternalRef, (ushort)dbInterfaceDataItem._Flags);
PopulateFrom(dbInterfaceDataItem, interfaceDataItem);
return interfaceDataItem;
}
private SaInterfaceDataItem CreateInterfaceDataItem (DbDataReader dataReader)
{
SaInterfaceDataItem_Db dbInterfaceDataItem = new SaInterfaceDataItem_Db(DbInfo);
dbInterfaceDataItem.PopulateFrom(dataReader);
return CreateInterfaceDataItem(dbInterfaceDataItem);
}
//-------------------------------------------------------------------
// Item exists.
public override bool InterfaceDataItemExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetInterfaceDataItemCount(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Id, aliasInterfaceDataItem) + "=" + SysId.ToString(id)) == 1;
}
//-------------------------------------------------------------------
// Get Item.
public override SaInterfaceDataItem GetInterfaceDataItem (SaInterfaceDataItem.Params prm)
{
return GetInterfaceDataItem(GetInterfaceDataItemQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaInterfaceDataItem GetInterfaceDataItem (String filter)
{
ClearErrorState();
if (GetInterfaceDataItemCount(filter) != 1) return null;
SaInterfaceDataItem interfaceProcessDataItem = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterfaceDataItem_Db dbInterfaceDataItem = new SaInterfaceDataItem_Db(DbInfo);
dbInterfaceDataItem.PopulateFrom(dbCommand, aliasInterfaceDataItem, filter);
interfaceProcessDataItem = CreateInterfaceDataItem(dbInterfaceDataItem);
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterfaceDataItem\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaceProcessDataItem;
}
public override SaInterfaceDataItem GetInterfaceDataItemById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetInterfaceDataItem("Id=" + SysId.ToString(id));
}
//-------------------------------------------------------------------
// Validate Item properties.
public override bool IsValidInterfaceDataItemData (SaInterfaceDataItem.Data interfaceData, SaInterfaceDataItem.ErrField errField)
{
ClearErrorState();
if (!base.IsValidInterfaceDataItemData(interfaceData, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Item.
public override bool InsertInterfaceDataItem (SaInterfaceDataItem interfaceProcessDataItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterfaceDataItem(interfaceProcessDataItem)) return false;
if (SysId.IsValid(interfaceProcessDataItem.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterfaceDataItem_Db dbInterfaceDataItem = new SaInterfaceDataItem_Db(DbInfo);
PopulateTo(dbInterfaceDataItem, interfaceProcessDataItem, dbUpdateInfo);
if (SaInterfaceDataItem_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbInterfaceDataItem._Id = SysId.ToInt(Database.GetNextId(dbInterfaceDataItem.TableName, dbUpdateInfo));
}
dbInterfaceDataItem.ExecuteInsertCommand(dbCommand);
interfaceProcessDataItem.Id = new SysId(dbInterfaceDataItem._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Item.
public override bool UpdateInterfaceDataItem (SaInterfaceDataItem interfaceProcessDataItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterfaceDataItem(interfaceProcessDataItem)) return false;
if (!SysId.IsValid(interfaceProcessDataItem.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterfaceDataItem_Db dbInterfaceDataItem = new SaInterfaceDataItem_Db(DbInfo);
dbInterfaceDataItem.PopulateFrom(dbCommand, aliasInterfaceDataItem, "Id=" + SysId.ToString(interfaceProcessDataItem.Id));
// Update properties.
PopulateTo(dbInterfaceDataItem, interfaceProcessDataItem, dbUpdateInfo);
dbInterfaceDataItem.ExecuteUpdateCommand(dbCommand);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Item.
public override bool InterfaceDataItemCanBeDeleted (SaInterfaceDataItem interfaceProcessDataItem)
{
ClearErrorState();
if (!base.InterfaceDataItemCanBeDeleted(interfaceProcessDataItem)) return false;
return true;
}
public override bool DeleteInterfaceDataItem (SaInterfaceDataItem interfaceProcessDataItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!InterfaceDataItemCanBeDeleted(interfaceProcessDataItem)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterfaceDataItem_Db dbInterfaceDataItem = new SaInterfaceDataItem_Db(DbInfo);
dbInterfaceDataItem.PopulateFrom(dbCommand, aliasInterfaceDataItem, "Id=" + SysId.ToString(interfaceProcessDataItem.Id));
// Delete interface.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + TableName_InterfaceDataItem + " WHERE Id=" + SysId.ToString(interfaceProcessDataItem.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (SaInterfaceDataItem_Db dbInterfaceDataItem, SaInterfaceDataItem interfaceProcessDataItem, DbUpdateInfo dbUpdateInfo)
{
dbInterfaceDataItem._Id = interfaceProcessDataItem.Id.ToInt();
dbInterfaceDataItem._InterfaceId = SysId.ToInt(interfaceProcessDataItem.InterfaceId);
dbInterfaceDataItem._Direction = (short)interfaceProcessDataItem.Direction;
dbInterfaceDataItem._ItemType = interfaceProcessDataItem.ItemId.Type;
dbInterfaceDataItem._ItemId = SysId.ToInt(interfaceProcessDataItem.ItemId.Id);
dbInterfaceDataItem._ExternalRef = interfaceProcessDataItem.ExternalReference;
dbInterfaceDataItem._ProcessStatus = SacsSystem.GetStatusCode(interfaceProcessDataItem.ProcessStatus);
dbInterfaceDataItem._ProcessStatusBy = SysId.ToInt(interfaceProcessDataItem.ProcessStatusBy);
dbInterfaceDataItem._ProcessStatusAt = interfaceProcessDataItem.ProcessStatusAt;
dbInterfaceDataItem._ItemStatus = SacsSystem.GetStatusCode(interfaceProcessDataItem.ItemStatus);
dbInterfaceDataItem._ItemStatusBy = SysId.ToInt(interfaceProcessDataItem.ItemStatusBy);
dbInterfaceDataItem._ItemStatusAt = interfaceProcessDataItem.ItemStatusAt;
// Common properties.
dbInterfaceDataItem._Notes = interfaceProcessDataItem.Notes;
dbInterfaceDataItem._Flags = (short)interfaceProcessDataItem.Flags;
if (!SysId.IsValid(interfaceProcessDataItem.Id))
{
dbInterfaceDataItem._CreateOn = DateTime.Now;
dbInterfaceDataItem._CreateBy = dbUpdateInfo.UserId.ToInt();
dbInterfaceDataItem._CreateHost = dbUpdateInfo.Host;
}
dbInterfaceDataItem._UpdateOn = DateTime.Now;
dbInterfaceDataItem._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbInterfaceDataItem._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaInterfaceDataItem_Db dbInterfaceDataItem, SaInterfaceDataItem interfaceProcessDataItem)
{
//interface.Id = new SysId(dbInterfaceDataItem._Id);
//interfaceProcessDataItem.InterfaceId = new SysId(dbInterfaceDataItem._InterfaceId);
//interfaceProcessDataItem.Direction = (SaInterfaceProcessDirection)dbInterfaceDataItem._Direction;
//interfaceProcessDataItem.ItemId = new ItemId(dbInterfaceDataItem._ItemType, new SysId(dbInterfaceDataItem._ItemId));
interfaceProcessDataItem.ExternalReference = dbInterfaceDataItem._ExternalRef;
interfaceProcessDataItem.ProcessStatus = SacsSystem.GetStatusForCode(dbInterfaceDataItem._ProcessStatus);
interfaceProcessDataItem.ProcessStatusBy = new SysId(dbInterfaceDataItem._ProcessStatusBy);
interfaceProcessDataItem.ProcessStatusAt = dbInterfaceDataItem._ProcessStatusAt;
interfaceProcessDataItem.ItemStatus = SacsSystem.GetStatusForCode(dbInterfaceDataItem._ItemStatus);
interfaceProcessDataItem.ItemStatusBy = new SysId(dbInterfaceDataItem._ItemStatusBy);
interfaceProcessDataItem.ItemStatusAt = dbInterfaceDataItem._ItemStatusAt;
// Common properties.
interfaceProcessDataItem.Notes = dbInterfaceDataItem._Notes;
interfaceProcessDataItem.SetCreateStamp(dbInterfaceDataItem._CreateOn, new SysId(dbInterfaceDataItem._CreateBy), dbInterfaceDataItem._CreateHost);
interfaceProcessDataItem.SetUpdateStamp(dbInterfaceDataItem._UpdateOn, new SysId(dbInterfaceDataItem._UpdateBy), dbInterfaceDataItem._UpdateHost);
interfaceProcessDataItem.AcceptChanges();
}
//-------------------------------------------------------------------
// Column definitions.
private static readonly String aliasInterfaceDataItem = "aIntPrcDit";
private void SetInterfaceDataItemColDfn
(ColumnDfn col, String caption, int width, SaInterfaceDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaInterfaceDbDfn.GetTableForColumn(dbCol) == SaInterfaceDbDfn.TableIdx.SaInterfaceDataItem)
alias = aliasInterfaceDataItem;
col.Set(caption, width, (int)dbCol, prefix + SaInterfaceDbDfn.GetColumnName(dbCol, false), SaInterfaceDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetInterfaceDataItemColumnDfn (SaInterfaceDataItem.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
switch (columnId)
{
case SaInterfaceDataItem.Column.Pos:
SetInterfaceDataItemColDfn(columnDfn, "Pos", 45, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaInterfaceDataItem.Column.Id:
SetInterfaceDataItemColDfn(columnDfn, "Id", 60, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Interface properties.
case SaInterfaceDataItem.Column.InterfaceId:
SetInterfaceDataItemColDfn(columnDfn, "Interface #", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_InterfaceId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SaInterfaceDataItem.Column.Direction:
SetInterfaceDataItemColDfn(columnDfn, "Direction", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Direction, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceDataItem.Column.Direction_Desc:
SetInterfaceDataItemColDfn(columnDfn, "Direction", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Direction, ColumnAlignment.Center, DataValue.DataType.String);
break;
case SaInterfaceDataItem.Column.ExternalReference:
SetInterfaceDataItemColDfn(columnDfn, "Reference", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ExternalRef);
break;
// Item Id.
case SaInterfaceDataItem.Column.ItemType:
SetInterfaceDataItemColDfn(columnDfn, "Item type", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceDataItem.Column.ItemType_Desc:
SetInterfaceDataItemColDfn(columnDfn, "Item type", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemType, ColumnAlignment.Center);
break;
case SaInterfaceDataItem.Column.ItemId:
SetInterfaceDataItemColDfn(columnDfn, "Item #", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemId, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceDataItem.Column.Item_Caption:
SetInterfaceDataItemColDfn(columnDfn, "Item", 120, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemId, ColumnAlignment.Center);
break;
// Process status.
case SaInterfaceDataItem.Column.ProcessStatus:
SetInterfaceDataItemColDfn(columnDfn, "Process Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatus, ColumnAlignment.Center);
break;
case SaInterfaceDataItem.Column.ProcessStatus_Desc:
SetInterfaceDataItemColDfn(columnDfn, "Process Status", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatus, ColumnAlignment.Center);
break;
case SaInterfaceDataItem.Column.ProcessStatus_Ind:
SetInterfaceDataItemColDfn(columnDfn, "Process Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatus, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaInterfaceDataItem.Column.ProcessStatusBy:
SetInterfaceDataItemColDfn(columnDfn, "Process status by", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusBy, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceDataItem.Column.ProcessStatusBy_Name:
SetInterfaceDataItemColDfn(columnDfn, "Process status by", 120, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusBy);
break;
case SaInterfaceDataItem.Column.ProcessStatusAt:
SetInterfaceDataItemColDfn(columnDfn, "Process status at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt, ColumnAlignment.Center, DataValue.DataType.DateTime);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt) && Database.ColumnExists(TableName_InterfaceDataItem, "ProcessStatusOn"))
{
// Legacy column.
columnDfn.DataName = "ProcessStatusOn";
columnDfn.SortDataName = aliasInterfaceDataItem + "." + columnDfn.DataName;
}
break;
case SaInterfaceDataItem.Column.ProcessStatusAt_Date:
SetInterfaceDataItemColDfn(columnDfn, "Process status at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt, ColumnAlignment.Center, DataValue.DataType.Date);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt) && Database.ColumnExists(TableName_InterfaceDataItem, "ProcessStatusOn"))
{
// Legacy column.
columnDfn.DataName = "ProcessStatusOn";
columnDfn.SortDataName = aliasInterfaceDataItem + "." + columnDfn.DataName;
}
break;
case SaInterfaceDataItem.Column.ProcessStatusAt_Time:
SetInterfaceDataItemColDfn(columnDfn, "Process status at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt, ColumnAlignment.Center, DataValue.DataType.Time);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt) && Database.ColumnExists(TableName_InterfaceDataItem, "ProcessStatusOn"))
{
// Legacy column.
columnDfn.DataName = "ProcessStatusOn";
columnDfn.SortDataName = aliasInterfaceDataItem + "." + columnDfn.DataName;
}
break;
// Item status.
case SaInterfaceDataItem.Column.ItemStatus:
SetInterfaceDataItemColDfn(columnDfn, "Item Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatus, ColumnAlignment.Center);
break;
case SaInterfaceDataItem.Column.ItemStatus_Desc:
SetInterfaceDataItemColDfn(columnDfn, "Item Status", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatus, ColumnAlignment.Center);
break;
case SaInterfaceDataItem.Column.ItemStatus_Ind:
SetInterfaceDataItemColDfn(columnDfn, "Item Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatus, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaInterfaceDataItem.Column.ItemStatusBy:
SetInterfaceDataItemColDfn(columnDfn, "Item status by", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusBy, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceDataItem.Column.ItemStatusBy_Name:
SetInterfaceDataItemColDfn(columnDfn, "Item status by", 120, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusBy);
break;
case SaInterfaceDataItem.Column.ItemStatusAt:
SetInterfaceDataItemColDfn(columnDfn, "Item status at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt, ColumnAlignment.Center, DataValue.DataType.DateTime);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt) && Database.ColumnExists(TableName_InterfaceDataItem, "ItemStatusOn"))
{
// Legacy column.
columnDfn.DataName = "ItemStatusOn";
columnDfn.SortDataName = aliasInterfaceDataItem + "." + columnDfn.DataName;
}
break;
case SaInterfaceDataItem.Column.ItemStatusAt_Date:
SetInterfaceDataItemColDfn(columnDfn, "Item status at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt, ColumnAlignment.Center, DataValue.DataType.Date);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt) && Database.ColumnExists(TableName_InterfaceDataItem, "ItemStatusOn"))
{
// Legacy column.
columnDfn.DataName = "ItemStatusOn";
columnDfn.SortDataName = aliasInterfaceDataItem + "." + columnDfn.DataName;
}
break;
case SaInterfaceDataItem.Column.ItemStatusAt_Time:
SetInterfaceDataItemColDfn(columnDfn, "Item status at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt, ColumnAlignment.Center, DataValue.DataType.Time);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt) && Database.ColumnExists(TableName_InterfaceDataItem, "ItemStatusOn"))
{
// Legacy column.
columnDfn.DataName = "ItemStatusOn";
columnDfn.SortDataName = aliasInterfaceDataItem + "." + columnDfn.DataName;
}
break;
// Common properties.
case SaInterfaceDataItem.Column.Notes:
SetInterfaceDataItemColDfn(columnDfn, "Notes", 200, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Notes);
break;
case SaInterfaceDataItem.Column.CreateOn_Date:
SetInterfaceDataItemColDfn(columnDfn, "Created", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaInterfaceDataItem.Column.UpdateOn_Date:
SetInterfaceDataItemColDfn(columnDfn, "Updated", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Query filter.
public override List<string> GetInterfaceDataItemQueryFilter (SaInterfaceDataItem.Params prm)
{
List<String> filter = new List<String>();
// Item Id.
String colSaInterfaceDataItem_Id = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Id, aliasInterfaceDataItem);
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(colSaInterfaceDataItem_Id + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colSaInterfaceDataItem_Id + " NOT IN (" + excludedIds + ")");
// Interface.
String colSaInterfaceDataItem_InterfaceId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_InterfaceId, aliasInterfaceDataItem);
if (SysId.IsValid(prm.InterfaceId))
filter.Add(colSaInterfaceDataItem_InterfaceId + "=" + SysId.ToString(prm.InterfaceId));
// Direction.
String colSaInterfaceDataItem_Direction = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Direction, aliasInterfaceDataItem);
if ((int)prm.Direction > 0)
filter.Add(colSaInterfaceDataItem_Direction + "=" + (int)prm.Direction);
// Item type.
String colSaInterfaceDataItem_ItemType = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemType, aliasInterfaceDataItem);
if (prm.ItemType > 0)
filter.Add(colSaInterfaceDataItem_ItemType + "=" + prm.ItemType);
// Item ids.
String colSaInterfaceDataItem_ItemId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemId, aliasInterfaceDataItem);
List<String> filterItemIds = new List<string>();
foreach (ItemId itemId in prm.IncludedItemIds)
filter.Add(colSaInterfaceDataItem_ItemType + "=" + itemId.Type.ToString() + " And " + colSaInterfaceDataItem_ItemId + "=" + SysId.ToString(itemId.Id));
if (filterItemIds.Count > 0)
filter.Add(filterItemIds.Concat(" Or ", "(", ")"));
// Reference.
String colSaInterfaceDataItem_ExternalRef = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ExternalRef, aliasInterfaceDataItem);
if (!StringUtil.IsEmpty(prm.ExternalReference))
filter.Add(colSaInterfaceDataItem_ExternalRef + "='" + DbQuery.FormatForCondition(prm.ExternalReference) + "'");
// Process Status.
String colSaInterfaceDataItem_ProcessStatus = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatus, aliasInterfaceDataItem);
if (prm.ProcessStatusCat == SaInterfaceDataItem.ProcessStatusCat.AwaitingOnly)
filter.Add(colSaInterfaceDataItem_ProcessStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Awaiting) + ")");
else if (prm.ProcessStatusCat == SaInterfaceDataItem.ProcessStatusCat.CompletedOnly)
filter.Add(colSaInterfaceDataItem_ProcessStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Completed) + ")");
// Item Status.
String colSaInterfaceDataItem_ItemStatus = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatus, aliasInterfaceDataItem);
if (prm.ItemStatusCat == SaInterfaceDataItem.ItemStatusCat.InProgressOnly)
filter.Add(colSaInterfaceDataItem_ItemStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.InProgress) + ")");
else if (prm.ItemStatusCat == SaInterfaceDataItem.ItemStatusCat.ImportedOnly)
filter.Add(colSaInterfaceDataItem_ItemStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Imported) + ")");
else if (prm.ItemStatusCat == SaInterfaceDataItem.ItemStatusCat.ExportedOnly)
filter.Add(colSaInterfaceDataItem_ItemStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Exported) + ")");
else if (prm.ItemStatusCat == SaInterfaceDataItem.ItemStatusCat.CancelledOnly)
filter.Add(colSaInterfaceDataItem_ItemStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Cancelled) + ")");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Sort columns.
public List<String> GetInterfaceDataItemSortColumns (SaInterfaceDataItem.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for InterfaceDataItem columns in case of conflict.
String sortCol = String.Empty;
if (SaInterfaceDbDfn.GetTableForColumn((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn) == SaInterfaceDbDfn.TableIdx.SaInterfaceDataItem)
{
sortCol = SaInterfaceDbDfn.GetColumnNameQual((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn, aliasInterfaceDataItem);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
{
sortCol = columnDfn.SortDataName;
}
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_InterfaceId, aliasInterfaceDataItem) + " ASC");
if (ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt))
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt, aliasInterfaceDataItem) + " ASC");
else if (Database.ColumnExists(TableName_InterfaceDataItem, "ProcessStatusOn"))
// Legacy column.
sortColumnNames.Add(aliasInterfaceDataItem + ".ProcessStatusOn ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Item count.
private long GetInterfaceDataItemCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(TableName_InterfaceDataItem + " As " + aliasInterfaceDataItem, filter);
}
public override long GetInterfaceDataItemCount (SaInterfaceDataItem.Params prm)
{
ClearErrorState();
return GetInterfaceDataItemCount(GetInterfaceDataItemQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Item list.
public override List<SaInterfaceDataItem> GetInterfaceDataItemList (SaInterfaceDataItem.Params prm)
{
List<SaInterfaceDataItem> interfaces = new List<SaInterfaceDataItem>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(TableName_InterfaceDataItem, aliasInterfaceDataItem);
SaInterfaceDataItem_Db dbInterfaceDataItem = new SaInterfaceDataItem_Db(DbInfo);
qry.Columns.AddRange(dbInterfaceDataItem.ExistingColumnNames);
qry.Filters.AddRange(GetInterfaceDataItemQueryFilter(prm));
qry.OrderBy.AddRange(GetInterfaceDataItemSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
interfaces.Add(CreateInterfaceDataItem(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterfaceDataItemList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaces;
}
//-------------------------------------------------------------------
// Item query.
public override DbResultSet ExecuteInterfaceDataItemQuery (List<ColumnDfn> columns, SaInterfaceDataItem.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(TableName_InterfaceDataItem, aliasInterfaceDataItem);
// Add columns as defined in query list.
if (columns.HasId((int)SaInterfaceDataItem.Column.Id))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Id, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.InterfaceId))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_InterfaceId, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.Direction) || columns.HasId((int)SaInterfaceDataItem.Column.Direction_Desc))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Direction, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ExternalReference))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ExternalRef, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ItemType) || columns.HasId((int)SaInterfaceDataItem.Column.ItemType_Desc) || columns.HasId((int)SaInterfaceDataItem.Column.Item_Caption))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemType, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ItemId) || columns.HasId((int)SaInterfaceDataItem.Column.Item_Caption))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemId, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ProcessStatus))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatus, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ProcessStatusBy) || columns.HasId((int)SaInterfaceDataItem.Column.ProcessStatusBy_Name))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusBy, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ProcessStatusAt) || columns.HasId((int)SaInterfaceDataItem.Column.ProcessStatusAt_Date) || columns.HasId((int)SaInterfaceDataItem.Column.ProcessStatusAt_Time))
{
if (ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusAt, aliasInterfaceDataItem));
else if (Database.ColumnExists(TableName_InterfaceDataItem, "ProcessStatusOn"))
// Legacy column.
query.Columns.Add(aliasInterfaceDataItem + ".ProcessStatusOn");
}
if (columns.HasId((int)SaInterfaceDataItem.Column.ItemStatus))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatus, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ItemStatusBy) || columns.HasId((int)SaInterfaceDataItem.Column.ItemStatusBy_Name))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusBy, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.ItemStatusAt) || columns.HasId((int)SaInterfaceDataItem.Column.ItemStatusAt_Date) || columns.HasId((int)SaInterfaceDataItem.Column.ItemStatusAt_Time))
{
if (ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusAt, aliasInterfaceDataItem));
else if (Database.ColumnExists(TableName_InterfaceDataItem, "ItemStatusOn"))
// Legacy column.
query.Columns.Add(aliasInterfaceDataItem + ".ItemStatusOn");
}
if (columns.HasId((int)SaInterfaceDataItem.Column.Notes))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Notes, aliasInterfaceDataItem));
/*
if (columns.HasId((int)SaInterfaceDataItem.Column.Status) || columns.HasId((int)SaInterfaceDataItem.Column.Status_Desc) || columns.HasId((int)SaInterfaceDataItem.Column.Status_Ind))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Status, aliasInterfaceDataItem));
*/
if (columns.HasId((int)SaInterfaceDataItem.Column.CreateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_CreateOn, aliasInterfaceDataItem));
if (columns.HasId((int)SaInterfaceDataItem.Column.UpdateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_UpdateOn, aliasInterfaceDataItem));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetInterfaceDataItemQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetInterfaceDataItemSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,13 @@
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
public partial class SaInterfaceMgr_Dbas
{
//*******************************************************************
// I n t e r f a c e P r o c e s s D a t a I t e m s
//*******************************************************************
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,484 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
public partial class SaInterfaceMgr_Dbas
{
//*******************************************************************
// I n t e r f a c e P r o c e s s M e s s a g e s
//*******************************************************************
// Create Item.
public override SaInterfaceProcessMessage CreateInterfaceProcessMessage (SysId interfaceProcessId)
{
ClearErrorState();
return new SaInterfaceProcessMessage_Dbas(null, interfaceProcessId, 0);
}
private SaInterfaceProcessMessage CreateInterfaceProcessMessage (SaInterfaceProcessMessage_Db dbInterfaceProcessMessage)
{
ClearErrorState();
SaInterfaceProcessMessage interfaceProcessMessage = new SaInterfaceProcessMessage_Dbas(new SysId(dbInterfaceProcessMessage._Id), new SysId(dbInterfaceProcessMessage._ProcessId), (ushort)dbInterfaceProcessMessage._Flags);
PopulateFrom(dbInterfaceProcessMessage, interfaceProcessMessage);
return interfaceProcessMessage;
}
private SaInterfaceProcessMessage CreateInterfaceProcessMessage (DbDataReader dataReader)
{
SaInterfaceProcessMessage_Db dbInterfaceProcessMessage = new SaInterfaceProcessMessage_Db(DbInfo);
dbInterfaceProcessMessage.PopulateFrom(dataReader);
return CreateInterfaceProcessMessage(dbInterfaceProcessMessage);
}
//-------------------------------------------------------------------
// Item exists.
public override bool InterfaceProcessMessageExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetInterfaceProcessMessageCount(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Id, aliasInterfaceProcessMessage) + "=" + SysId.ToString(id)) == 1;
}
//-------------------------------------------------------------------
// Get Item.
public override SaInterfaceProcessMessage GetInterfaceProcessMessage (SaInterfaceProcessMessage.Params prm)
{
return GetInterfaceProcessMessage(GetInterfaceProcessMessageQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaInterfaceProcessMessage GetInterfaceProcessMessage (String filter)
{
ClearErrorState();
if (GetInterfaceProcessMessageCount(filter) != 1) return null;
SaInterfaceProcessMessage interfaceProcessMessage = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterfaceProcessMessage_Db dbInterfaceProcessMessage = new SaInterfaceProcessMessage_Db(DbInfo);
dbInterfaceProcessMessage.PopulateFrom(dbCommand, aliasInterfaceProcessMessage, filter);
interfaceProcessMessage = CreateInterfaceProcessMessage(dbInterfaceProcessMessage);
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterfaceProcessMessage\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaceProcessMessage;
}
public override SaInterfaceProcessMessage GetInterfaceProcessMessageById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetInterfaceProcessMessage("Id=" + SysId.ToString(id));
}
//-------------------------------------------------------------------
// Validate Interface ProcessMessage.
public override bool IsValidInterfaceProcessMessageData (SaInterfaceProcessMessage.Data interfaceData, SaInterfaceProcessMessage.ErrField errField)
{
ClearErrorState();
if (!base.IsValidInterfaceProcessMessageData(interfaceData, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Interface ProcessMessage.
public override bool InsertInterfaceProcessMessage (SaInterfaceProcessMessage interfaceProcessMessage, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterfaceProcessMessage(interfaceProcessMessage)) return false;
if (SysId.IsValid(interfaceProcessMessage.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterfaceProcessMessage_Db dbInterfaceProcessMessage = new SaInterfaceProcessMessage_Db(DbInfo);
PopulateTo(dbInterfaceProcessMessage, interfaceProcessMessage, dbUpdateInfo);
if (SaInterfaceProcessMessage_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbInterfaceProcessMessage._Id = SysId.ToInt(Database.GetNextId(dbInterfaceProcessMessage.TableName, dbUpdateInfo));
}
dbInterfaceProcessMessage.ExecuteInsertCommand(dbCommand);
interfaceProcessMessage.Id = new SysId(dbInterfaceProcessMessage._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Interface ProcessMessage.
public override bool UpdateInterfaceProcessMessage (SaInterfaceProcessMessage interfaceProcessMessage, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterfaceProcessMessage(interfaceProcessMessage)) return false;
if (!SysId.IsValid(interfaceProcessMessage.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterfaceProcessMessage_Db dbInterfaceProcessMessage = new SaInterfaceProcessMessage_Db(DbInfo);
dbInterfaceProcessMessage.PopulateFrom(dbCommand, aliasInterfaceProcessMessage, "Id=" + SysId.ToString(interfaceProcessMessage.Id));
// Update properties.
PopulateTo(dbInterfaceProcessMessage, interfaceProcessMessage, dbUpdateInfo);
dbInterfaceProcessMessage.ExecuteUpdateCommand(dbCommand);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Interface ProcessMessage.
public override bool InterfaceProcessMessageCanBeDeleted (SaInterfaceProcessMessage interfaceProcessMessage)
{
ClearErrorState();
if (!base.InterfaceProcessMessageCanBeDeleted(interfaceProcessMessage)) return false;
return true;
}
public override bool DeleteInterfaceProcessMessage (SaInterfaceProcessMessage interfaceProcessMessage, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!InterfaceProcessMessageCanBeDeleted(interfaceProcessMessage)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterfaceProcessMessage_Db dbInterfaceProcessMessage = new SaInterfaceProcessMessage_Db(DbInfo);
dbInterfaceProcessMessage.PopulateFrom(dbCommand, aliasInterfaceProcessMessage, "Id=" + SysId.ToString(interfaceProcessMessage.Id));
// Delete interface.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + TableName_InterfaceProcessMessage + " WHERE Id=" + SysId.ToString(interfaceProcessMessage.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (SaInterfaceProcessMessage_Db dbInterfaceProcessMessage, SaInterfaceProcessMessage interfaceProcessMessage, DbUpdateInfo dbUpdateInfo)
{
dbInterfaceProcessMessage._Id = interfaceProcessMessage.Id.ToInt();
dbInterfaceProcessMessage._ProcessId = SysId.ToInt(interfaceProcessMessage.InterfaceProcessId);
dbInterfaceProcessMessage._MsgType = MessageLevels.GetCodeForType(interfaceProcessMessage.Level);
dbInterfaceProcessMessage._Msg = interfaceProcessMessage.Message;
dbInterfaceProcessMessage._FileName = interfaceProcessMessage.Filename;
dbInterfaceProcessMessage._LineNumber = interfaceProcessMessage.LineNumber;
dbInterfaceProcessMessage._ItemType = interfaceProcessMessage.ItemId.Type;
dbInterfaceProcessMessage._ItemId = SysId.ToInt(interfaceProcessMessage.ItemId.Id);
dbInterfaceProcessMessage._Status = SacsSystem.GetStatusCode(interfaceProcessMessage.Status);
dbInterfaceProcessMessage._Flags = (short)interfaceProcessMessage.Flags;
if (!SysId.IsValid(interfaceProcessMessage.Id))
{
dbInterfaceProcessMessage._CreateOn = DateTime.Now;
dbInterfaceProcessMessage._CreateBy = dbUpdateInfo.UserId.ToInt();
dbInterfaceProcessMessage._CreateHost = dbUpdateInfo.Host;
}
dbInterfaceProcessMessage._UpdateOn = DateTime.Now;
dbInterfaceProcessMessage._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbInterfaceProcessMessage._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaInterfaceProcessMessage_Db dbInterfaceProcessMessage, SaInterfaceProcessMessage interfaceProcessMessage)
{
//interface.Id = new SysId(dbInterfaceProcessMessage._Id);
//interfaceProcessMessage.InterfaceProcessId = new SysId(dbInterfaceProcessMessage._ProcessId);
interfaceProcessMessage.Level = (SaMessageLevel)MessageLevels.GetTypeForCode(dbInterfaceProcessMessage._MsgType);
// Legacy value for 'Warning'.
if (interfaceProcessMessage.Level <= 0 && dbInterfaceProcessMessage._MsgType.EqualsCI(MessageTypeWarningAlt))
interfaceProcessMessage.Level = SaMessageLevel.Warning;
interfaceProcessMessage.Message = dbInterfaceProcessMessage._Msg;
interfaceProcessMessage.Filename = dbInterfaceProcessMessage._FileName;
interfaceProcessMessage.LineNumber = dbInterfaceProcessMessage._LineNumber;
interfaceProcessMessage.ItemId = new ItemId(dbInterfaceProcessMessage._ItemType, new SysId(dbInterfaceProcessMessage._ItemId));
interfaceProcessMessage.Status = SacsSystem.GetStatusForCode(dbInterfaceProcessMessage._Status);
interfaceProcessMessage.SetCreateStamp(dbInterfaceProcessMessage._CreateOn, new SysId(dbInterfaceProcessMessage._CreateBy), dbInterfaceProcessMessage._CreateHost);
interfaceProcessMessage.SetUpdateStamp(dbInterfaceProcessMessage._UpdateOn, new SysId(dbInterfaceProcessMessage._UpdateBy), dbInterfaceProcessMessage._UpdateHost);
interfaceProcessMessage.AcceptChanges();
}
//-------------------------------------------------------------------
// Interface Process Message column definitions.
private static readonly String aliasInterfaceProcessMessage = "aIntPrcMsg";
private void SetInterfaceProcessMessageColDfn
(ColumnDfn col, String caption, int width, SaInterfaceDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaInterfaceDbDfn.GetTableForColumn(dbCol) == SaInterfaceDbDfn.TableIdx.SaInterfaceProcessMessage)
alias = aliasInterfaceProcessMessage;
col.Set(caption, width, (int)dbCol, prefix + SaInterfaceDbDfn.GetColumnName(dbCol, false), SaInterfaceDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetInterfaceProcessMessageColumnDfn (SaInterfaceProcessMessage.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
switch (columnId)
{
case SaInterfaceProcessMessage.Column.Pos:
SetInterfaceProcessMessageColDfn(columnDfn, "Pos", 45, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaInterfaceProcessMessage.Column.Id:
SetInterfaceProcessMessageColDfn(columnDfn, "Id", 60, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaInterfaceProcessMessage.Column.ProcessId:
SetInterfaceProcessMessageColDfn(columnDfn, "Process #", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SaInterfaceProcessMessage.Column.Level:
SetInterfaceProcessMessageColDfn(columnDfn, "Level", 60, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_MsgType, ColumnAlignment.Center, DataValue.DataType.String);
break;
case SaInterfaceProcessMessage.Column.Level_Desc:
SetInterfaceProcessMessageColDfn(columnDfn, "Level", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_MsgType, ColumnAlignment.Center, DataValue.DataType.String);
break;
case SaInterfaceProcessMessage.Column.Message:
SetInterfaceProcessMessageColDfn(columnDfn, "Message", 200, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Msg);
break;
case SaInterfaceProcessMessage.Column.Filename:
SetInterfaceProcessMessageColDfn(columnDfn, "Filename", 120, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_FileName);
break;
case SaInterfaceProcessMessage.Column.LineNumber:
SetInterfaceProcessMessageColDfn(columnDfn, "Line no", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_LineNumber, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceProcessMessage.Column.ItemType:
SetInterfaceProcessMessageColDfn(columnDfn, "Item type", 70, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceProcessMessage.Column.ItemType_Desc:
SetInterfaceProcessMessageColDfn(columnDfn, "Item type", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemType, ColumnAlignment.Center, DataValue.DataType.String);
break;
case SaInterfaceProcessMessage.Column.ItemId:
SetInterfaceProcessMessageColDfn(columnDfn, "Item #", 70, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemId, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceProcessMessage.Column.Item_Caption:
SetInterfaceProcessMessageColDfn(columnDfn, "Item", 120, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemId, ColumnAlignment.Center, DataValue.DataType.String);
break;
// Common properties.
case SaInterfaceProcessMessage.Column.Status:
SetInterfaceProcessMessageColDfn(columnDfn, "Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Status, ColumnAlignment.Center);
break;
case SaInterfaceProcessMessage.Column.Status_Desc:
SetInterfaceProcessMessageColDfn(columnDfn, "Status", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Status, ColumnAlignment.Center);
break;
case SaInterfaceProcessMessage.Column.Status_Ind:
SetInterfaceProcessMessageColDfn(columnDfn, "Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaInterfaceProcessMessage.Column.CreateOn_Date:
SetInterfaceProcessMessageColDfn(columnDfn, "Created", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaInterfaceProcessMessage.Column.UpdateOn_Date:
SetInterfaceProcessMessageColDfn(columnDfn, "Updated", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Interface ProcessMessage query filter.
public override List<string> GetInterfaceProcessMessageQueryFilter (SaInterfaceProcessMessage.Params prm)
{
List<String> filter = new List<String>();
// Interface ProcessMessage Id.
String colId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Id, aliasInterfaceProcessMessage);
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(colId + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colId + " NOT IN (" + excludedIds + ")");
// Interface Process.
String colProcessId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, aliasInterfaceProcessMessage);
if (SysId.IsValid(prm.InterfaceProcessId))
filter.Add(colProcessId + "=" + SysId.ToString(prm.InterfaceProcessId));
// Item ids.
String colItemType = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemType, aliasInterfaceProcessMessage);
String colItemId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemId, aliasInterfaceProcessMessage);
List<String> filterItemIds = new List<string>();
foreach (ItemId itemId in prm.IncludedItemIds)
filter.Add(colItemType + "=" + itemId.Type.ToString() + " And " + colItemId + "=" + SysId.ToString(itemId.Id));
if (filterItemIds.Count > 0)
filter.Add(filterItemIds.Concat(" Or ", "(", ")"));
// Status.
String colStatus = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Status, aliasInterfaceProcessMessage);
if (prm.StatusCat == SaInterfaceProcessMessage.StatusCat.CompletedOnly)
filter.Add(colStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Completed) + ")");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Interface ProcessMessage sort columns.
public List<String> GetInterfaceProcessMessageSortColumns (SaInterfaceProcessMessage.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for InterfaceProcessMessage columns in case of conflict.
String sortCol = String.Empty;
if (SaInterfaceDbDfn.GetTableForColumn((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn) == SaInterfaceDbDfn.TableIdx.SaInterfaceProcessMessage)
{
sortCol = SaInterfaceDbDfn.GetColumnNameQual((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn, aliasInterfaceProcessMessage);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
{
sortCol = columnDfn.SortDataName;
}
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, aliasInterfaceProcessMessage) + " ASC");
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Id, aliasInterfaceProcessMessage) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Interface ProcessMessage count.
private long GetInterfaceProcessMessageCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(TableName_InterfaceProcessMessage + " As " + aliasInterfaceProcessMessage, filter);
}
public override long GetInterfaceProcessMessageCount (SaInterfaceProcessMessage.Params prm)
{
ClearErrorState();
return GetInterfaceProcessMessageCount(GetInterfaceProcessMessageQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Interface ProcessMessage list.
public override List<SaInterfaceProcessMessage> GetInterfaceProcessMessageList (SaInterfaceProcessMessage.Params prm)
{
List<SaInterfaceProcessMessage> interfaces = new List<SaInterfaceProcessMessage>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(TableName_InterfaceProcessMessage, aliasInterfaceProcessMessage);
SaInterfaceProcessMessage_Db dbInterfaceProcessMessage = new SaInterfaceProcessMessage_Db(DbInfo);
qry.Columns.AddRange(dbInterfaceProcessMessage.ExistingColumnNames);
qry.Filters.AddRange(GetInterfaceProcessMessageQueryFilter(prm));
qry.OrderBy.AddRange(GetInterfaceProcessMessageSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
interfaces.Add(CreateInterfaceProcessMessage(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterfaceProcessMessageList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaces;
}
//-------------------------------------------------------------------
// Interface ProcessMessage query.
public override DbResultSet ExecuteInterfaceProcessMessageQuery (List<ColumnDfn> columns, SaInterfaceProcessMessage.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(TableName_InterfaceProcessMessage, aliasInterfaceProcessMessage);
// Add columns as defined in query list.
if (columns.HasId((int)SaInterfaceProcessMessage.Column.Id))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Id, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.ProcessId))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.Level) || columns.HasId((int)SaInterfaceProcessMessage.Column.Level_Desc))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_MsgType, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.Message))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Msg, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.Filename))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_FileName, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.LineNumber))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_LineNumber, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.ItemType) || columns.HasId((int)SaInterfaceProcessMessage.Column.ItemType_Desc) || columns.HasId((int)SaInterfaceProcessMessage.Column.Item_Caption))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemType, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.ItemId) || columns.HasId((int)SaInterfaceProcessMessage.Column.Item_Caption))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemId, aliasInterfaceProcessMessage));
/*
if (columns.HasId((int)SaInterfaceProcessMessage.Column.Notes))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Notes, aliasInterfaceProcessMessage));
*/
if (columns.HasId((int)SaInterfaceProcessMessage.Column.Status) || columns.HasId((int)SaInterfaceProcessMessage.Column.Status_Desc) || columns.HasId((int)SaInterfaceProcessMessage.Column.Status_Ind))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Status, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.CreateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_CreateOn, aliasInterfaceProcessMessage));
if (columns.HasId((int)SaInterfaceProcessMessage.Column.UpdateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_UpdateOn, aliasInterfaceProcessMessage));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetInterfaceProcessMessageQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetInterfaceProcessMessageSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,828 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
public partial class SaInterfaceMgr_Dbas
{
//*******************************************************************
// I n t e r f a c e P r o c e s s e s
//*******************************************************************
// Associated data.
public override int GetInterfaceProcessMessageCount (SysId id)
{
String filter = SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId)+"="+SysId.ToString(id);
return (int)Database.GetRowCount(TableName_InterfaceProcessMessage, filter);
}
public override bool InterfaceProcessHasMessages (SysId id)
{
return (GetInterfaceProcessMessageCount(id) > 0);
}
public override int GetInterfaceProcessDataItemCount (SysId id)
{
String filter = SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessDataItem_ProcessId)+"="+SysId.ToString(id);
return (int)Database.GetRowCount(TableName_InterfaceProcessDataItem, filter);
}
public override bool InterfaceProcessHasDataItems (SysId id)
{
return (GetInterfaceProcessDataItemCount(id) > 0);
}
//-------------------------------------------------------------------
// Create Interface Process.
public override SaInterfaceProcess CreateInterfaceProcess (SysId interfaceId, SaInterfaceProcessDirection direction, String reference, int sequence)
{
ClearErrorState();
return new SaInterfaceProcess_Dbas(null, interfaceId, direction, reference, sequence, 0);
}
private SaInterfaceProcess CreateInterfaceProcess (SaInterfaceProcess_Db dbInterfaceProcess)
{
ClearErrorState();
SaInterfaceProcess interfaceProcess = new SaInterfaceProcess_Dbas(new SysId(dbInterfaceProcess._Id), new SysId(dbInterfaceProcess._InterfaceId), (SaInterfaceProcessDirection)dbInterfaceProcess._Direction, dbInterfaceProcess._ProcRef, dbInterfaceProcess._ProcSeq, (ushort)dbInterfaceProcess._Flags);
PopulateFrom(dbInterfaceProcess, interfaceProcess);
return interfaceProcess;
}
private SaInterfaceProcess CreateInterfaceProcess (DbDataReader dataReader)
{
SaInterfaceProcess_Db dbInterfaceProcess = new SaInterfaceProcess_Db_Local(DbInfo);
dbInterfaceProcess.PopulateFrom(dataReader);
return CreateInterfaceProcess(dbInterfaceProcess);
}
//-------------------------------------------------------------------
// Interface Process exists.
public override bool InterfaceProcessExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetInterfaceProcessCount(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess) + "=" + SysId.ToString(id)) == 1;
}
//-------------------------------------------------------------------
// Get Interface Process.
public override SaInterfaceProcess GetInterfaceProcess (SaInterfaceProcess.Params prm)
{
return GetInterfaceProcess(GetInterfaceProcessQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaInterfaceProcess GetInterfaceProcess (String filter)
{
ClearErrorState();
if (GetInterfaceProcessCount(filter) != 1) return null;
SaInterfaceProcess interfaceProcess = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterfaceProcess_Db dbInterfaceProcess = new SaInterfaceProcess_Db_Local(DbInfo);
dbInterfaceProcess.PopulateFrom(dbCommand, aliasInterfaceProcess, filter);
interfaceProcess = CreateInterfaceProcess(dbInterfaceProcess);
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterfaceProcess\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaceProcess;
}
public override SaInterfaceProcess GetInterfaceProcessById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetInterfaceProcess("Id=" + SysId.ToString(id));
}
//-------------------------------------------------------------------
// Validate Interface Process.
public override bool IsValidInterfaceProcessData (SaInterfaceProcess.Data interfaceData, SaInterfaceProcess.ErrField errField)
{
ClearErrorState();
if (!base.IsValidInterfaceProcessData(interfaceData, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Interface Process.
public override bool InsertInterfaceProcess (SaInterfaceProcess interfaceProcess, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterfaceProcess(interfaceProcess)) return false;
if (SysId.IsValid(interfaceProcess.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterfaceProcess_Db dbInterfaceProcess = new SaInterfaceProcess_Db_Local(DbInfo);
PopulateTo(dbInterfaceProcess, interfaceProcess, dbUpdateInfo);
if (SaInterfaceProcess_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbInterfaceProcess._Id = SysId.ToInt(Database.GetNextId(dbInterfaceProcess.TableName, dbUpdateInfo));
}
dbInterfaceProcess.ExecuteInsertCommand(dbCommand);
interfaceProcess.Id = new SysId(dbInterfaceProcess._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Interface Process.
public override bool UpdateInterfaceProcess (SaInterfaceProcess interfaceProcess, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterfaceProcess(interfaceProcess)) return false;
if (!SysId.IsValid(interfaceProcess.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterfaceProcess_Db dbInterfaceProcess = new SaInterfaceProcess_Db_Local(DbInfo);
dbInterfaceProcess.PopulateFrom(dbCommand, aliasInterfaceProcess, "Id=" + SysId.ToString(interfaceProcess.Id));
// Update properties.
PopulateTo(dbInterfaceProcess, interfaceProcess, dbUpdateInfo);
dbInterfaceProcess.ExecuteUpdateCommand(dbCommand);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Interface Process.
public override bool InterfaceProcessCanBeDeleted (SaInterfaceProcess interfaceProcess)
{
ClearErrorState();
if (!base.InterfaceProcessCanBeDeleted(interfaceProcess)) return false;
return true;
}
public override bool ClearInterfaceProcessMessages (List<SysId> interfaceProcessIdsToClear, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
// Copy list to avoid modifying original.
List<SysId> interfaceProcessIds = new List<SysId>(interfaceProcessIdsToClear);
// Delete interface process messages in batches of 20.
while (!HasErrorState())
{
List<SysId> interfaceProcessIdsBatch = interfaceProcessIds.ExtractIds(20);
if (interfaceProcessIdsBatch.Count < 1) break;
dbCommand.CommandText = "DELETE FROM " + TableName_InterfaceProcessMessage + " WHERE " + SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId) + " In (" + interfaceProcessIdsBatch.Concat(",") + ")";
if (SacsSystem.DebugMode) SaLogger.Debug("ClearInterfaceProcessMessages Query: " + dbCommand.CommandText);
dbCommand.ExecuteNonQuery();
}
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
public override bool ClearInterfaceProcessDataItems (List<SysId> interfaceProcessIdsToClear, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandType = System.Data.CommandType.Text;
// Copy list to avoid modifying original.
List<SysId> interfaceProcessIds = new List<SysId>(interfaceProcessIdsToClear);
// Delete interface process messages in batches of 20.
while (!HasErrorState())
{
List<SysId> interfaceProcessIdsBatch = interfaceProcessIds.ExtractIds(20);
if (interfaceProcessIdsBatch.Count < 1) break;
dbCommand.CommandText = "DELETE FROM " + TableName_InterfaceProcessDataItem + " WHERE " + SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessDataItem_ProcessId) + " In (" + interfaceProcessIdsBatch.Concat(",") + ")";
if (SacsSystem.DebugMode) SaLogger.Debug("ClearInterfaceProcessDataItems Query: " + dbCommand.CommandText);
dbCommand.ExecuteNonQuery();
}
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
public override bool DeleteInterfaceProcess (SaInterfaceProcess interfaceProcess, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!InterfaceProcessCanBeDeleted(interfaceProcess)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterfaceProcess_Db dbInterfaceProcess = new SaInterfaceProcess_Db_Local(DbInfo);
dbInterfaceProcess.PopulateFrom(dbCommand, aliasInterfaceProcess, "Id=" + SysId.ToString(interfaceProcess.Id));
// Delete interface.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + TableName_InterfaceProcess + " WHERE Id=" + SysId.ToString(interfaceProcess.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (SaInterfaceProcess_Db dbInterfaceProcess, SaInterfaceProcess interfaceProcess, DbUpdateInfo dbUpdateInfo)
{
dbInterfaceProcess._Id = interfaceProcess.Id.ToInt();
dbInterfaceProcess._InterfaceId = SysId.ToInt(interfaceProcess.InterfaceId);
dbInterfaceProcess._Direction = (short)interfaceProcess.Direction;
dbInterfaceProcess._ProcRef = interfaceProcess.Reference;
dbInterfaceProcess._ProcSeq = interfaceProcess.Sequence;
dbInterfaceProcess._ProcessAt = interfaceProcess.ProcessAt;
dbInterfaceProcess._BatchAt = interfaceProcess.BatchAt;
dbInterfaceProcess._ElapseSecs = interfaceProcess.ElapseSecs;
dbInterfaceProcess._Status = SacsSystem.GetStatusCode(interfaceProcess.Status);
dbInterfaceProcess._Flags = (short)interfaceProcess.Flags;
if (!SysId.IsValid(interfaceProcess.Id))
{
dbInterfaceProcess._CreateOn = DateTime.Now;
dbInterfaceProcess._CreateBy = dbUpdateInfo.UserId.ToInt();
dbInterfaceProcess._CreateHost = dbUpdateInfo.Host;
}
dbInterfaceProcess._UpdateOn = DateTime.Now;
dbInterfaceProcess._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbInterfaceProcess._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaInterfaceProcess_Db dbInterfaceProcess, SaInterfaceProcess interfaceProcess)
{
//interface.Id = new SysId(dbInterfaceProcess._Id);
//interfaceProcess.InterfaceId = new SysId(dbInterfaceProcess._InterfaceId);
//interfaceProcess.Direction = (SaInterfaceProcessDirection)dbInterfaceProcess._Direction;
//interfaceProcess.Reference = dbInterfaceProcess._ProcRef;
//interfaceProcess.Sequence = dbInterfaceProcess._ProcSeq;
interfaceProcess.ProcessAt = dbInterfaceProcess._ProcessAt;
interfaceProcess.BatchAt = dbInterfaceProcess._BatchAt;
interfaceProcess.ElapseSecs = dbInterfaceProcess._ElapseSecs;
interfaceProcess.Status = SacsSystem.GetStatusForCode(dbInterfaceProcess._Status);
interfaceProcess.SetCreateStamp(dbInterfaceProcess._CreateOn, new SysId(dbInterfaceProcess._CreateBy), dbInterfaceProcess._CreateHost);
interfaceProcess.SetUpdateStamp(dbInterfaceProcess._UpdateOn, new SysId(dbInterfaceProcess._UpdateBy), dbInterfaceProcess._UpdateHost);
interfaceProcess.AcceptChanges();
}
//-------------------------------------------------------------------
// Interface Process column definitions.
private static readonly String aliasInterfaceProcess = "aIntPrc";
private static readonly String aliasInterfaceProcess_Interface = "aIpInt";
private static readonly String prefixInterfaceProcess_Interface = "IpInt_";
private static readonly String colInterfaceProcess_MessageCount = "IntPrcMessageCount";
private static readonly String colInterfaceProcess_DataItemCount = "IntPrcDataItemCount";
private void SetInterfaceProcessColDfn
(ColumnDfn col, String caption, int width, SaInterfaceDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaInterfaceDbDfn.GetTableForColumn(dbCol) == SaInterfaceDbDfn.TableIdx.SaInterfaceProcess)
alias = aliasInterfaceProcess;
col.Set(caption, width, (int)dbCol, prefix + SaInterfaceDbDfn.GetColumnName(dbCol, false), SaInterfaceDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetInterfaceProcessColumnDfn (SaInterfaceProcess.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
switch (columnId)
{
case SaInterfaceProcess.Column.Pos:
SetInterfaceProcessColDfn(columnDfn, "Pos", 45, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaInterfaceProcess.Column.Id:
SetInterfaceProcessColDfn(columnDfn, "Id", 60, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Interface properties.
case SaInterfaceProcess.Column.InterfaceId:
SetInterfaceProcessColDfn(columnDfn, "Interface #", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SaInterfaceProcess.Column.Interface_Context:
SetInterfaceProcessColDfn(columnDfn, "Context", 90, SaInterfaceDbDfn.ColumnIdx.SaInterface_Context, ColumnAlignment.Center, DataValue.DataType.String, aliasInterfaceProcess_Interface, prefixInterfaceProcess_Interface);
break;
case SaInterfaceProcess.Column.Interface_Category:
SetInterfaceProcessColDfn(columnDfn, "Category", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, ColumnAlignment.Center, DataValue.DataType.Long, aliasInterfaceProcess_Interface, prefixInterfaceProcess_Interface);
break;
case SaInterfaceProcess.Column.Interface_Category_Desc:
SetInterfaceProcessColDfn(columnDfn, "Interface Category", 100, SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, ColumnAlignment.Left, DataValue.DataType.String, aliasInterfaceProcess_Interface, prefixInterfaceProcess_Interface);
break;
case SaInterfaceProcess.Column.Interface_Type:
SetInterfaceProcessColDfn(columnDfn, "Type", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Type, ColumnAlignment.Center, DataValue.DataType.Long, aliasInterfaceProcess_Interface, prefixInterfaceProcess_Interface);
break;
case SaInterfaceProcess.Column.Interface_Type_Desc:
SetInterfaceProcessColDfn(columnDfn, "Interface Type", 100, SaInterfaceDbDfn.ColumnIdx.SaInterface_Type, ColumnAlignment.Left, DataValue.DataType.String, aliasInterfaceProcess_Interface, prefixInterfaceProcess_Interface);
break;
case SaInterfaceProcess.Column.Interface_Code:
SetInterfaceProcessColDfn(columnDfn, "Code", 100, SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasInterfaceProcess_Interface, prefixInterfaceProcess_Interface);
break;
case SaInterfaceProcess.Column.Interface_Caption:
SetInterfaceProcessColDfn(columnDfn, "Caption", 160, SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption, ColumnAlignment.Center, DataValue.DataType.String, aliasInterfaceProcess_Interface, prefixInterfaceProcess_Interface);
break;
// Interface Process properties.
case SaInterfaceProcess.Column.ProcessDirection:
SetInterfaceProcessColDfn(columnDfn, "Direction", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Direction, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceProcess.Column.ProcessDirection_Desc:
SetInterfaceProcessColDfn(columnDfn, "Direction", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Direction, ColumnAlignment.Center, DataValue.DataType.String);
break;
case SaInterfaceProcess.Column.ProcessReference:
SetInterfaceProcessColDfn(columnDfn, "Reference", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcRef, ColumnAlignment.Center, DataValue.DataType.String);
break;
case SaInterfaceProcess.Column.ProcessSequence:
SetInterfaceProcessColDfn(columnDfn, "Sequence", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcSeq, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceProcess.Column.ProcessAt:
SetInterfaceProcessColDfn(columnDfn, "Processed", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, ColumnAlignment.Center, DataValue.DataType.DateTime);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt) && Database.ColumnExists(TableName_InterfaceProcess, "ProcDate"))
{
// Legacy column.
columnDfn.DataName = "ProcDate";
columnDfn.SortDataName = aliasInterfaceProcess + "." + columnDfn.DataName;
}
break;
case SaInterfaceProcess.Column.ProcessAt_Date:
SetInterfaceProcessColDfn(columnDfn, "Process on", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, ColumnAlignment.Center, DataValue.DataType.Date);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt) && Database.ColumnExists(TableName_InterfaceProcess, "ProcDate"))
{
// Legacy column.
columnDfn.DataName = "ProcDate";
columnDfn.SortDataName = aliasInterfaceProcess + "." + columnDfn.DataName;
}
break;
case SaInterfaceProcess.Column.ProcessAt_Time:
SetInterfaceProcessColDfn(columnDfn, "Process at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, ColumnAlignment.Center, DataValue.DataType.Time);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt) && Database.ColumnExists(TableName_InterfaceProcess, "ProcTime"))
{
// Legacy column.
columnDfn.DataName = "ProcTime";
columnDfn.SortDataName = aliasInterfaceProcess + "." + columnDfn.DataName;
}
break;
case SaInterfaceProcess.Column.BatchAt:
SetInterfaceProcessColDfn(columnDfn, "Batch at", 100, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt, ColumnAlignment.Center, DataValue.DataType.DateTime);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt) && Database.ColumnExists(TableName_InterfaceProcess, "BatchDate"))
{
// Legacy column.
columnDfn.DataName = "BatchDate";
columnDfn.SortDataName = aliasInterfaceProcess + "." + columnDfn.DataName;
}
break;
case SaInterfaceProcess.Column.BatchAt_Date:
SetInterfaceProcessColDfn(columnDfn, "Batch on", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt, ColumnAlignment.Center, DataValue.DataType.Date);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt) && Database.ColumnExists(TableName_InterfaceProcess, "BatchDate"))
{
// Legacy column.
columnDfn.DataName = "BatchDate";
columnDfn.SortDataName = aliasInterfaceProcess + "." + columnDfn.DataName;
}
break;
case SaInterfaceProcess.Column.BatchAt_Time:
SetInterfaceProcessColDfn(columnDfn, "Batch at", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt, ColumnAlignment.Center, DataValue.DataType.Time);
if (!ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt) && Database.ColumnExists(TableName_InterfaceProcess, "BatchTime"))
{
// Legacy column.
columnDfn.DataName = "BatchTime";
columnDfn.SortDataName = aliasInterfaceProcess + "." + columnDfn.DataName;
}
break;
case SaInterfaceProcess.Column.Elapsed_Secs:
SetInterfaceProcessColDfn(columnDfn, "Elapsed", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ElapseSecs, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterfaceProcess.Column.Elapsed_Fmt:
SetInterfaceProcessColDfn(columnDfn, "Elapsed", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ElapseSecs, ColumnAlignment.Center, DataValue.DataType.String);
break;
// Derived properties.
case SaInterfaceProcess.Column.Message_Count:
SetInterfaceProcessColDfn(columnDfn, "Messages", 70, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colInterfaceProcess_MessageCount;
break;
case SaInterfaceProcess.Column.Message_Status_Desc:
SetInterfaceProcessColDfn(columnDfn, "Message stat", 80, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.String);
break;
case SaInterfaceProcess.Column.Message_Status_Ind:
SetInterfaceProcessColDfn(columnDfn, "Message stat", 80, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaInterfaceProcess.Column.DataItem_Count:
SetInterfaceProcessColDfn(columnDfn, "Data items", 70, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colInterfaceProcess_DataItemCount;
break;
// Common properties.
/*
case SaInterfaceProcess.Column.Notes:
SetInterfaceProcessColDfn(columnDfn, "Notes", 200, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Notes);
break;
*/
case SaInterfaceProcess.Column.Status:
SetInterfaceProcessColDfn(columnDfn, "Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Status, ColumnAlignment.Center);
break;
case SaInterfaceProcess.Column.Status_Desc:
SetInterfaceProcessColDfn(columnDfn, "Status", 90, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Status, ColumnAlignment.Center);
break;
case SaInterfaceProcess.Column.Status_Ind:
SetInterfaceProcessColDfn(columnDfn, "Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaInterfaceProcess.Column.CreateOn_Date:
SetInterfaceProcessColDfn(columnDfn, "Created", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaInterfaceProcess.Column.UpdateOn_Date:
SetInterfaceProcessColDfn(columnDfn, "Updated", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaInterfaceProcess.Column.UpdateHost:
SetInterfaceProcessColDfn(columnDfn, "Update host", 80, SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_UpdateHost, ColumnAlignment.Center);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Interface Process query filter.
public override List<string> GetInterfaceProcessQueryFilter (SaInterfaceProcess.Params prm)
{
List<String> filter = new List<String>();
// Interface Process Id.
String colInterfaceProcess_Id = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess);
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(colInterfaceProcess_Id + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colInterfaceProcess_Id + " NOT IN (" + excludedIds + ")");
// Interface.
String colInterfaceProcess_InterfaceId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId, aliasInterfaceProcess);
if (SysId.IsValid(prm.InterfaceId))
filter.Add(colInterfaceProcess_InterfaceId + "=" + SysId.ToString(prm.InterfaceId));
// Process direction.
String colInterfaceProcess_Direction = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Direction, aliasInterfaceProcess);
if ((int)prm.Direction > 0)
filter.Add(colInterfaceProcess_Direction + "=" + ((int)prm.Direction).ToString());
// Reference.
String colInterfaceProcess_ProcRef = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcRef, aliasInterfaceProcess);
if (!StringUtil.IsEmpty(prm.Reference))
filter.Add(colInterfaceProcess_ProcRef + "='" + DbQuery.FormatForCondition(prm.Reference) + "'");
if (!StringUtil.IsEmpty(prm.ReferencePartial))
filter.Add(colInterfaceProcess_ProcRef + " LIKE '%" + DbQuery.FormatForLike(prm.Reference) + "%'");
// Processed date.
String colInterfaceProcess_ProcessAt = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, aliasInterfaceProcess);
if (ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt))
{
colInterfaceProcess_ProcessAt = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, aliasInterfaceProcess);
if (DateUtil.IsValid(prm.ProcessedOn))
{
filter.Add(colInterfaceProcess_ProcessAt + ">=" + DbQuery.FormatDateForCondition(prm.ProcessedOn.Date));
filter.Add(colInterfaceProcess_ProcessAt + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.ProcessedOn.Date, 1)));
}
if (DateUtil.IsValid(prm.ProcessedFrom))
filter.Add(colInterfaceProcess_ProcessAt + ">=" + DbQuery.FormatDateForCondition(prm.ProcessedFrom.Date));
if (DateUtil.IsValid(prm.ProcessedTo))
filter.Add(colInterfaceProcess_ProcessAt + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.ProcessedTo.Date, 1)));
}
else if (Database.ColumnExists(TableName_InterfaceProcess, "ProcDate"))
{
// Legacy database - ProcDate/Time (integer values) istead of ProcessAt (DateTime).
String colInterfaceProcess_ProcDate = aliasInterfaceProcess+".ProcDate";
if (DateUtil.IsValid(prm.ProcessedOn))
{
filter.Add(colInterfaceProcess_ProcDate + ">=" + DateUtil.DateToInt32(prm.ProcessedOn.Date));
filter.Add(colInterfaceProcess_ProcDate + "<" + DateUtil.DateToInt32(DateUtil.IncrementDate(prm.ProcessedOn.Date, 1)));
}
if (DateUtil.IsValid(prm.ProcessedFrom))
filter.Add(colInterfaceProcess_ProcDate + ">=" + DateUtil.DateToInt32(prm.ProcessedFrom.Date));
if (DateUtil.IsValid(prm.ProcessedTo))
filter.Add(colInterfaceProcess_ProcDate + "<" + DateUtil.DateToInt32(DateUtil.IncrementDate(prm.ProcessedTo.Date, 1)));
}
// Associated messages.
String aliasIntProcMsg = "ipm";
List<String> messageFilter = new List<string>();
// Message text.
String colInterfaceProcessMessage_Msg = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Msg, aliasIntProcMsg);
if (!StringUtil.IsEmpty(prm.MessageText))
messageFilter.Add(colInterfaceProcessMessage_Msg + "='" + DbQuery.FormatForCondition(prm.MessageText) + "'");
if (!StringUtil.IsEmpty(prm.MessageTextPartial))
messageFilter.Add(colInterfaceProcessMessage_Msg + " LIKE '%" + DbQuery.FormatForLike(prm.MessageTextPartial) + "%'");
// Process message filter.
if (messageFilter.Count > 0)
{
String colInterfaceProcessMessage_ProcessId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, aliasIntProcMsg);
filter.Add(colInterfaceProcess_Id + " In (SELECT " + colInterfaceProcessMessage_ProcessId + " FROM " + TableName_InterfaceProcessMessage + " As [" + aliasIntProcMsg + "] WHERE " + messageFilter.Concat(" AND ", "(", ")") + ")");
}
// Status.
String colStatus = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Status, aliasInterfaceProcess);
if (prm.StatusCat == SaInterfaceProcess.StatusCat.AwaitingOnly)
filter.Add(colStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Awaiting) + ")");
else if (prm.StatusCat == SaInterfaceProcess.StatusCat.InProgressOnly)
filter.Add(colStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.InProgress) + ")");
else if (prm.StatusCat == SaInterfaceProcess.StatusCat.CompletedOnly)
filter.Add(colStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Completed) + ")");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Interface Process sort columns.
public List<String> GetInterfaceProcessSortColumns (SaInterfaceProcess.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for InterfaceProcess columns in case of conflict.
String sortCol = String.Empty;
if (SaInterfaceDbDfn.GetTableForColumn((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn) == SaInterfaceDbDfn.TableIdx.SaInterfaceProcess)
{
// Sep2019 Previously assigning alias+column directly but should be unecessary
// as column DataName/SortDataName should have correct alias populated.
// Also Process/Batch date/time columns may reference legacy column names.
//sortCol = SaInterfaceDbDfn.GetColumnNameQual((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn, aliasInterfaceProcess);
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
if (SaInterfaceDbDfn.GetTableForColumn((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn) == SaInterfaceDbDfn.TableIdx.SaInterfaceProcess)
{
if (sortCol.EqualsCI("ProcDate") || sortCol.EndsWithCI(".ProcDate"))
sortColumnNames.Add(DbQuery.FormatForOrderBy("ProcTime", columnDfn.SortAscending, orderByNullMode).Concat(", "));
else if (sortCol.EqualsCI("BatchDate") || sortCol.EndsWithCI(".BatchDate"))
sortColumnNames.Add(DbQuery.FormatForOrderBy("BatchTime", columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId, aliasInterfaceProcess) + " ASC");
if (ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt))
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, aliasInterfaceProcess) + " ASC");
else if (Database.ColumnExists(TableName_InterfaceProcess, "Procdate"))
{
sortColumnNames.Add(aliasInterfaceProcess + ".ProcDate DESC");
sortColumnNames.Add(aliasInterfaceProcess + ".ProcTime DESC");
}
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Interface Process count.
private long GetInterfaceProcessCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(TableName_InterfaceProcess + " As " + aliasInterfaceProcess, filter);
}
public override long GetInterfaceProcessCount (SaInterfaceProcess.Params prm)
{
ClearErrorState();
return GetInterfaceProcessCount(GetInterfaceProcessQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Interface Process list.
public override List<SaInterfaceProcess> GetInterfaceProcessList (SaInterfaceProcess.Params prm)
{
List<SaInterfaceProcess> interfaces = new List<SaInterfaceProcess>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(TableName_InterfaceProcess, aliasInterfaceProcess);
SaInterfaceProcess_Db dbInterfaceProcess = new SaInterfaceProcess_Db_Local(DbInfo);
qry.Columns.AddRange(dbInterfaceProcess.ExistingColumnNames);
qry.Filters.AddRange(GetInterfaceProcessQueryFilter(prm));
qry.OrderBy.AddRange(GetInterfaceProcessSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
interfaces.Add(CreateInterfaceProcess(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterfaceProcessList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaces;
}
//-------------------------------------------------------------------
// Interface Process query.
public override DbResultSet ExecuteInterfaceProcessQuery (List<ColumnDfn> columns, SaInterfaceProcess.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(TableName_InterfaceProcess, aliasInterfaceProcess);
// Add columns as defined in query list.
if (columns.HasId((int)SaInterfaceProcess.Column.Id))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.InterfaceId))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.ProcessDirection) || columns.HasId((int)SaInterfaceProcess.Column.ProcessDirection_Desc))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Direction, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.ProcessReference))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcRef, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.ProcessSequence))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcSeq, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.ProcessAt) || columns.HasId((int)SaInterfaceProcess.Column.ProcessAt_Date) || columns.HasId((int)SaInterfaceProcess.Column.ProcessAt_Time))
{
if (ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, aliasInterfaceProcess));
else if (Database.ColumnExists(TableName_InterfaceProcess, "ProcDate"))
{
// Legacy columns.
query.Columns.Add(aliasInterfaceProcess + ".ProcDate");
query.Columns.Add(aliasInterfaceProcess + ".ProcTime");
}
}
if (columns.HasId((int)SaInterfaceProcess.Column.BatchAt) || columns.HasId((int)SaInterfaceProcess.Column.BatchAt_Date) || columns.HasId((int)SaInterfaceProcess.Column.BatchAt_Time))
{
if (ColumnExists(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt, aliasInterfaceProcess));
else if (Database.ColumnExists(TableName_InterfaceProcess, "BatchDate"))
{
// Legacy columns.
query.Columns.Add(aliasInterfaceProcess + ".BatchDate");
query.Columns.Add(aliasInterfaceProcess + ".BatchTime");
}
}
if (columns.HasId((int)SaInterfaceProcess.Column.Elapsed_Secs) || columns.HasId((int)SaInterfaceProcess.Column.Elapsed_Fmt))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ElapseSecs, aliasInterfaceProcess));
/*
if (columns.HasId((int)SaInterfaceProcess.Column.Notes))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Notes, aliasInterfaceProcess));
*/
if (columns.HasId((int)SaInterfaceProcess.Column.Status) || columns.HasId((int)SaInterfaceProcess.Column.Status_Desc) || columns.HasId((int)SaInterfaceProcess.Column.Status_Ind))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Status, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.CreateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_CreateOn, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.UpdateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_UpdateOn, aliasInterfaceProcess));
if (columns.HasId((int)SaInterfaceProcess.Column.UpdateHost))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_UpdateHost, aliasInterfaceProcess));
//---------------------------------------------------------------------
// Interface properties.
bool hasInterfaceCols =
(columns.HasId((int)SaInterfaceProcess.Column.Interface_Context) ||
columns.HasId((int)SaInterfaceProcess.Column.Interface_Category) ||
columns.HasId((int)SaInterfaceProcess.Column.Interface_Category_Desc) ||
columns.HasId((int)SaInterfaceProcess.Column.Interface_Type) ||
columns.HasId((int)SaInterfaceProcess.Column.Interface_Type_Desc) ||
columns.HasId((int)SaInterfaceProcess.Column.Interface_Code) ||
columns.HasId((int)SaInterfaceProcess.Column.Interface_Caption));
if (hasInterfaceCols)
{
DbQueryJoin joinInt = new DbQueryJoin(DbJoinType.LeftOuter);
joinInt.Table = new StringPair(TableName_Interface, aliasInterfaceProcess_Interface);
joinInt.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, aliasInterfaceProcess_Interface) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId, aliasInterfaceProcess));
query.Joins.Add(joinInt);
List<SaInterfaceDbDfn.ColumnIdx> cols = new List<SaInterfaceDbDfn.ColumnIdx>();
cols.Add(SaInterfaceDbDfn.ColumnIdx.SaInterface_Context);
cols.Add(SaInterfaceDbDfn.ColumnIdx.SaInterface_Category);
cols.Add(SaInterfaceDbDfn.ColumnIdx.SaInterface_Type);
cols.Add(SaInterfaceDbDfn.ColumnIdx.SaInterface_Code);
cols.Add(SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption);
foreach (var col in cols)
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(col, aliasInterfaceProcess_Interface), prefixInterfaceProcess_Interface + SaInterfaceDbDfn.GetColumnName(col, false));
}
//---------------------------------------------------------------------
// Message count.
if (columns.HasId((int)SaInterfaceProcess.Column.Message_Count))
{
String alias = "IpMsg";
DbQuery queryProcess = new DbQuery(Database.DbmsType);
queryProcess.Tables.Add(TableName_InterfaceProcessMessage, alias);
queryProcess.Columns.Add("Count(*)");
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, alias) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess));
query.Columns.Add("(" + queryProcess.BuildQuery() + ")", colInterfaceProcess_MessageCount);
}
//---------------------------------------------------------------------
// Message status.
if (columns.HasId((int)SaInterfaceProcess.Column.Message_Status_Desc) || columns.HasId((int)SaInterfaceProcess.Column.Message_Status_Ind))
{
// Count messages by type: error, warning, other.
String messageTypeFatal = MessageLevels.GetCodeForType(SaMessageLevel.Fatal);
String messageTypeException = MessageLevels.GetCodeForType(SaMessageLevel.Exception);
String messageTypeError = MessageLevels.GetCodeForType(SaMessageLevel.Error);
String messageTypeWarning = MessageLevels.GetCodeForType(SaMessageLevel.Warning);
// Error message count.
String alias = "IpMsg";
DbQuery queryProcess = new DbQuery(Database.DbmsType);
queryProcess.Tables.Add(TableName_InterfaceProcessMessage, alias);
queryProcess.Columns.Add("Count(*)");
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, alias) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess));
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_MsgType, alias) + " IN (" + new List<String>() { messageTypeFatal, messageTypeException, messageTypeError }.Concat(",", "'", "'") + ")");
query.Columns.Add("(" + queryProcess.BuildQuery() + ")", colInterfaceProcess_MessageStatusErr);
// Warning message count.
queryProcess = new DbQuery(Database.DbmsType);
queryProcess.Tables.Add(TableName_InterfaceProcessMessage, alias);
queryProcess.Columns.Add("Count(*)");
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, alias) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess));
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_MsgType, alias) + " IN (" + new List<String>() { messageTypeWarning, MessageTypeWarningAlt }.Concat(",", "'", "'") + ")");
query.Columns.Add("(" + queryProcess.BuildQuery() + ")", colInterfaceProcess_MessageStatusWrn);
// Other message count.
queryProcess = new DbQuery(Database.DbmsType);
queryProcess.Tables.Add(TableName_InterfaceProcessMessage, alias);
queryProcess.Columns.Add("Count(*)");
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, alias) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess));
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_MsgType, alias) + " NOT IN (" + new List<String>() { messageTypeFatal, messageTypeException, messageTypeError, messageTypeWarning, MessageTypeWarningAlt }.Concat(",", "'", "'") + ")");
query.Columns.Add("(" + queryProcess.BuildQuery() + ")", colInterfaceProcess_MessageStatusInf);
}
//---------------------------------------------------------------------
// Data Item count.
if (columns.HasId((int)SaInterfaceProcess.Column.DataItem_Count))
{
String alias = "IpDatItm";
DbQuery queryDataItem = new DbQuery(Database.DbmsType);
queryDataItem.Tables.Add(TableName_InterfaceProcess, alias);
queryDataItem.Columns.Add("Count(*)");
queryDataItem.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessDataItem_ProcessId, alias) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess));
query.Columns.Add("(" + queryDataItem.BuildQuery() + ")", colInterfaceProcess_DataItemCount);
}
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetInterfaceProcessQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetInterfaceProcessSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,577 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
public partial class SaInterfaceMgr_Dbas
{
//*******************************************************************
// I n t e r f a c e s
//*******************************************************************
// Associated data.
public override bool InterfaceHasProcesses (SysId id)
{
ClearErrorState();
String filter = SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId) + "=" + SysId.ToString(id);
return (Database.GetRowCount(TableName_InterfaceProcess, filter) > 0);
}
public override bool InterfaceHasDataItems (SysId id)
{
ClearErrorState();
String filter = SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_InterfaceId) + "=" + SysId.ToString(id);
return (Database.GetRowCount(TableName_InterfaceDataItem, filter) > 0);
}
// Process sequence.
public override int GetMaxProcessSequenceForInterface (SysId interfaceId, SaInterfaceProcessDirection processDirection)
{
ClearErrorState();
if (!SysId.IsValid(interfaceId)) return 0;
List<String> filter = new List<string>();
filter.Add(SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId) + "=" + SysId.ToString(interfaceId));
filter.Add(SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Direction) + "=" + ((int)processDirection).ToString());
DataValue maxSequence = Database.GetRowValue(TableName_InterfaceProcess, "Max(" + SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcSeq, false) + ")", filter.Concat(" AND ", "(", ")"));
return (maxSequence.IsValid() ? (int)maxSequence.AsLong() : 0);
}
//-------------------------------------------------------------------
// Create Item.
public override SaInterface CreateInterface (String context, SaInterfaceCategory category, short type)
{
ClearErrorState();
return new SaInterface_Dbas(null, context, category, type, 0);
}
private SaInterface CreateInterface (SaInterface_Db dbInterface)
{
ClearErrorState();
SaInterface saInterface = new SaInterface_Dbas(new SysId(dbInterface._Id), dbInterface._Context, (SaInterfaceCategory)dbInterface._Category, dbInterface._Type, (ushort)dbInterface._Flags);
PopulateFrom(dbInterface, saInterface);
return saInterface;
}
private SaInterface CreateInterface (DbDataReader dataReader)
{
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
dbInterface.PopulateFrom(dataReader);
return CreateInterface(dbInterface);
}
//-------------------------------------------------------------------
// Item exists.
public override bool InterfaceExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetInterfaceCount(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, aliasInterface) + "=" + SysId.ToString(id)) == 1;
}
public override bool InterfaceExistsByCode (String code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return false;
return GetInterfaceCount(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, aliasInterface) + "='" + DbQuery.FormatForCondition(code) + "'") == 1;
}
//-------------------------------------------------------------------
// Get Item.
public override SaInterface GetInterface (SaInterface.Params prm)
{
return GetInterface(GetInterfaceQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaInterface GetInterface (String filter)
{
ClearErrorState();
if (GetInterfaceCount(filter) != 1) return null;
SaInterface interfaceObj = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
dbInterface.PopulateFrom(dbCommand, aliasInterface, filter);
interfaceObj = CreateInterface(dbInterface);
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterface\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaceObj;
}
public override SaInterface GetInterfaceById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetInterface("Id=" + SysId.ToString(id));
}
public override SaInterface GetInterfaceByContextCode (String context, String code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return null;
return GetInterface("Context='" + DbQuery.FormatForCondition(context) + "' And Code='" + DbQuery.FormatForCondition(code) + "'");
}
//-------------------------------------------------------------------
// Validate Item properties.
public override bool IsValidInterfaceData (SaInterface.Data interfaceData, SaInterface.ErrField errField)
{
ClearErrorState();
if (!base.IsValidInterfaceData(interfaceData, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Item.
public override bool InsertInterface (SaInterface interfaceObj, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterface(interfaceObj)) return false;
if (SysId.IsValid(interfaceObj.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
PopulateTo(dbInterface, interfaceObj, dbUpdateInfo);
if (SaInterface_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbInterface._Id = SysId.ToInt(Database.GetNextId(dbInterface.TableName, dbUpdateInfo));
}
dbInterface.ExecuteInsertCommand(dbCommand);
interfaceObj.Id = new SysId(dbInterface._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Item.
public override bool UpdateInterface (SaInterface interfaceObj, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidInterface(interfaceObj)) return false;
if (!SysId.IsValid(interfaceObj.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
dbInterface.PopulateFrom(dbCommand, aliasInterface, "Id=" + SysId.ToString(interfaceObj.Id));
// Update properties.
PopulateTo(dbInterface, interfaceObj, dbUpdateInfo);
dbInterface.ExecuteUpdateCommand(dbCommand);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Item.
public override bool InterfaceCanBeDeleted (SaInterface interfaceObj)
{
ClearErrorState();
if (!base.InterfaceCanBeDeleted(interfaceObj)) return false;
return true;
}
public override bool DeleteInterface (SaInterface interfaceObj, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!InterfaceCanBeDeleted(interfaceObj)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve interface.
dbConnection.Open();
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
dbInterface.PopulateFrom(dbCommand, aliasInterface, "Id=" + SysId.ToString(interfaceObj.Id));
// Delete interface.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + TableName_Interface + " WHERE Id=" + SysId.ToString(interfaceObj.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (SaInterface_Db dbInterface, SaInterface interfaceObj, DbUpdateInfo dbUpdateInfo)
{
dbInterface._Id = interfaceObj.Id.ToInt();
dbInterface._Context = interfaceObj.Context;
dbInterface._Category = (short)interfaceObj.Category;
dbInterface._Type = interfaceObj.Type;
dbInterface._Code = interfaceObj.Code;
dbInterface._Caption = interfaceObj.Caption;
// Common properties.
dbInterface._Notes = interfaceObj.Notes;
dbInterface._Status = SacsSystem.GetStatusCode(interfaceObj.Status);
dbInterface._Flags = (short)interfaceObj.Flags;
if (!SysId.IsValid(interfaceObj.Id))
{
dbInterface._CreateOn = DateTime.Now;
dbInterface._CreateBy = dbUpdateInfo.UserId.ToInt();
dbInterface._CreateHost = dbUpdateInfo.Host;
}
dbInterface._UpdateOn = DateTime.Now;
dbInterface._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbInterface._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaInterface_Db dbInterface, SaInterface interfaceObj)
{
//interface.Id = new SysId(dbInterface._Id);
//interfaceObj.Context = dbInterface._Context;
//interfaceObj.Category = (SaInterfaceCategory)dbInterface._Category;
//interfaceObj.Type = dbInterface._Type;
interfaceObj.Code = dbInterface._Code;
interfaceObj.Caption = dbInterface._Caption;
// Common properties.
interfaceObj.Notes = dbInterface._Notes;
interfaceObj.Status = SacsSystem.GetStatusForCode(dbInterface._Status);
interfaceObj.SetCreateStamp(dbInterface._CreateOn, new SysId(dbInterface._CreateBy), dbInterface._CreateHost);
interfaceObj.SetUpdateStamp(dbInterface._UpdateOn, new SysId(dbInterface._UpdateBy), dbInterface._UpdateHost);
interfaceObj.AcceptChanges();
}
//-------------------------------------------------------------------
// Column definitions.
private static readonly String aliasInterface = "aInt";
private static readonly String colInterface_ProcessCount = "IntProcessCount";
private static readonly String colInterface_DataItemCount = "IntDataItemCount";
private void SetInterfaceColDfn
(ColumnDfn col, String caption, int width, SaInterfaceDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaInterfaceDbDfn.GetTableForColumn(dbCol) == SaInterfaceDbDfn.TableIdx.SaInterface)
alias = aliasInterface;
col.Set(caption, width, (int)dbCol, prefix + SaInterfaceDbDfn.GetColumnName(dbCol, false), SaInterfaceDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetInterfaceColumnDfn (SaInterface.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SaInterface.Column.Pos:
SetInterfaceColDfn(columnDfn, "Pos", 45, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
// Interface properties.
case SaInterface.Column.Id:
SetInterfaceColDfn(columnDfn, "Id", 60, SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaInterface.Column.Context:
SetInterfaceColDfn(columnDfn, "Context", 90, SaInterfaceDbDfn.ColumnIdx.SaInterface_Context);
break;
case SaInterface.Column.Category:
SetInterfaceColDfn(columnDfn, "Category", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterface.Column.Category_Desc:
SetInterfaceColDfn(columnDfn, "Category", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, ColumnAlignment.Center);
break;
case SaInterface.Column.Type:
SetInterfaceColDfn(columnDfn, "Type", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Type, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaInterface.Column.Type_Desc:
SetInterfaceColDfn(columnDfn, "Type", 100, SaInterfaceDbDfn.ColumnIdx.SaInterface_Type, ColumnAlignment.Center);
break;
case SaInterface.Column.Code:
SetInterfaceColDfn(columnDfn, "Code", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Code);
break;
case SaInterface.Column.Caption:
SetInterfaceColDfn(columnDfn, "Caption", 120, SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption);
break;
case SaInterface.Column.Active_Y:
SetInterfaceColDfn(columnDfn, "Active", 60, SaInterfaceDbDfn.ColumnIdx.SaInterface_Flags, ColumnAlignment.Center);
break;
case SaInterface.Column.Active_TickCross:
SetInterfaceColDfn(columnDfn, "Active", 60, SaInterfaceDbDfn.ColumnIdx.SaInterface_Flags, ColumnAlignment.Center, DataValue.DataType.Bool);
columnDfn.BoolFormat = ColumnBoolFormat.Tick;
break;
case SaInterface.Column.Active_Ind:
SetInterfaceColDfn(columnDfn, "Active", 60, SaInterfaceDbDfn.ColumnIdx.SaInterface_Flags, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
// Derived properties.
case SaInterface.Column.Process_Count:
SetInterfaceColDfn(columnDfn, "Processes", 70, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colInterface_ProcessCount;
break;
case SaInterface.Column.DataItem_Count:
SetInterfaceColDfn(columnDfn, "Data items", 70, SaInterfaceDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colInterface_DataItemCount;
break;
// Common properties.
case SaInterface.Column.Notes:
SetInterfaceColDfn(columnDfn, "Notes", 200, SaInterfaceDbDfn.ColumnIdx.SaInterface_Notes);
break;
case SaInterface.Column.Status:
SetInterfaceColDfn(columnDfn, "Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Status, ColumnAlignment.Center);
break;
case SaInterface.Column.Status_Desc:
SetInterfaceColDfn(columnDfn, "Status", 90, SaInterfaceDbDfn.ColumnIdx.SaInterface_Status, ColumnAlignment.Center);
break;
case SaInterface.Column.Status_Ind:
SetInterfaceColDfn(columnDfn, "Status", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaInterface.Column.CreateOn_Date:
SetInterfaceColDfn(columnDfn, "Created", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaInterface.Column.UpdateOn_Date:
SetInterfaceColDfn(columnDfn, "Updated", 80, SaInterfaceDbDfn.ColumnIdx.SaInterface_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Query filter.
public override List<string> GetInterfaceQueryFilter (SaInterface.Params prm)
{
List<String> filter = new List<String>();
// Interface Id.
String colId = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, aliasInterface);
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(colId + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colId + " NOT IN (" + excludedIds + ")");
// Context.
String colContext = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Context, aliasInterface);
if (!StringUtil.IsEmpty(prm.Context))
filter.Add(colContext + "='" + DbQuery.FormatForCondition(prm.Context) + "'");
// Category.
String colCategory = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, aliasInterface);
if ((int)prm.InterfaceCategory > 0)
filter.Add(colCategory + "=" + ((int)prm.InterfaceCategory).ToString());
// Type.
String colType = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Type, aliasInterface);
if (prm.IncludedInterfaceTypes.Count > 0)
filter.Add(colType + " In (" + String.Join(",", prm.IncludedInterfaceTypes) + ")");
// Code.
String colCode = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, aliasInterface);
if (!StringUtil.IsEmpty(prm.Code))
filter.Add(colCode + "='" + DbQuery.FormatForCondition(prm.Code) + "'");
// Caption.
String colCaption = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption, aliasInterface);
if (!StringUtil.IsEmpty(prm.CaptionPartial))
filter.Add(colCaption + " Like '%" + DbQuery.FormatForLike(prm.CaptionPartial) + "%'");
// Interface text - code or caption.
if (!StringUtil.IsEmpty(prm.InterfaceText))
filter.Add(colCode + " Like '%" + DbQuery.FormatForLike(prm.InterfaceText) + "%' Or "+ colCaption + " Like '%" + DbQuery.FormatForLike(prm.InterfaceText) + "%'");
// Active flag.
String colFlags = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Flags, aliasInterface);
if (prm.ActiveOnly)
filter.Add(DbQuery.BuildBitMappedFilter(colFlags, SaInterface.Flag_Active, true));
// Status.
String colStatus = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Status, aliasInterface);
if (prm.StatusCat == SaInterface.StatusCat.ActiveOnly)
filter.Add(colStatus + " In ('" + SacsSystem.GetStatusCode(SaStatus.Active) + "')");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Sort columns.
public List<String> GetInterfaceSortColumns (SaInterface.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for Interface columns in case of conflict.
String sortCol = String.Empty;
if (SaInterfaceDbDfn.GetTableForColumn((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn) == SaInterfaceDbDfn.TableIdx.SaInterface)
{
sortCol = SaInterfaceDbDfn.GetColumnNameQual((SaInterfaceDbDfn.ColumnIdx)columnDfn.DbColumn, aliasInterface);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
{
sortCol = columnDfn.SortDataName;
}
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, aliasInterface) + " ASC");
sortColumnNames.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, aliasInterface) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Item count.
private long GetInterfaceCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(TableName_Interface + " As " + aliasInterface, filter);
}
public override long GetInterfaceCount (SaInterface.Params prm)
{
ClearErrorState();
return GetInterfaceCount(GetInterfaceQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Item list.
public override List<SaInterface> GetInterfaceList (SaInterface.Params prm)
{
List<SaInterface> interfaces = new List<SaInterface>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(TableName_Interface, aliasInterface);
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
qry.Columns.AddRange(dbInterface.ExistingColumnNames);
qry.Filters.AddRange(GetInterfaceQueryFilter(prm));
qry.OrderBy.AddRange(GetInterfaceSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
interfaces.Add(CreateInterface(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetInterfaceList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return interfaces;
}
//-------------------------------------------------------------------
// Item query.
public override DbResultSet ExecuteInterfaceQuery (List<ColumnDfn> columns, SaInterface.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(TableName_Interface, aliasInterface);
// Add columns as defined in query list.
if (columns.HasId((int)SaInterface.Column.Id))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Context) || columns.HasId((int)SaInterface.Column.Type_Desc))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Context, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Category) || columns.HasId((int)SaInterface.Column.Category_Desc) || columns.HasId((int)SaInterface.Column.Type_Desc))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Type) || columns.HasId((int)SaInterface.Column.Type_Desc))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Type, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Code))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Caption))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Active_Y) || columns.HasId((int)SaInterface.Column.Active_TickCross) || columns.HasId((int)SaInterface.Column.Active_Ind))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Flags, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Notes))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Notes, aliasInterface));
if (columns.HasId((int)SaInterface.Column.Status) || columns.HasId((int)SaInterface.Column.Status_Desc) || columns.HasId((int)SaInterface.Column.Status_Ind))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Status, aliasInterface));
if (columns.HasId((int)SaInterface.Column.CreateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_CreateOn, aliasInterface));
if (columns.HasId((int)SaInterface.Column.UpdateOn_Date))
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_UpdateOn, aliasInterface));
//---------------------------------------------------------------------
// Process count.
if (columns.HasId((int)SaInterface.Column.Process_Count))
{
String alias = "IntPrc";
DbQuery queryProcess = new DbQuery(Database.DbmsType);
queryProcess.Tables.Add(TableName_InterfaceProcess, alias);
queryProcess.Columns.Add("Count(*)");
queryProcess.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId, alias) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, aliasInterface));
query.Columns.Add("(" + queryProcess.BuildQuery() + ")", colInterface_ProcessCount);
}
//---------------------------------------------------------------------
// Data Item count.
if (columns.HasId((int)SaInterface.Column.DataItem_Count))
{
String alias = "IntDatItm";
DbQuery queryDataItem = new DbQuery(Database.DbmsType);
queryDataItem.Tables.Add(TableName_InterfaceDataItem, alias);
queryDataItem.Columns.Add("Count(*)");
queryDataItem.Filters.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_InterfaceId, alias) + "=" + SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, aliasInterface));
query.Columns.Add("(" + queryDataItem.BuildQuery() + ")", colInterface_DataItemCount);
}
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetInterfaceQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetInterfaceSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Dbas.Data;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
public partial class SaInterfaceMgr_Dbas : SaInterfaceMgr
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Static initialisation.
static SaInterfaceMgr_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
internal SaInterfaceMgr_Dbas (SaInterfaceConsole_Dbas interfaceConsole) :
base(interfaceConsole)
{
Database = interfaceConsole.Database;
DbInfo = new DbDataItem.DatabaseInfo(interfaceConsole.Database);
// Verify Interface table names.
// NB Some databases omit the 'Sa' prefix.
if (!Database.TableExists(TableName_Interface) && !Database.TableExists(TableName_InterfaceDataItem) && !Database.TableExists(TableName_InterfaceProcess) && !Database.TableExists(TableName_InterfaceProcessDataItem) && !Database.TableExists(TableName_InterfaceProcessMessage))
{
if (Database.TableExists("Interface") && Database.TableExists("InterfaceDataItem") && Database.TableExists("InterfaceProcess") && Database.TableExists("InterfaceProcessDataItem") && Database.TableExists("InterfaceProcessMessage"))
{
TableName_Interface = "Interface";
TableName_InterfaceProcess = "InterfaceProcess";
TableName_InterfaceProcessMessage = "InterfaceProcessMessage";
TableName_InterfaceDataItem = "InterfaceDataItem";
TableName_InterfaceProcessDataItem = "InterfaceProcessDataItem";
SaLogger.Info(GetType().Name+".CTR Switching to Interface table names without 'Sa' prefix");
}
}
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; }
private DbDataItem.DatabaseInfo DbInfo { get; }
public String TableName_Interface { get; } = SaInterfaceDbDfn.GetTableName(SaInterfaceDbDfn.TableIdx.SaInterface);
public String TableName_InterfaceProcess { get; } = SaInterfaceDbDfn.GetTableName(SaInterfaceDbDfn.TableIdx.SaInterfaceProcess);
public String TableName_InterfaceProcessMessage { get; } = SaInterfaceDbDfn.GetTableName(SaInterfaceDbDfn.TableIdx.SaInterfaceProcessMessage);
public String TableName_InterfaceDataItem { get; } = SaInterfaceDbDfn.GetTableName(SaInterfaceDbDfn.TableIdx.SaInterfaceDataItem);
public String TableName_InterfaceProcessDataItem { get; } = SaInterfaceDbDfn.GetTableName(SaInterfaceDbDfn.TableIdx.SaInterfaceProcessDataItem);
public override bool DatabaseIsValid { get { return (Database != null && Database.GetTableNames().Contains(TableName_Interface) && Database.GetTableNames().Contains(TableName_InterfaceProcess)); } }
public override bool CanUpdateDatabase { get { return DatabaseIsValid; } }
//-------------------------------------------------------------------
// Utilities.
public override bool ColumnExists (SaInterfaceDbDfn.ColumnIdx columnIdx)
{
SaInterfaceDbDfn.TableIdx tableIdx = SaInterfaceDbDfn.GetTableForColumn(columnIdx);
String tableName = SaInterfaceDbDfn.GetTableName(tableIdx, false);
switch (tableIdx)
{
// Ensure correct table name used - with/without 'Sa' prefix.
case SaInterfaceDbDfn.TableIdx.SaInterface: tableName = TableName_Interface; break;
case SaInterfaceDbDfn.TableIdx.SaInterfaceProcess: tableName = TableName_InterfaceProcess; break;
case SaInterfaceDbDfn.TableIdx.SaInterfaceProcessMessage: tableName = TableName_InterfaceProcessMessage; break;
case SaInterfaceDbDfn.TableIdx.SaInterfaceDataItem: tableName = TableName_InterfaceDataItem; break;
case SaInterfaceDbDfn.TableIdx.SaInterfaceProcessDataItem: tableName = TableName_InterfaceProcessDataItem; break;
}
String columnName = SaInterfaceDbDfn.GetColumnName(columnIdx, false);
return Database.ColumnExists(tableName, columnName);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,20 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Interfaces;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
internal class SaInterfaceProcessMessage_Dbas : SaInterfaceProcessMessage
{
//-------------------------------------------------------------------
// Construction.
public SaInterfaceProcessMessage_Dbas (SysId id, SysId interfaceProcessId, ushort flags) :
base(id, interfaceProcessId)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,187 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
using System;
using System.Collections.Generic;
using System.Data.Common;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.App;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:58
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Interfaces
{
/// <summary>
/// Interface Process database object.
/// <para>Handles legacy columns for ProcessAt (ProcDate/Time) and BatchAt (BatchDate/Time).</para>
/// </summary>
internal class SaInterfaceProcess_Db_Local : SaInterfaceProcess_Db
{
//-------------------------------------------------------------------
// Data members.
private String colNameProcDate = "ProcDate";
private String colNameProcTime= "ProcTime";
private String colNameBatchDate = "BatchDate";
private String colNameBatchTime= "BatchTime";
private bool colExists_ProcessAt = false;
private bool colExists_ProcDate = false;
private bool colExists_ProcTime = false;
private bool colExists_BatchAt = false;
private bool colExists_BatchDate = false;
private bool colExists_BatchTime = false;
//-------------------------------------------------------------------
// Construction.
internal SaInterfaceProcess_Db_Local (IDatabaseInfo dbInfo) : base(dbInfo)
{
colExists_ProcessAt = ColumnExists(SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcessAt, false));
colExists_ProcDate = ColumnExists(colNameProcDate);
colExists_ProcTime = ColumnExists(colNameProcTime);
colExists_BatchAt = ColumnExists(SaInterfaceDbDfn.GetColumnName(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_BatchAt, false));
colExists_BatchDate = ColumnExists(colNameBatchDate);
colExists_BatchTime = ColumnExists(colNameBatchTime);
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
if (colExists_ProcessAt)
{
base.PopulateFrom(dbCommand, tableAlias, filter);
return;
}
// Cater for legacy column names by returning all columns.
dbCommand.CommandText = "SELECT * FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " + (!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
String fn = this.GetFn("PopulateFrom");
base.PopulateFrom(dbDataReader);
// 'Process At' legacy fields: ProcDate (Int32) & ProcTime (Int32).
if (!DateUtil.IsValid(_ProcessAt) && colExists_ProcDate && colExists_ProcTime)
{
try
{
// Populate Process datetime from 'ProcDate/Time' integer fields.
_ProcessAt = DateUtil.SetTime(DateUtil.Int32ToDate(dbDataReader.GetInt32(GetColumnOrdinal(dbDataReader, colNameProcDate))), DateUtil.Int32ToTime(dbDataReader.GetInt32(GetColumnOrdinal(dbDataReader, colNameProcTime))));
}
catch (Exception exc) { SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc)); }
}
// 'Batch At' legacy fields: BatchDate (Int32) & BatchTime (Int32).
if (!DateUtil.IsValid(_BatchAt) && colExists_BatchDate && colExists_BatchTime)
{
try
{
// Populate Batch datetime from 'BatchDate/Time' integer fields.
_BatchAt = DateUtil.SetTime(DateUtil.Int32ToDate(dbDataReader.GetInt32(GetColumnOrdinal(dbDataReader, colNameBatchDate))), DateUtil.Int32ToTime(dbDataReader.GetInt32(GetColumnOrdinal(dbDataReader, colNameBatchTime))));
}
catch (Exception exc) { SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc)); }
}
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
if (colExists_ProcessAt)
return ExecuteInsertCommand(dbCommand);
// Support for legacy column names - assumes SQL Server.
List<StringPair> columnValues = new List<StringPair>();
SacsDatabase.AddValuePair(columnValues, "Id", _Id);
SacsDatabase.AddValuePair(columnValues, "InterfaceId", _InterfaceId);
SacsDatabase.AddValuePair(columnValues, "Direction", _Direction);
SacsDatabase.AddValuePair(columnValues, "ProcRef", _ProcRef, true);
SacsDatabase.AddValuePair(columnValues, "ProcSeq", _ProcSeq);
if (colExists_ProcDate && colExists_ProcTime)
{
SacsDatabase.AddValuePair(columnValues, colNameProcDate, DateUtil.DateToInt32(_ProcessAt));
SacsDatabase.AddValuePair(columnValues, colNameProcTime, DateUtil.TimeToInt32(_ProcessAt));
}
if (colExists_BatchDate && colExists_BatchTime)
{
SacsDatabase.AddValuePair(columnValues, colNameBatchDate, DateUtil.DateToInt32(_BatchAt));
SacsDatabase.AddValuePair(columnValues, colNameBatchTime, DateUtil.TimeToInt32(_BatchAt));
}
SacsDatabase.AddValuePair(columnValues, "ElapseSecs", _ElapseSecs);
SacsDatabase.AddValuePair(columnValues, "ItemCount", _ItemCount);
SacsDatabase.AddValuePair(columnValues, "Flags", _Flags);
SacsDatabase.AddValuePair(columnValues, "Status", _Status, true);
SacsDatabase.AddValuePair(columnValues, "CreateOn", _CreateOn);
SacsDatabase.AddValuePair(columnValues, "CreateBy", _CreateBy);
SacsDatabase.AddValuePair(columnValues, "CreateHost", _CreateHost, true);
SacsDatabase.AddValuePair(columnValues, "UpdateOn", _UpdateOn);
SacsDatabase.AddValuePair(columnValues, "UpdateBy", _UpdateBy);
SacsDatabase.AddValuePair(columnValues, "UpdateHost", _UpdateHost, true);
// Insert statement.
dbCommand.CommandText =
"INSERT INTO " + TableNameFmt + " " +
"(" + columnValues.GetValues(StringPair.Value.Value1).Concat(", ") + ") " +
"VALUES (" + columnValues.GetValues(StringPair.Value.Value2).Concat(", ") + ");";
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
if (colExists_ProcessAt)
return ExecuteUpdateCommand(dbCommand);
// Support for legacy column names - assumes SQL Server.
List<StringPair> columnValues = new List<StringPair>();
SacsDatabase.AddValuePair(columnValues, "ProcRef", _ProcRef, true);
SacsDatabase.AddValuePair(columnValues, "ProcSeq", _ProcSeq);
if (colExists_ProcDate && colExists_ProcTime)
{
SacsDatabase.AddValuePair(columnValues, colNameProcDate, DateUtil.DateToInt32(_ProcessAt));
SacsDatabase.AddValuePair(columnValues, colNameProcTime, DateUtil.TimeToInt32(_ProcessAt));
}
if (colExists_BatchDate && colExists_BatchTime)
{
SacsDatabase.AddValuePair(columnValues, colNameBatchDate, DateUtil.DateToInt32(_BatchAt));
SacsDatabase.AddValuePair(columnValues, colNameBatchTime, DateUtil.TimeToInt32(_BatchAt));
}
SacsDatabase.AddValuePair(columnValues, "ElapseSecs", _ElapseSecs);
SacsDatabase.AddValuePair(columnValues, "ItemCount", _ItemCount);
SacsDatabase.AddValuePair(columnValues, "Flags", _Flags);
SacsDatabase.AddValuePair(columnValues, "Status", _Status, true);
SacsDatabase.AddValuePair(columnValues, "UpdateOn", _UpdateOn);
SacsDatabase.AddValuePair(columnValues, "UpdateBy", _UpdateBy);
SacsDatabase.AddValuePair(columnValues, "UpdateHost", _UpdateHost, true);
// Update statement.
dbCommand.CommandText =
"UPDATE " + TableNameFmt + " " +
"SET " + columnValues.Concat("=").Concat(", ") + " " +
"WHERE Id=" + _Id.ToString() + ";";
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,22 @@
using System;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Interfaces;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
internal class SaInterfaceProcess_Dbas : SaInterfaceProcess
{
//-------------------------------------------------------------------
// Construction.
public SaInterfaceProcess_Dbas (SysId id, SysId interfaceId, SaInterfaceProcessDirection direction, String reference, int sequence, ushort flags) :
base(id, interfaceId, direction, reference, sequence)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,22 @@
using System;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Interfaces;
namespace Sarand.Net.Standard.Dbas.Interfaces
{
//=======================================================================
internal class SaInterface_Dbas : SaInterface
{
//-------------------------------------------------------------------
// Construction.
public SaInterface_Dbas (SysId id, String context, SaInterfaceCategory category, short type, ushort flags) :
base(id,context,category,type)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,272 @@
<?xml version="1.0"?>
<DbDfnDatabase xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Tables>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>SaItemData</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>1</Pos>
<Name>Id</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>2</Pos>
<Name>ItemType</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>3</Pos>
<Name>ItemId</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>4</Pos>
<Name>DataType</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>50</Size>
<BufferLen>100</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>5</Pos>
<Name>ItemData</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>0</Size>
<BufferLen>0</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>6</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>7</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>8</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>6</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>9</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>10</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>11</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>12</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>13</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Pos>14</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaItemData</Table>
<Name>PK_SaItemData</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Id</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
</Tables>
</DbDfnDatabase>
@@ -0,0 +1,219 @@
using Microsoft.Data.SqlClient;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:50
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ItemData.Internal
{
internal class SaItemData_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId");
public ColumnDataString _DataType { get; } = new ColumnDataString("DataType");
public ColumnDataString _ItemData { get; } = new ColumnDataString("ItemData");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"ItemType",
"ItemId",
"DataType",
"ItemData",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"ItemType",
"ItemId",
"Name",
"Context",
};
//-------------------------------------------------------------------
// Construction.
internal SaItemData_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "SaItemData";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } }
public Int32 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } }
public String _DataType { get { return Cols._DataType.Value; } set { Cols._DataType.Value = value; } }
public String _ItemData { get { return Cols._ItemData.Value; } set { Cols._ItemData.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType);
_ItemId = GetFieldInt32(dbDataReader, "ItemId", _ItemId);
_DataType = GetFieldString(dbDataReader, "DataType", _DataType);
_ItemData = GetFieldString(dbDataReader, "ItemData", _ItemData);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("DataType")) AddCommandParameter(dbCommand, "@DataType", _DataType);
if (columnNames.ContainsCI("ItemData")) AddCommandParameter(dbCommand, "@ItemData", _ItemData);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("DataType")) AddCommandParameter(dbCommand, "@DataType", _DataType);
if (columnNames.ContainsCI("ItemData")) AddCommandParameter(dbCommand, "@ItemData", _ItemData);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,130 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ItemData;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ItemData
{
//=======================================================================
public abstract class SaItemDataConsole_Dbas : SaItemDataConsole
{
//-------------------------------------------------------------------
// Data members.
private SaItemDataMgr_Dbas itemDataMgr = null;
//-------------------------------------------------------------------
// Static initialisation.
static SaItemDataConsole_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaItemDataConsole_Dbas (SacsDatabase database)
{
Database = database;
itemDataMgr = new SaItemDataMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return itemDataMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return itemDataMgr.CanUpdateDatabase; } }
//-------------------------------------------------------------------
// I t e m D a t a
//-------------------------------------------------------------------
/// <summary>Type codes - specific for each type of item.</summary>
public override List<CodeDesc> GetDataTypeCodes (int itemType)
{
return new List<CodeDesc>();
}
//-------------------------------------------------------------------
// Item data interface.
public override bool CanUpdateItemData (SaItemData itemData)
{
return false;
}
public override bool DoUpdateItemData (SaItemData itemData)
{
return false;
}
public override bool CanRemoveItemData (SaItemData itemData)
{
return false;
}
//-------------------------------------------------------------------
// Retrieve item data entries that match the specified params.
public override bool ItemDataExists (SaItemData.Params prmItemData)
{
return (itemDataMgr.GetItemDataCount(prmItemData) > 0);
}
public override long GetItemDataCount (SaItemData.Params prmItemData)
{
return itemDataMgr.GetItemDataCount(prmItemData);
}
public override List<SaItemData> GetItemDataList (SaItemData.Params prmItemData)
{
return itemDataMgr.GetItemDataList(prmItemData);
}
//-------------------------------------------------------------------
// Create a new item data.
public override SaItemData CreateItemData (ItemId itemId)
{
return itemDataMgr.CreateItemData(itemId);
}
//-------------------------------------------------------------------
// Store item data.
public override bool Store (SaItemData itemData, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (itemData == null) return SetErrorState("null item");
if (!SysId.IsValid(itemData.Id))
{
if (!itemDataMgr.InsertItemData(itemData, dbUpdateInfo))
return SetErrorState(itemDataMgr.ErrorStateMessage);
}
else
{
if (!itemDataMgr.UpdateItemData(itemData, dbUpdateInfo))
return SetErrorState(itemDataMgr.ErrorStateMessage);
}
return !HasErrorState();
}
public override bool Remove (SaItemData itemData, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemDataMgr.DeleteItemData(itemData, dbUpdateInfo))
return SetErrorState(itemDataMgr.ErrorStateMessage);
return !HasErrorState();
}
public override bool ClearItemData (ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemDataMgr.ClearItemData(itemId, dbUpdateInfo))
return SetErrorState(itemDataMgr.ErrorStateMessage);
return !HasErrorState();
}
public override bool ClearItemData (ItemId itemId, String dataType, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemDataMgr.ClearItemData(itemId, dataType, dbUpdateInfo))
return SetErrorState(itemDataMgr.ErrorStateMessage);
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,113 @@
using System;
using System.IO;
using System.Reflection;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.ItemData
{
//=======================================================================
public static class SaItemDataDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand Item Data Module database definition generator";
//private static String dbConnectionString = "Driver={SQL Server Native Client 11.0};Server=Sarand106\\SQL2014;Database=SaStockTracker_Solent_STN;Trusted_Connection=Yes;MARS_Connection=yes;";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate (String connectionString)
{
String fn = nameof(SaItemDataDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition (SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory,
};
// Schema - Tables.
config.Schema.Tables_Included.AddRange(new String[] { "SaItemData" });
config.Schema.Tables_Excluded.AddRange(new String[] { });
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("SaItemData", "ItemType,ItemId,Name,Context");
// Database Definition class.
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.ItemData";
config.DefinitionClass.Classname = "SaItemDataDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.ItemData.Internal";
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder ()
{
String fn = nameof(SaItemDataDbDfnGenerator) + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof (DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug(fn + " Assembly folder: " + directory);
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\ItemData\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "ItemData";
SaLogger.Debug(fn+" Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,576 @@
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ItemData;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.ItemData.Internal;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ItemData
{
//=======================================================================
internal class SaItemDataMgr_Dbas : SaItemDataMgr
{
//-------------------------------------------------------------------
// Data members.
private SaItemDataConsole_Dbas itemDataConsole = null;
//-------------------------------------------------------------------
// Static initialisation.
static SaItemDataMgr_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
internal SaItemDataMgr_Dbas (SaItemDataConsole_Dbas itemDataConsole)
{
this.itemDataConsole = itemDataConsole;
DbInfo = new DbDataItem.DatabaseInfo(itemDataConsole.Database);
}
//-------------------------------------------------------------------
// Properties.
public String TableName_ItemData { get { return SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData); } }
internal SacsDatabase Database { get { return itemDataConsole.Database; } }
private DbDataItem.DatabaseInfo DbInfo { get; }
public override bool DatabaseIsValid { get { return (Database != null && Database.GetTableNames().Contains(TableName_ItemData)); } }
public override bool CanUpdateDatabase { get { return DatabaseIsValid; } }
//*******************************************************************
// I t e m D a t a
//*******************************************************************
// Utilities.
public override bool ItemHasData (ItemId itemId, bool ignoreDeleted = true)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return false;
SaItemData.Params prmItemData = new SaItemData.Params();
prmItemData.IncludedItemIds.Add(itemId);
prmItemData.StatusCat = (ignoreDeleted ? SaItemData.StatusCat.NotDeleted : SaItemData.StatusCat.Any);
return (GetItemDataCount(prmItemData) > 0);
}
public override bool ItemHasData (ItemId itemId, String dataType, bool ignoreDeleted = true)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return false;
if (StringUtil.IsEmpty(dataType)) return false;
SaItemData.Params prmItemData = new SaItemData.Params();
prmItemData.IncludedItemIds.Add(itemId);
prmItemData.IncludedDataTypes.Add(dataType);
prmItemData.StatusCat = (ignoreDeleted ? SaItemData.StatusCat.NotDeleted : SaItemData.StatusCat.Any);
return (GetItemDataCount(prmItemData) > 0);
}
//-------------------------------------------------------------------
// Create Item.
public override SaItemData CreateItemData (ItemId itemId)
{
ClearErrorState();
return new SaItemData_Dbas(null, itemId, 0);
}
private SaItemData CreateItemData (SaItemData_Db dbItemData)
{
ClearErrorState();
SaItemData itemData = new SaItemData_Dbas(null, new ItemId(dbItemData._ItemType, new SysId(dbItemData._ItemId)), (ushort)dbItemData._Flags);
PopulateFrom(dbItemData, itemData);
return itemData;
}
private SaItemData CreateItemData (DbDataReader dataReader)
{
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
dbItemData.PopulateFrom(dataReader);
return CreateItemData(dbItemData);
}
//-------------------------------------------------------------------
// Item exists.
public override bool ItemDataExists (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
SaItemData.Params prmItemData = new SaItemData.Params();
prmItemData.IncludedIds.Add(id);
prmItemData.StatusCat = SaItemData.StatusCat.Any;
return (GetItemDataCount(prmItemData) > 0);
}
public override bool ItemDataExists (ItemId itemId, String dataType, bool ignoreDeleted = true)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return false;
if (StringUtil.IsEmpty(dataType)) return false;
SaItemData.Params prmItemData = new SaItemData.Params();
prmItemData.IncludedItemIds.Add(itemId);
prmItemData.IncludedDataTypes.Add(dataType);
prmItemData.StatusCat = (ignoreDeleted ? SaItemData.StatusCat.NotDeleted : SaItemData.StatusCat.Any);
return (GetItemDataCount(prmItemData) > 0);
}
//-------------------------------------------------------------------
// Get Item Data.
public override SaItemData GetItemData (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
SaItemData.Params prmItemData = new SaItemData.Params();
prmItemData.IncludedIds.Add(id);
prmItemData.StatusCat = SaItemData.StatusCat.Any;
return GetItemData(prmItemData);
}
public override SaItemData GetItemData (ItemId itemId, String dataType)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return null;
if (StringUtil.IsEmpty(dataType)) return null;
SaItemData.Params prmItemData = new SaItemData.Params();
prmItemData.IncludedItemIds.Add(itemId);
prmItemData.IncludedDataTypes.Add(dataType);
prmItemData.StatusCat = SaItemData.StatusCat.Any;
return GetItemData(prmItemData);
}
public override SaItemData GetItemData (SaItemData.Params prmItemData)
{
return GetItemData(GetItemDataQueryFilter(prmItemData).Concat(" And ", "(", ")"));
}
private SaItemData GetItemData (String filter)
{
ClearErrorState();
if (GetItemDataCount(filter) != 1) return null;
SaItemData itemData = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
dbItemData.PopulateFrom(dbCommand, aliasItemData, filter);
itemData = CreateItemData(dbItemData);
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetItemData\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return itemData;
}
//-------------------------------------------------------------------
// Validate ItemData.
public override bool IsValidItemDataData (SaItemData.Data itemDataData, SaItemData.ErrField errField)
{
ClearErrorState();
if (!base.IsValidItemDataData(itemDataData, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert ItemData.
public override bool InsertItemData (SaItemData itemData, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidItemData(itemData)) return false;
if (SysId.IsValid(itemData.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
PopulateTo(dbItemData, itemData, dbUpdateInfo);
if (SaItemData_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbItemData._Id = SysId.ToInt(Database.GetNextId("SaItemData", dbUpdateInfo));
}
dbItemData.ExecuteInsertCommand(dbCommand);
itemData.Id = new SysId(dbItemData._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update ItemData.
public override bool UpdateItemData (SaItemData itemData, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidItemData(itemData)) return false;
if (!SysId.IsValid(itemData.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve itemData.
dbConnection.Open();
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
dbItemData.PopulateFrom(dbCommand, aliasItemData, aliasItemData + ".Id=" + SysId.ToString(itemData.Id));
// Update properties.
PopulateTo(dbItemData, itemData, dbUpdateInfo);
dbItemData.ExecuteUpdateCommand(dbCommand);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete ItemData.
public override bool ItemDataCanBeDeleted (SaItemData itemData)
{
ClearErrorState();
if (!base.ItemDataCanBeDeleted(itemData)) return false;
return true;
}
public override bool DeleteItemData (SaItemData itemData, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemDataCanBeDeleted(itemData)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve itemData.
dbConnection.Open();
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
dbItemData.PopulateFrom(dbCommand, aliasItemData, aliasItemData + ".Id=" + SysId.ToString(itemData.Id));
// Delete itemData.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData) + " WHERE Id=" + SysId.ToString(itemData.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
public override bool ClearItemData (ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item Id must be specified");
String colItemType = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType);
String colItemId = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId);
String query = "Delete From "+TableName_ItemData+" WHERE "+colItemType+"="+itemId.Type.ToString()+" AND "+colItemId+"="+SysId.ToString(itemId.Id);
Database.ExecuteNonQuery(query);
if (Database.HasErrorState())
SetErrorState("Failed to clear Item Data - " + Database.ErrorStateMessage);
return !HasErrorState();
}
public override bool ClearItemData (ItemId itemId, String dataType, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item Id must be specified");
if (StringUtil.IsEmpty(dataType)) return SetErrorState("Data type must be specified");
String colItemType = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType);
String colItemId = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId);
String colDataType = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType);
String query = "Delete From " + TableName_ItemData + " WHERE " + colItemType + "=" + itemId.Type.ToString() + " AND " + colItemId + "=" + SysId.ToString(itemId.Id) + " AND " + colDataType + "='"+dataType+"';";
Database.ExecuteNonQuery(query);
if (Database.HasErrorState())
SetErrorState("Failed to clear Item Data - " + Database.ErrorStateMessage);
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (SaItemData_Db dbItemData, SaItemData itemData, DbUpdateInfo dbUpdateInfo)
{
dbItemData._ItemType = itemData.ItemId.Type;
dbItemData._ItemId = SysId.ToInt(itemData.ItemId.Id);
dbItemData._DataType = itemData.DataType;
dbItemData._ItemData = itemData.ItemData;
// Common properties.
dbItemData._Notes = itemData.Notes;
dbItemData._Status = SacsSystem.GetStatusCode(itemData.Status);
dbItemData._Flags = (short)itemData.Flags;
if (!SysId.IsValid(itemData.Id))
{
dbItemData._CreateOn = DateTime.Now;
dbItemData._CreateBy = dbUpdateInfo.UserId.ToInt();
dbItemData._CreateHost = dbUpdateInfo.Host;
}
dbItemData._UpdateOn = DateTime.Now;
dbItemData._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbItemData._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaItemData_Db dbItemData, SaItemData itemData)
{
//itemData.ItemId = new ItemId(dbItemData._ItemType, new SysId(dbItemData._ItemId));
itemData.DataType = dbItemData._DataType;
itemData.ItemData = dbItemData._ItemData;
// Common properties.
itemData.Notes = dbItemData._Notes;
itemData.Status = SacsSystem.GetStatusForCode(dbItemData._Status);
itemData.SetCreateStamp(dbItemData._CreateOn, new SysId(dbItemData._CreateBy), dbItemData._CreateHost);
itemData.SetUpdateStamp(dbItemData._UpdateOn, new SysId(dbItemData._UpdateBy), dbItemData._UpdateHost);
itemData.AcceptChanges();
}
//-------------------------------------------------------------------
// ItemData column definitions.
private static readonly String aliasItemData = "aItmDat";
private void SetItemDataColDfn
(ColumnDfn col, String caption, int width, SaItemDataDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaItemDataDbDfn.GetTableForColumn(dbCol) == SaItemDataDbDfn.TableIdx.SaItemData)
alias = aliasItemData;
col.Set(caption, width, (int)dbCol, prefix + SaItemDataDbDfn.GetColumnName(dbCol, false), SaItemDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetItemDataColumnDfn (SaItemData.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
switch (columnId)
{
case SaItemData.Column.Pos:
SetItemDataColDfn(columnDfn, "Pos", 45, SaItemDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaItemData.Column.Id:
SetItemDataColDfn(columnDfn, "Id", 60, SaItemDataDbDfn.ColumnIdx.SaItemData_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaItemData.Column.ItemType:
SetItemDataColDfn(columnDfn, "Item type", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaItemData.Column.ItemType_Desc:
SetItemDataColDfn(columnDfn, "Item type", 100, SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType);
columnDfn.ReadOnly = true;
break;
case SaItemData.Column.DataType:
SetItemDataColDfn(columnDfn, "Data type", 100, SaItemDataDbDfn.ColumnIdx.SaItemData_DataType);
columnDfn.MaxLength = (int)SaItemDataDbDfn.GetColTextLen(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType);
break;
case SaItemData.Column.ItemData:
SetItemDataColDfn(columnDfn, "Data", 240, SaItemDataDbDfn.ColumnIdx.SaItemData_ItemData);
columnDfn.MaxLength = (int)SaItemDataDbDfn.GetColTextLen(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemData);
break;
// Common properties.
case SaItemData.Column.Notes:
SetItemDataColDfn(columnDfn, "Notes", 240, SaItemDataDbDfn.ColumnIdx.SaItemData_Notes);
columnDfn.MaxLength = (int)SaItemDataDbDfn.GetColTextLen(SaItemDataDbDfn.ColumnIdx.SaItemData_Notes);
break;
case SaItemData.Column.Status:
SetItemDataColDfn(columnDfn, "Status", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_Status, ColumnAlignment.Center);
break;
case SaItemData.Column.Status_Desc:
SetItemDataColDfn(columnDfn, "Status", 90, SaItemDataDbDfn.ColumnIdx.SaItemData_Status, ColumnAlignment.Center);
break;
case SaItemData.Column.Status_Ind:
SetItemDataColDfn(columnDfn, "Status", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaItemData.Column.CreateOn_Date:
SetItemDataColDfn(columnDfn, "Created", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaItemData.Column.UpdateOn_Date:
SetItemDataColDfn(columnDfn, "Updated", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// ItemData query filter.
public override List<string> GetItemDataQueryFilter (SaItemData.Params prm)
{
List<String> filter = new List<String>();
// Item Data Id.
String colId = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Id, aliasItemData);
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(colId + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colId + " NOT IN (" + excludedIds + ")");
// Item Ids.
List<String> filterItemId = new List<String>();
String colItemType = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasItemData);
String colItemId = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasItemData);
foreach (ItemId itemId in prm.IncludedItemIds)
{
filterItemId.Add(colItemType + "=" + itemId.Type.ToString() + " And " + colItemId + "=" + SysId.ToString(itemId.Id));
}
if (filterItemId.Count > 0)
filter.Add(filterItemId.Concat(" Or ", "(", ")"));
// Included Data Types.
List<String> dataTypeFilter = new List<string>();
String colDataType = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasItemData);
foreach (String dataType in prm.IncludedDataTypes)
{
dataTypeFilter.Add(colDataType + "='" + DbQuery.FormatForCondition(dataType) + "'");
}
if (dataTypeFilter.Count > 0)
filter.Add(dataTypeFilter.Concat(" Or ", "(", ")"));
// Status.
String colStatus = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Status, aliasItemData);
String statusCurrent = SacsSystem.GetStatusCode(SaStatus.Current);
String statusDeleted = SacsSystem.GetStatusCode(SaStatus.Deleted);
if (prm.StatusCat == SaItemData.StatusCat.CurrentOnly)
filter.Add(colStatus + " In ('" + statusCurrent + "')");
else if (prm.StatusCat == SaItemData.StatusCat.NotDeleted)
filter.Add(colStatus + " Not In ('" + statusDeleted + "')");
else if (prm.StatusCat == SaItemData.StatusCat.DeletedOnly)
filter.Add(colStatus + " In ('" + statusDeleted + "')");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// ItemData sort columns.
public List<String> GetItemDataSortColumns (SaItemData.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for ItemData columns in case of conflict.
String sortCol = String.Empty;
if (SaItemDataDbDfn.GetTableForColumn((SaItemDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaItemDataDbDfn.TableIdx.SaItemData)
{
sortCol = SaItemDataDbDfn.GetColumnNameQual((SaItemDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasItemData);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
{
sortCol = columnDfn.SortDataName;
}
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasItemData) + " DESC");
sortColumnNames.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasItemData) + " DESC");
sortColumnNames.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasItemData) + " DESC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// ItemData count.
private long GetItemDataCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData) + " As " + aliasItemData, filter);
}
public override long GetItemDataCount (SaItemData.Params prm)
{
ClearErrorState();
return GetItemDataCount(GetItemDataQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Item Data list.
public override List<SaItemData> GetItemDataList (SaItemData.Params prm)
{
List<SaItemData> itemDatas = new List<SaItemData>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(TableName_ItemData, aliasItemData);
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
qry.Columns.AddRange(dbItemData.ExistingColumnNames);
qry.Filters.AddRange(GetItemDataQueryFilter(prm));
qry.OrderBy.AddRange(GetItemDataSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
itemDatas.Add(CreateItemData(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetItemDataList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return itemDatas;
}
//-------------------------------------------------------------------
// Item Data query.
public override DbResultSet ExecuteItemDataQuery (List<ColumnDfn> columns, SaItemData.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData), aliasItemData);
// Add columns as defined in query list.
if (columns.HasId((int)SaItemData.Column.Id))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Id, aliasItemData));
if (columns.HasId((int)SaItemData.Column.ItemType) || columns.HasId((int)SaItemData.Column.ItemType_Desc))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasItemData));
if (columns.HasId((int)SaItemData.Column.ItemId))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasItemData));
if (columns.HasId((int)SaItemData.Column.DataType))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasItemData));
if (columns.HasId((int)SaItemData.Column.ItemData))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemData, aliasItemData));
if (columns.HasId((int)SaItemData.Column.Notes))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Notes, aliasItemData));
if (columns.HasId((int)SaItemData.Column.Status) || columns.HasId((int)SaItemData.Column.Status_Desc) || columns.HasId((int)SaItemData.Column.Status_Ind))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Status, aliasItemData));
if (columns.HasId((int)SaItemData.Column.CreateOn_Date))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_CreateOn, aliasItemData));
if (columns.HasId((int)SaItemData.Column.UpdateOn_Date))
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_UpdateOn, aliasItemData));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetItemDataQueryFilter(prm));
// Configure sort sequence.
foreach (String sortColumn in GetItemDataSortColumns(prm))
query.OrderBy.Add(sortColumn);
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,25 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ItemData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ItemData
{
//=======================================================================
public class SaItemData_Dbas : SaItemData
{
//-------------------------------------------------------------------
// Construction.
public SaItemData_Dbas (SysId id, ItemId itemId, ushort flags) :
base(id, itemId)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,248 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:54
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ItemDocs.Internal
{
internal class SaItemDoc_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId");
public ColumnDataInt16 _Category { get; } = new ColumnDataInt16("Category");
public ColumnDataString _Type { get; } = new ColumnDataString("Type");
public ColumnDataString _DescBrief { get; } = new ColumnDataString("DescBrief");
public ColumnDataString _Folder { get; } = new ColumnDataString("Folder");
public ColumnDataString _Filename { get; } = new ColumnDataString("Filename");
public ColumnDataString _MimeType { get; } = new ColumnDataString("MimeType");
public ColumnDataInt16 _ItemTypeAutoAssign { get; } = new ColumnDataInt16("ItemTypeAutoAssign");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"ItemType",
"ItemId",
"Category",
"Type",
"DescBrief",
"Folder",
"Filename",
"MimeType",
"ItemTypeAutoAssign",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
};
//-------------------------------------------------------------------
// Construction.
internal SaItemDoc_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "SaItemDoc";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } }
public Int32 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } }
public Int16 _Category { get { return Cols._Category.Value; } set { Cols._Category.Value = value; } }
public String _Type { get { return Cols._Type.Value; } set { Cols._Type.Value = value; } }
public String _DescBrief { get { return Cols._DescBrief.Value; } set { Cols._DescBrief.Value = value; } }
public String _Folder { get { return Cols._Folder.Value; } set { Cols._Folder.Value = value; } }
public String _Filename { get { return Cols._Filename.Value; } set { Cols._Filename.Value = value; } }
public String _MimeType { get { return Cols._MimeType.Value; } set { Cols._MimeType.Value = value; } }
public Int16 _ItemTypeAutoAssign { get { return Cols._ItemTypeAutoAssign.Value; } set { Cols._ItemTypeAutoAssign.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType);
_ItemId = GetFieldInt32(dbDataReader, "ItemId", _ItemId);
_Category = GetFieldInt16(dbDataReader, "Category", _Category);
_Type = GetFieldString(dbDataReader, "Type", _Type);
_DescBrief = GetFieldString(dbDataReader, "DescBrief", _DescBrief);
_Folder = GetFieldString(dbDataReader, "Folder", _Folder);
_Filename = GetFieldString(dbDataReader, "Filename", _Filename);
_MimeType = GetFieldString(dbDataReader, "MimeType", _MimeType);
_ItemTypeAutoAssign = GetFieldInt16(dbDataReader, "ItemTypeAutoAssign", _ItemTypeAutoAssign);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("Category")) AddCommandParameter(dbCommand, "@Category", _Category);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("DescBrief")) AddCommandParameter(dbCommand, "@DescBrief", _DescBrief);
if (columnNames.ContainsCI("Folder")) AddCommandParameter(dbCommand, "@Folder", _Folder);
if (columnNames.ContainsCI("Filename")) AddCommandParameter(dbCommand, "@Filename", _Filename);
if (columnNames.ContainsCI("MimeType")) AddCommandParameter(dbCommand, "@MimeType", _MimeType);
if (columnNames.ContainsCI("ItemTypeAutoAssign")) AddCommandParameter(dbCommand, "@ItemTypeAutoAssign", _ItemTypeAutoAssign);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("Category")) AddCommandParameter(dbCommand, "@Category", _Category);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("DescBrief")) AddCommandParameter(dbCommand, "@DescBrief", _DescBrief);
if (columnNames.ContainsCI("Folder")) AddCommandParameter(dbCommand, "@Folder", _Folder);
if (columnNames.ContainsCI("Filename")) AddCommandParameter(dbCommand, "@Filename", _Filename);
if (columnNames.ContainsCI("MimeType")) AddCommandParameter(dbCommand, "@MimeType", _MimeType);
if (columnNames.ContainsCI("ItemTypeAutoAssign")) AddCommandParameter(dbCommand, "@ItemTypeAutoAssign", _ItemTypeAutoAssign);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,382 @@
<?xml version="1.0"?>
<DbDfnDatabase xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Tables>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>SaItemDoc</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>1</Pos>
<Name>Id</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>2</Pos>
<Name>ItemType</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>3</Pos>
<Name>ItemId</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>4</Pos>
<Name>Category</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>5</Pos>
<Name>Type</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>32</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>6</Pos>
<Name>DescBrief</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>7</Pos>
<Name>Folder</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>8</Pos>
<Name>Filename</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>9</Pos>
<Name>MimeType</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>32</Size>
<BufferLen>64</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>10</Pos>
<Name>ItemTypeAutoAssign</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>11</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>12</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>13</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>6</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>14</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>15</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>16</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>17</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>18</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Pos>19</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Name>PK_SaItemDoc</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Id</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaItemDoc</Table>
<Name>IDX_SaItemDoc_Item</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemType</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>ItemId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
</Tables>
</DbDfnDatabase>
@@ -0,0 +1,236 @@
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.ItemDocs;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ItemDocs
{
//=======================================================================
public abstract class SaItemDocConsole_Dbas : SaItemDocConsole
{
//-------------------------------------------------------------------
// Data members.
private SaItemDocMgr_Dbas itemDocMgr = null;
private readonly List<TypeCodeDesc> categories = new List<TypeCodeDesc>();
private readonly List<String> favouriteFolders = new List<string>();
private readonly List<String> recentFolders = new List<string>();
//-------------------------------------------------------------------
// Static initialisation.
static SaItemDocConsole_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaItemDocConsole_Dbas (SacsDatabase database)
{
Database = database;
itemDocMgr = new SaItemDocMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return itemDocMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return itemDocMgr.CanUpdateDatabase; } }
//-------------------------------------------------------------------
// I t e m D o c s
//-------------------------------------------------------------------
// Category codes.
public override List<TypeCodeDesc> GetCategoryCodes ()
{
if (categories.Count < 1)
{
categories.Add(Category.Folder, "FLD", "Folder");
categories.Add(Category.Document, "DOC", "Document");
categories.Add(Category.Image, "IMG", "Image");
categories.Add(Category.FileSpec, "FSP", "File spec (generic)", "Allows wildcards");
}
return categories;
}
/// <summary>eg. for 'Image' documents.</summary>
public override List<CodeDesc> GetCategoryTypeCodes (Category category)
{
return new List<CodeDesc>();
}
//-------------------------------------------------------------------
// 'Recent' and 'Favourite' folders - to populate drop-down list when selecting folder:
/// <summary>How many recent foldes to retain? [default:5]</summary>
public override int GetMaxRecentFolderCount ()
{
return 5;
}
/// <summary>List of favourites to always include in dropdown.</summary>
public override void SetFavouriteFolders (List<String> folders)
{
favouriteFolders.Clear();
favouriteFolders.AddRange(folders);
}
/// <summary>Mix of recent and favourites.</summary>
public override List<String> GetSuggestedFolders ()
{
List<String> folders = new List<string>();
folders.AddRange(favouriteFolders);
folders.AddRange(recentFolders);
folders.RemoveBlanks();
folders.RemoveDuplicatesCI();
return folders;
}
//-------------------------------------------------------------------
// Retrieve list of docs that match the specified params.
public override bool ItemDocsExist (SaItemDoc.Params prmItemDoc)
{
ClearErrorState();
return (itemDocMgr.GetItemDocCount(prmItemDoc) > 0);
}
public override List<SaItemDoc> GetItemDocs (SaItemDoc.Params prmItemDoc)
{
ClearErrorState();
return itemDocMgr.GetItemDocList(prmItemDoc);
}
//-------------------------------------------------------------------
// Create a new document.
public override SaItemDoc CreateItemDoc (ItemId itemId, Category category)
{
ClearErrorState();
return itemDocMgr.CreateItemDoc(itemId, category);
}
//-------------------------------------------------------------------
// Store documents:
public override bool StoreItemDoc (SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!SysId.IsValid(itemDoc.Id))
{
if (!itemDocMgr.InsertItemDoc(itemDoc, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
}
else
{
if (!itemDocMgr.UpdateItemDoc(itemDoc, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
}
if (!StringUtil.IsEmpty(itemDoc.Folder))
{
// Update recent folder list.
recentFolders.RemoveAllCI(itemDoc.Folder);
recentFolders.Insert(0, itemDoc.Folder);
while (recentFolders.Count > GetMaxRecentFolderCount())
recentFolders.RemoveAt(recentFolders.Count - 1);
}
return !HasErrorState();
}
public override bool StoreItemDocs (List<SaItemDoc> itemDocs, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
foreach (SaItemDoc itemDoc in itemDocs)
{
if (!StoreItemDoc(itemDoc, dbUpdateInfo)) return false;
}
return true;
}
public override bool RemoveItemDoc (SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemDocMgr.DeleteItemDoc(itemDoc, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
return !HasErrorState();
}
public override bool ClearItemDocs (ItemId itemId, Category category, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item must be specified");
SaItemDoc.Params prmItemDoc = new SaItemDoc.Params();
prmItemDoc.IncludedItemIds.Add(itemId);
prmItemDoc.Category = category;
foreach (SaItemDoc itemDoc in itemDocMgr.GetItemDocList(prmItemDoc))
{
if (!itemDocMgr.DeleteItemDoc(itemDoc, dbUpdateInfo))
return SetErrorState(itemDocMgr.ErrorStateMessage);
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Auto-assign documents.
// The master items define 'auto-assign' docs for the item's type.
// The 'File part' defines the filename excluding the extension.
// If the extension list is empty, any extension is matched.
public override bool AutoAssignDocs (ItemId itemId, List<ItemId> masterItemIds, String filePart, List<String> extension, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item must be specified");
if (masterItemIds.Count < 1) return SetErrorState("Master items must be specified");
// Retrieve docs for this item:
SaItemDoc.Params prmItemDoc = new SaItemDoc.Params();
prmItemDoc.IncludedItemIds.Add(itemId);
prmItemDoc.StatusCat = SaItemDoc.StatusCat.NotDeleted;
List<SaItemDoc> itemDocs = GetItemDocs(prmItemDoc);
// Retrieve 'auto-assign' docs for the master items:
SaItemDoc.Params prmMaster = new SaItemDoc.Params();
prmMaster.IncludedItemIds.AddRange(masterItemIds);
prmMaster.ItemTypeAutoAssign = itemId.Type;
List<SaItemDoc> masterDocs = GetItemDocs(prmMaster);
// Identify the folders defined for 'Auto-Assign':
List<String> folders = new List<string>();
foreach (SaItemDoc masterDoc in masterDocs)
{
if (masterDoc.ItemTypeAutoAssign == itemId.Type && masterDoc.Category == Category.Folder && !StringUtil.IsEmpty(masterDoc.Folder))
{
if (!folders.ContainsCI(masterDoc.Folder))
folders.Add(masterDoc.Folder);
}
}
// Locate relevant files in the specified folders:
List<String> filePaths = new List<string>();
foreach (String folder in folders)
{
filePaths.AddRange(FileUtil.LocateFiles(folder, filePart, extension, 2));
}
// Check whether any of these files are already logged as documents against the item:
filePaths.RemoveDuplicatesCI();
foreach (String filePath in filePaths)
{
String folder = FileUtil.GetParentDirectory(filePath);
String filename = Path.GetFileName(filePath);
// Check if file is already assigned.
if (itemDocs.Any(item => item.Folder.EqualsCI(folder) && item.Filename.EqualsCI(filename)))
continue;
// Assign the item document.
SaItemDoc itemDoc = CreateItemDoc(itemId,Category.Document);
itemDoc.DescBrief = filename;
itemDoc.Folder = folder;
itemDoc.Filename = filename;
itemDoc.AutoAssigned = true;
itemDoc.Notes = "Auto-assigned.";
itemDocs.Add(itemDoc);
if (!StoreItemDoc(itemDoc, dbUpdateInfo)) return false;
}
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,620 @@
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ItemDocs;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.ItemDocs.Internal;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ItemDocs
{
//=======================================================================
internal class SaItemDocMgr_Dbas : SaItemDocMgr
{
//-------------------------------------------------------------------
// Data members.
private SaItemDocConsole_Dbas itemDocConsole = null;
//-------------------------------------------------------------------
// Static initialisation.
static SaItemDocMgr_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
internal SaItemDocMgr_Dbas (SaItemDocConsole_Dbas itemDocConsole)
{
this.itemDocConsole = itemDocConsole;
DbInfo = new DbDataItem.DatabaseInfo(itemDocConsole.Database);
}
//-------------------------------------------------------------------
// Properties.
public String TableName_ItemDoc { get { return SaItemDocsDbDfn.GetTableName(SaItemDocsDbDfn.TableIdx.SaItemDoc); } }
internal SacsDatabase Database { get { return itemDocConsole.Database; } }
private DbDataItem.DatabaseInfo DbInfo { get; }
public override bool DatabaseIsValid { get { return (Database != null && Database.GetTableNames().Contains(TableName_ItemDoc)); } }
public override bool CanUpdateDatabase { get { return DatabaseIsValid; } }
//*******************************************************************
// I t e m D a t a
//*******************************************************************
// Utilities.
public override bool ItemHasDocs (ItemId itemId, bool ignoreDeleted = true)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return false;
SaItemDoc.Params prmItemDoc = new SaItemDoc.Params();
prmItemDoc.IncludedItemIds.Add(itemId);
prmItemDoc.StatusCat = (ignoreDeleted ? SaItemDoc.StatusCat.NotDeleted : SaItemDoc.StatusCat.Any);
return (GetItemDocCount(prmItemDoc) > 0);
}
public override bool ItemHasDocs (ItemId itemId, SaItemDocConsole.Category category, bool ignoreDeleted = true)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return false;
if ((int)category < 1) return false;
SaItemDoc.Params prmItemDoc = new SaItemDoc.Params();
prmItemDoc.IncludedItemIds.Add(itemId);
prmItemDoc.Category = category;
prmItemDoc.StatusCat = (ignoreDeleted ? SaItemDoc.StatusCat.NotDeleted : SaItemDoc.StatusCat.Any);
return (GetItemDocCount(prmItemDoc) > 0);
}
//-------------------------------------------------------------------
// Create Item.
public override SaItemDoc CreateItemDoc (ItemId itemId, SaItemDocConsole.Category category)
{
ClearErrorState();
return new SaItemDoc_Dbas(null, itemId, category, 0);
}
private SaItemDoc CreateItemDoc (SaItemDoc_Db dbItemDoc)
{
ClearErrorState();
SaItemDoc itemDoc = new SaItemDoc_Dbas(null, new ItemId(dbItemDoc._ItemType, new SysId(dbItemDoc._ItemId)), (SaItemDocConsole.Category)dbItemDoc._Category, (ushort)dbItemDoc._Flags);
PopulateFrom(dbItemDoc, itemDoc);
return itemDoc;
}
private SaItemDoc CreateItemDoc (DbDataReader dataReader)
{
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
dbItemDoc.PopulateFrom(dataReader);
return CreateItemDoc(dbItemDoc);
}
//-------------------------------------------------------------------
// Item exists.
public override bool ItemDocExists (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
SaItemDoc.Params prmItemDoc = new SaItemDoc.Params();
prmItemDoc.IncludedIds.Add(id);
prmItemDoc.StatusCat = SaItemDoc.StatusCat.Any;
return (GetItemDocCount(prmItemDoc) > 0);
}
//-------------------------------------------------------------------
// Get Item.
public override SaItemDoc GetItemDoc (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
SaItemDoc.Params prmItemDoc = new SaItemDoc.Params();
prmItemDoc.IncludedIds.Add(id);
prmItemDoc.StatusCat = SaItemDoc.StatusCat.Any;
return GetItemDoc(prmItemDoc);
}
public override SaItemDoc GetItemDoc (SaItemDoc.Params prmItemDoc)
{
return GetItemDoc(GetItemDocQueryFilter(prmItemDoc).Concat(" And ", "(", ")"));
}
private SaItemDoc GetItemDoc (String filter)
{
ClearErrorState();
if (GetItemDocCount(filter) != 1) return null;
SaItemDoc itemDoc = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
dbItemDoc.PopulateFrom(dbCommand, aliasItemDoc, filter);
itemDoc = CreateItemDoc(dbItemDoc);
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetItemDoc\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return itemDoc;
}
//-------------------------------------------------------------------
// Validate ItemDoc.
public override bool IsValidItemDocData (SaItemDoc.Data itemDocData, SaItemDoc.ErrField errField)
{
ClearErrorState();
if (!base.IsValidItemDocData(itemDocData, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert ItemDoc.
public override bool InsertItemDoc (SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidItemDoc(itemDoc)) return false;
if (SysId.IsValid(itemDoc.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
PopulateTo(dbItemDoc, itemDoc, dbUpdateInfo);
if (SaItemDoc_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbItemDoc._Id = SysId.ToInt(Database.GetNextId("SaItemDoc", dbUpdateInfo));
}
dbItemDoc.ExecuteInsertCommand(dbCommand);
itemDoc.Id = new SysId(dbItemDoc._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update ItemDoc.
public override bool UpdateItemDoc (SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidItemDoc(itemDoc)) return false;
if (!SysId.IsValid(itemDoc.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve itemDoc.
dbConnection.Open();
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
dbItemDoc.PopulateFrom(dbCommand, aliasItemDoc, aliasItemDoc + ".Id=" + SysId.ToString(itemDoc.Id));
// Update properties.
PopulateTo(dbItemDoc, itemDoc, dbUpdateInfo);
dbItemDoc.ExecuteUpdateCommand(dbCommand);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete ItemDoc.
public override bool ItemDocCanBeDeleted (SaItemDoc itemDoc)
{
ClearErrorState();
if (!base.ItemDocCanBeDeleted(itemDoc)) return false;
return true;
}
public override bool DeleteItemDoc (SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemDocCanBeDeleted(itemDoc)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve itemDoc.
dbConnection.Open();
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
dbItemDoc.PopulateFrom(dbCommand, aliasItemDoc, aliasItemDoc + ".Id=" + SysId.ToString(itemDoc.Id));
// Delete itemDoc.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + SaItemDocsDbDfn.GetTableName(SaItemDocsDbDfn.TableIdx.SaItemDoc) + " WHERE Id=" + SysId.ToString(itemDoc.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
public override bool ClearItemDocs (ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item Id must be specified");
String colItemType = SaItemDocsDbDfn.GetColumnName(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType);
String colItemId = SaItemDocsDbDfn.GetColumnName(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemId);
String query = "Delete From "+TableName_ItemDoc+" WHERE "+colItemType+"="+itemId.Type.ToString()+" AND "+colItemId+"="+SysId.ToString(itemId.Id);
Database.ExecuteNonQuery(query);
if (Database.HasErrorState())
SetErrorState("Failed to clear Items - " + Database.ErrorStateMessage);
return !HasErrorState();
}
public override bool ClearItemDocs (ItemId itemId, SaItemDocConsole.Category category, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item Id must be specified");
if ((int)category < 1) return SetErrorState("Category must be specified");
String colItemType = SaItemDocsDbDfn.GetColumnName(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType);
String colItemId = SaItemDocsDbDfn.GetColumnName(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemId);
String colCategory = SaItemDocsDbDfn.GetColumnName(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Category);
String query = "Delete From " + TableName_ItemDoc + " WHERE " + colItemType + "=" + itemId.Type.ToString() + " AND " + colItemId + "=" + SysId.ToString(itemId.Id) + " AND " + colCategory + "='" + ((int)category).ToString() + "';";
Database.ExecuteNonQuery(query);
if (Database.HasErrorState())
SetErrorState("Failed to clear Items - " + Database.ErrorStateMessage);
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (SaItemDoc_Db dbItemDoc, SaItemDoc itemDoc, DbUpdateInfo dbUpdateInfo)
{
dbItemDoc._ItemType = itemDoc.ItemId.Type;
dbItemDoc._ItemId = SysId.ToInt(itemDoc.ItemId.Id);
dbItemDoc._Category = (short)itemDoc.Category;
dbItemDoc._Type = itemDoc.DocType;
dbItemDoc._DescBrief = itemDoc.DescBrief;
dbItemDoc._Folder = itemDoc.Folder;
dbItemDoc._Filename = itemDoc.Filename;
dbItemDoc._MimeType = itemDoc.MimeType;
dbItemDoc._ItemTypeAutoAssign = itemDoc.ItemTypeAutoAssign;
// Common properties.
dbItemDoc._Notes = itemDoc.Notes;
dbItemDoc._Status = SacsSystem.GetStatusCode(itemDoc.Status);
dbItemDoc._Flags = (short)itemDoc.Flags;
if (!SysId.IsValid(itemDoc.Id))
{
dbItemDoc._CreateOn = DateTime.Now;
dbItemDoc._CreateBy = dbUpdateInfo.UserId.ToInt();
dbItemDoc._CreateHost = dbUpdateInfo.Host;
}
dbItemDoc._UpdateOn = DateTime.Now;
dbItemDoc._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbItemDoc._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaItemDoc_Db dbItemDoc, SaItemDoc itemDoc)
{
//itemDoc.ItemId = new ItemId(dbItemDoc._ItemType, new SysId(dbItemDoc._ItemId));
//itemDoc.Category = (SaItemDocConsole.Category)dbItemDoc._Category;
itemDoc.DocType = dbItemDoc._Type;
itemDoc.DescBrief = dbItemDoc._DescBrief;
itemDoc.Folder = dbItemDoc._Folder;
itemDoc.Filename = dbItemDoc._Filename;
itemDoc.MimeType = dbItemDoc._MimeType;
itemDoc.ItemTypeAutoAssign = dbItemDoc._ItemTypeAutoAssign;
// Common properties.
itemDoc.Notes = dbItemDoc._Notes;
itemDoc.Status = SacsSystem.GetStatusForCode(dbItemDoc._Status);
itemDoc.SetCreateStamp(dbItemDoc._CreateOn, new SysId(dbItemDoc._CreateBy), dbItemDoc._CreateHost);
itemDoc.SetUpdateStamp(dbItemDoc._UpdateOn, new SysId(dbItemDoc._UpdateBy), dbItemDoc._UpdateHost);
itemDoc.AcceptChanges();
}
//-------------------------------------------------------------------
// ItemDoc column definitions.
private static readonly String aliasItemDoc = "aItmDoc";
private void SetItemDocColDfn
(ColumnDfn col, String caption, int width, SaItemDocsDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaItemDocsDbDfn.GetTableForColumn(dbCol) == SaItemDocsDbDfn.TableIdx.SaItemDoc)
alias = aliasItemDoc;
col.Set(caption, width, (int)dbCol, prefix + SaItemDocsDbDfn.GetColumnName(dbCol, false), SaItemDocsDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetItemDocColumnDfn (SaItemDoc.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
switch (columnId)
{
case SaItemDoc.Column.Pos:
SetItemDocColDfn(columnDfn, "Pos", 45, SaItemDocsDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaItemDoc.Column.Id:
SetItemDocColDfn(columnDfn, "Id", 60, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaItemDoc.Column.ItemType:
SetItemDocColDfn(columnDfn, "Item type", 80, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaItemDoc.Column.ItemType_Desc:
SetItemDocColDfn(columnDfn, "Item type", 100, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType);
columnDfn.ReadOnly = true;
break;
case SaItemDoc.Column.Category:
SetItemDocColDfn(columnDfn, "Category", 70, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Category, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaItemDoc.Column.Category_Desc:
SetItemDocColDfn(columnDfn, "Category", 90, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Category, ColumnAlignment.Center);
columnDfn.ReadOnly = true;
break;
case SaItemDoc.Column.DocType:
SetItemDocColDfn(columnDfn, "Type", 90, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Type, ColumnAlignment.Center);
columnDfn.MaxLength = (int)SaItemDocsDbDfn.GetColTextLen(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Type);
break;
case SaItemDoc.Column.DocType_Desc:
SetItemDocColDfn(columnDfn, "Type", 120, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Type);
columnDfn.MaxLength = (int)SaItemDocsDbDfn.GetColTextLen(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Type);
break;
case SaItemDoc.Column.DescBrief:
SetItemDocColDfn(columnDfn, "Caption", 120, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_DescBrief);
columnDfn.MaxLength = (int)SaItemDocsDbDfn.GetColTextLen(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_DescBrief);
break;
case SaItemDoc.Column.Folder:
SetItemDocColDfn(columnDfn, "Folder", 240, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Folder);
columnDfn.MaxLength = (int)SaItemDocsDbDfn.GetColTextLen(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Folder);
break;
case SaItemDoc.Column.Filename:
SetItemDocColDfn(columnDfn, "Filename", 120, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Filename);
columnDfn.MaxLength = (int)SaItemDocsDbDfn.GetColTextLen(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Filename);
break;
case SaItemDoc.Column.MimeType:
SetItemDocColDfn(columnDfn, "Mime", 80, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_MimeType, ColumnAlignment.Center);
columnDfn.MaxLength = (int)SaItemDocsDbDfn.GetColTextLen(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_MimeType);
break;
// Common properties.
case SaItemDoc.Column.Notes:
SetItemDocColDfn(columnDfn, "Notes", 240, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Notes);
columnDfn.MaxLength = (int)SaItemDocsDbDfn.GetColTextLen(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Notes);
break;
case SaItemDoc.Column.Status:
SetItemDocColDfn(columnDfn, "Status", 80, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Status, ColumnAlignment.Center);
break;
case SaItemDoc.Column.Status_Desc:
SetItemDocColDfn(columnDfn, "Status", 90, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Status, ColumnAlignment.Center);
break;
case SaItemDoc.Column.Status_Ind:
SetItemDocColDfn(columnDfn, "Status", 80, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaItemDoc.Column.CreateOn_Date:
SetItemDocColDfn(columnDfn, "Created", 80, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaItemDoc.Column.UpdateOn_Date:
SetItemDocColDfn(columnDfn, "Updated", 80, SaItemDocsDbDfn.ColumnIdx.SaItemDoc_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// ItemDoc query filter.
public override List<string> GetItemDocQueryFilter (SaItemDoc.Params prm)
{
List<String> filter = new List<String>();
// Item Id.
String colId = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Id, aliasItemDoc);
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(colId + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colId + " NOT IN (" + excludedIds + ")");
// Item Ids.
List<String> filterItemId = new List<String>();
String colItemType = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType, aliasItemDoc);
String colItemId = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemId, aliasItemDoc);
foreach (ItemId itemId in prm.IncludedItemIds)
{
filterItemId.Add(colItemType + "=" + itemId.Type.ToString() + " And " + colItemId + "=" + SysId.ToString(itemId.Id));
}
if (filterItemId.Count > 0)
filter.Add(filterItemId.Concat(" Or ", "(", ")"));
// Category.
String colCategory = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Category, aliasItemDoc);
if ((int)prm.Category > 0)
filter.Add(colCategory + "=" + ((int)prm.Category).ToString());
// Document type.
String colDocType = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Type, aliasItemDoc);
if (!StringUtil.IsEmpty(prm.DocType))
filter.Add(colDocType + "='" + DbQuery.FormatForCondition(prm.DocType) + "'");
// Caption.
String colDescBrief = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_DescBrief, aliasItemDoc);
if (!StringUtil.IsEmpty(prm.DescBriefPartial))
filter.Add(colDocType + " Like '%" + DbQuery.FormatForLike(prm.DescBriefPartial) + "%'");
// Mime.
String colMimeType = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_MimeType, aliasItemDoc);
if (!StringUtil.IsEmpty(prm.MimeType))
filter.Add(colMimeType + "='" + DbQuery.FormatForCondition(prm.MimeType) + "'");
// Folder.
String colFolder = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Folder, aliasItemDoc);
if (!StringUtil.IsEmpty(prm.FolderFull))
filter.Add(colFolder + "='" + DbQuery.FormatForCondition(prm.FolderFull) + "'");
else if (!StringUtil.IsEmpty(prm.FolderPartial))
filter.Add(colFolder + " Like '%" + DbQuery.FormatForLike(prm.FolderPartial) + "%'");
// Filename.
String colFilename = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Filename, aliasItemDoc);
if (!StringUtil.IsEmpty(prm.FilenameFull))
filter.Add(colFilename + "='" + DbQuery.FormatForCondition(prm.FilenameFull) + "'");
// ToDo ItemDoc Filter - ItemTypeAutoAssign
// Status.
String colStatus = SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Status, aliasItemDoc);
String statusCurrent = SacsSystem.GetStatusCode(SaStatus.Current);
String statusDeleted = SacsSystem.GetStatusCode(SaStatus.Deleted);
if (prm.StatusCat == SaItemDoc.StatusCat.CurrentOnly)
filter.Add(colStatus + " In ('" + statusCurrent + "')");
else if (prm.StatusCat == SaItemDoc.StatusCat.NotDeleted)
filter.Add(colStatus + " Not In ('" + statusDeleted + "')");
else if (prm.StatusCat == SaItemDoc.StatusCat.DeletedOnly)
filter.Add(colStatus + " In ('" + statusDeleted + "')");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// ItemDoc sort columns.
public List<String> GetItemDocSortColumns (SaItemDoc.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for ItemDoc columns in case of conflict.
String sortCol = String.Empty;
if (SaItemDocsDbDfn.GetTableForColumn((SaItemDocsDbDfn.ColumnIdx)columnDfn.DbColumn) == SaItemDocsDbDfn.TableIdx.SaItemDoc)
{
sortCol = SaItemDocsDbDfn.GetColumnNameQual((SaItemDocsDbDfn.ColumnIdx)columnDfn.DbColumn, aliasItemDoc);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
{
sortCol = columnDfn.SortDataName;
}
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType, aliasItemDoc) + " DESC");
sortColumnNames.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemId, aliasItemDoc) + " DESC");
sortColumnNames.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Category, aliasItemDoc) + " DESC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// ItemDoc count.
private long GetItemDocCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(SaItemDocsDbDfn.GetTableName(SaItemDocsDbDfn.TableIdx.SaItemDoc) + " As " + aliasItemDoc, filter);
}
public override long GetItemDocCount (SaItemDoc.Params prm)
{
ClearErrorState();
return GetItemDocCount(GetItemDocQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Item list.
public override List<SaItemDoc> GetItemDocList (SaItemDoc.Params prm)
{
List<SaItemDoc> itemDocs = new List<SaItemDoc>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(TableName_ItemDoc, aliasItemDoc);
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
qry.Columns.AddRange(dbItemDoc.ExistingColumnNames);
qry.Filters.AddRange(GetItemDocQueryFilter(prm));
qry.OrderBy.AddRange(GetItemDocSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
itemDocs.Add(CreateItemDoc(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetItemDocList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return itemDocs;
}
//-------------------------------------------------------------------
// Item query.
public override DbResultSet ExecuteItemDocQuery (List<ColumnDfn> columns, SaItemDoc.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(SaItemDocsDbDfn.GetTableName(SaItemDocsDbDfn.TableIdx.SaItemDoc), aliasItemDoc);
// Add columns as defined in query list.
if (columns.HasId((int)SaItemDoc.Column.Id))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Id, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.ItemType) || columns.HasId((int)SaItemDoc.Column.ItemType_Desc))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.ItemId))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemId, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.Category) || columns.HasId((int)SaItemDoc.Column.Category_Desc))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Category, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.DocType) || columns.HasId((int)SaItemDoc.Column.DocType_Desc))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Type, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.DescBrief))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_DescBrief, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.Folder))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Folder, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.Filename))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Filename, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.MimeType))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_MimeType, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.Notes))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Notes, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.Status) || columns.HasId((int)SaItemDoc.Column.Status_Desc) || columns.HasId((int)SaItemDoc.Column.Status_Ind))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Status, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.CreateOn_Date))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_CreateOn, aliasItemDoc));
if (columns.HasId((int)SaItemDoc.Column.UpdateOn_Date))
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_UpdateOn, aliasItemDoc));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetItemDocQueryFilter(prm));
// Configure sort sequence.
foreach (String sortColumn in GetItemDocSortColumns(prm))
query.OrderBy.Add(sortColumn);
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,25 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ItemDocs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ItemDocs
{
//=======================================================================
internal class SaItemDoc_Dbas : SaItemDoc
{
//-------------------------------------------------------------------
// Construction.
public SaItemDoc_Dbas (SysId id, ItemId itemId, SaItemDocConsole.Category category, ushort flags) :
base(id, itemId, category)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,116 @@
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ItemDocs
{
//=======================================================================
public static class SaItemDocsDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand Item Docs Module database definition generator";
//private static String dbConnectionString = "Driver={SQL Server Native Client 11.0};Server=Sarand106\\SQL2014;Database=SaStockTracker_Solent_STN;Trusted_Connection=Yes;MARS_Connection=yes;";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate (String connectionString)
{
String fn = nameof(SaItemDocsDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition (SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory,
};
// Schema - Tables.
config.Schema.Tables_Included.AddRange(new String[] { "SaItemDoc" });
config.Schema.Tables_Excluded.AddRange(new String[] { });
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("SaItemDocs", "ItemType,ItemId,Name,Context");
// Database Definition class.
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.ItemDocs";
config.DefinitionClass.Classname = "SaItemDocsDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.ItemDocs.Internal";
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder ()
{
String fn = nameof(SaItemDocsDbDfnGenerator) + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof (DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug(fn + " Assembly folder: " + directory);
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\ItemDocs\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "ItemDocs";
SaLogger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,362 @@
<?xml version="1.0"?>
<DbDfnDatabase xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Tables>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>SaItemOption</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>1</Pos>
<Name>ItemType</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>2</Pos>
<Name>ItemId</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>3</Pos>
<Name>Name</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>4</Pos>
<Name>Context</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>5</Pos>
<Name>Value</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>6</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>7</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>8</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>6</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>9</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>10</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>11</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>12</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>13</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Pos>14</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Name>PK_SaItemOption</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>11</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemType</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>ItemId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>3</Seq>
<Name>Name</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>4</Seq>
<Name>Context</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Name>IDX_SaItemOption_Item</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemType</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>ItemId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Name>IDX_SaItemOption_ItemName</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemType</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>ItemId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>3</Seq>
<Name>Name</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaItemOption</Table>
<Name>IDX_SaItemOption_Name</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Name</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
</Tables>
</DbDfnDatabase>
@@ -0,0 +1,225 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:46
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ItemOptions.Internal
{
internal class SaItemOption_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId");
public ColumnDataString _Name { get; } = new ColumnDataString("Name");
public ColumnDataString _Context { get; } = new ColumnDataString("Context");
public ColumnDataString _Value { get; } = new ColumnDataString("Value");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"ItemType",
"ItemId",
"Name",
"Context",
"Value",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"ItemType",
"ItemId",
"Name",
"Context",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"ItemType",
"ItemId",
"Name",
"Context",
};
//-------------------------------------------------------------------
// Construction.
internal SaItemOption_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "SaItemOption";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } }
public Int32 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } }
public String _Name { get { return Cols._Name.Value; } set { Cols._Name.Value = value; } }
public String _Context { get { return Cols._Context.Value; } set { Cols._Context.Value = value; } }
public String _Value { get { return Cols._Value.Value; } set { Cols._Value.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType);
_ItemId = GetFieldInt32(dbDataReader, "ItemId", _ItemId);
_Name = GetFieldString(dbDataReader, "Name", _Name);
_Context = GetFieldString(dbDataReader, "Context", _Context);
_Value = GetFieldString(dbDataReader, "Value", _Value);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("Context")) AddCommandParameter(dbCommand, "@Context", _Context);
if (columnNames.ContainsCI("Value")) AddCommandParameter(dbCommand, "@Value", _Value);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE ItemType=@ItemType AND ItemId=@ItemId AND Name=@Name AND Context=@Context;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE ItemType=? AND ItemId=? AND Name=? AND Context=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Value")) AddCommandParameter(dbCommand, "@Value", _Value);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@ItemType", _ItemType);
AddCommandParameter(dbCommand, "@ItemId", _ItemId);
AddCommandParameter(dbCommand, "@Name", _Name);
AddCommandParameter(dbCommand, "@Context", _Context);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,179 @@
using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ItemOptions;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ItemOptions
{
//=======================================================================
public abstract class SaItemOptionConsole_Dbas : SaItemOptionConsole
{
//-------------------------------------------------------------------
// Data members.
private SaItemOptionMgr_Dbas itemOptionMgr = null;
//-------------------------------------------------------------------
// Static initialisation.
static SaItemOptionConsole_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
protected SaItemOptionConsole_Dbas (SacsDatabase database)
{
Database = database;
itemOptionMgr = new SaItemOptionMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return itemOptionMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return itemOptionMgr.CanUpdateDatabase; } }
//-------------------------------------------------------------------
// Item Options form.
public override bool MangageItemOptions (List<SaItemOption> itemOptions)
{
throw new NotImplementedException();
}
public override bool ShowItemOptionsDialog (ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (ShowItemOptionsDialogFn != null)
ShowItemOptionsDialogFn(this, itemId, dbUpdateInfo);
return false;
}
// Method to display Update Log dialog.
protected delegate bool ShowItemOptionsDialogFunction (SaItemOptionConsole codeTypeConsole, ItemId itemId, DbUpdateInfo dbUpdateInfo);
protected abstract ShowItemOptionsDialogFunction ShowItemOptionsDialogFn { get; }
//*******************************************************************
// I t e m O p t i o n s
//*******************************************************************
// Retrieve specific option.
public override SaItemOption GetItemOption (ItemId itemId, String name, String context)
{
return itemOptionMgr.GetItemOption(itemId,name,context);
}
// Retrieve options.
public override List<SaItemOption> GetItemOptions (SaItemOption.Params prmItemOption)
{
return itemOptionMgr.GetItemOptionList(prmItemOption);
}
public override List<SaItemOption> GetItemOptionsForItem (ItemId itemId)
{
if (!ItemId.IsValid(itemId))
return new List<SaItemOption>();
SaItemOption.Params prmItemOption = new SaItemOption.Params();
prmItemOption.IncludedItemIds.Add(itemId);
return itemOptionMgr.GetItemOptionList(prmItemOption);
}
// Retrieve specific option for range of items (all matching item if ID list is blank).
public override List<SaItemOption> GetItemOptions (List<ItemId> itemIds, String name, String context)
{
SaItemOption.Params prmItemOption = new SaItemOption.Params();
prmItemOption.IncludedItemIds.AddRange(itemIds);
if (!StringUtil.IsEmpty(name))
prmItemOption.IncludedNameContexts.Add(name,context);
return itemOptionMgr.GetItemOptionList(prmItemOption);
}
//-------------------------------------------------------------------
// Create an item option.
public override SaItemOption CreateItemOption (ItemId itemId, String name, String context)
{
return itemOptionMgr.CreateItemOption(itemId, name, context);
}
// Item independent options, eg. for processes.
public override SaItemOption CreateItemOptionByNameContext (String name, String context)
{
return itemOptionMgr.CreateItemOption(null, name, context);
}
//-------------------------------------------------------------------
// Store item option - create if not exsts, otherwise update.
public override bool StoreItemOption (SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
// If option exists, update it.
if (itemOptionMgr.ItemOptionExists(itemOption))
{
if (!itemOptionMgr.UpdateItemOption(itemOption, dbUpdateInfo))
return SetErrorState(itemOptionMgr.ErrorStateMessage);
}
else
{
// Otherwise, insert it.
if (!itemOptionMgr.InsertItemOption(itemOption, dbUpdateInfo))
return SetErrorState(itemOptionMgr.ErrorStateMessage);
}
return true;
}
// Store a specific option against the specified item.
public override bool StoreItemOption (ItemId itemId, String name, String context, String sValue, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaItemOption itemOption = CreateItemOption(itemId,name,context);
return StoreItemOption(itemOption, dbUpdateInfo);
}
// Store the updated list of options against the specified item.
public override bool StoreItemOptions (ItemId itemId, List<SaItemOption> itemOptions, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
// Validate item options.
foreach (SaItemOption itemOption in itemOptions)
{
if (itemOption.ItemId != null && !itemOption.ItemId.Equals(itemId)) return SetErrorState("Inconsistent item id in option list");
if (!itemOptionMgr.IsValidItemOption(itemOption)) return SetErrorState("Validation error: "+itemOptionMgr.ErrorStateMessage);
}
// Retrieve existing options.
List<SaItemOption> existingItemOptions = GetItemOptionsForItem(itemId).FindAll(item => item.ItemId.Equals(itemId));
// Store each option in turn.
foreach (SaItemOption itemOption in itemOptions)
{
if (!StoreItemOption(itemOption, dbUpdateInfo)) return false;
// Remove matching options in existing list.
existingItemOptions.RemoveAll(item => item.ItemId.Equals(itemId) && item.Name.EqualsCI(itemOption.Name) && item.Context.EqualsCI(itemOption.Context));
}
// Clear options not in the list.
foreach (SaItemOption itemOption in existingItemOptions)
{
if (!ClearItemOption(itemOption,dbUpdateInfo)) return false;
}
return true;
}
// Remove option(s) for the specified item.
public override bool ClearItemOption (SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (itemOptionMgr.ItemOptionExists(itemOption) && !itemOptionMgr.DeleteItemOption(itemOption, dbUpdateInfo))
return SetErrorState(itemOptionMgr.ErrorStateMessage);
return true;
}
public override bool ClearItemOption (ItemId itemId, String name, String context, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
return ClearItemOption(CreateItemOption(itemId, name, context),dbUpdateInfo);
}
public override bool ClearItemOptions (ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!itemOptionMgr.ClearItemOptionsForItem(itemId, dbUpdateInfo))
return SetErrorState(itemOptionMgr.ErrorStateMessage);
return true;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,13 @@
using Sarand.Net.Standard.Base.ItemOptions;
namespace Sarand.Net.Standard.Dbas.ItemOptions
{
internal static class SaItemOptionInternal
{
internal static SaItemOptionMgr CreateItemOptionMgr (this SaItemOptionConsole updateLogConsole)
{
if (!(updateLogConsole is SaItemOptionConsole_Dbas)) return null;
return new SaItemOptionMgr_Dbas((SaItemOptionConsole_Dbas)updateLogConsole);
}
}
}
@@ -0,0 +1,565 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Data;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ItemOptions;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.ItemOptions.Internal;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ItemOptions
{
//=======================================================================
internal class SaItemOptionMgr_Dbas : SaItemOptionMgr
{
//-------------------------------------------------------------------
// Data members.
private SaItemOptionConsole_Dbas itemOptionConsole = null;
//-------------------------------------------------------------------
// Static initialisation.
static SaItemOptionMgr_Dbas ()
{
}
//-------------------------------------------------------------------
// Construction.
internal SaItemOptionMgr_Dbas (SaItemOptionConsole_Dbas itemOptionConsole)
{
this.itemOptionConsole = itemOptionConsole;
DbInfo = new DbDataItem.DatabaseInfo(itemOptionConsole.Database);
}
//-------------------------------------------------------------------
// Properties.
public String TableName_ItemOption { get { return SaItemOptionDbDfn.GetTableName(SaItemOptionDbDfn.TableIdx.SaItemOption); } }
internal SacsDatabase Database { get { return itemOptionConsole.Database; } }
private DbDataItem.DatabaseInfo DbInfo { get; }
public override bool DatabaseIsValid { get { return (Database != null && Database.GetTableNames().Contains(TableName_ItemOption)); } }
public override bool CanUpdateDatabase { get { return DatabaseIsValid; } }
//*******************************************************************
// I t e m O p t i o n s
//*******************************************************************
// Utilities.
private String GetItemOptionFilter (SaItemOption itemOption)
{
return GetItemOptionFilter(itemOption.ItemId, itemOption.Name, itemOption.Context);
}
private String GetItemOptionFilter (ItemId itemId, String name, String context)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return "1=0";
if (StringUtil.IsEmpty(name)) return "1=0";
// Item identifying values.
SaItemOption.Params prmItemOption = new SaItemOption.Params();
prmItemOption.IncludedItemIds.Add(itemId);
prmItemOption.IncludedNameContexts.Add(name,context);
prmItemOption.StatusCat = SaItemOption.StatusCat.Any;
return GetItemOptionQueryFilter(prmItemOption).Concat(" And ", "(", ")");
}
//-------------------------------------------------------------------
// Associated data.
//-------------------------------------------------------------------
// Create Item.
public override SaItemOption CreateItemOption (ItemId itemId, string name, string context)
{
ClearErrorState();
return new SaItemOption_Dbas(itemId, name, context, 0);
}
public SaItemOption CreateItemOption (SaItemOption_Db dbItemOption)
{
ClearErrorState();
SaItemOption itemOption = new SaItemOption_Dbas(new ItemId(dbItemOption._ItemType, new SysId(dbItemOption._ItemId)), dbItemOption._Name, dbItemOption._Context, (ushort)dbItemOption._Flags);
PopulateFrom(dbItemOption, itemOption);
return itemOption;
}
private SaItemOption CreateItemOption (DbDataReader dataReader)
{
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
dbItemOption.PopulateFrom(dataReader);
return CreateItemOption(dbItemOption);
}
//-------------------------------------------------------------------
// Item exists.
public override bool ItemOptionExists (SaItemOption itemOption)
{
return ItemOptionExists(itemOption.ItemId, itemOption.Name, itemOption.Context);
}
public override bool ItemOptionExists (ItemId itemId, String name, string context)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return false;
if (StringUtil.IsEmpty(name)) return false;
return GetItemOptionCount(GetItemOptionFilter(itemId, name, context)) == 1;
}
//-------------------------------------------------------------------
// Get Item.
private SaItemOption GetItemOption (String filter)
{
ClearErrorState();
if (GetItemOptionCount(filter) != 1) return null;
SaItemOption itemOption = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
dbItemOption.PopulateFrom(dbCommand, aliasItemOption, filter);
itemOption = CreateItemOption(dbItemOption);
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetItemOption\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return itemOption;
}
public override SaItemOption GetItemOption (SaItemOption itemOption)
{
ClearErrorState();
if (itemOption == null) return null;
if (!ItemId.IsValid(itemOption.ItemId)) return null;
if (StringUtil.IsEmpty(itemOption.Name)) return null;
return GetItemOption(GetItemOptionFilter(itemOption));
}
public override SaItemOption GetItemOption (ItemId itemId, string name, string context)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return null;
if (StringUtil.IsEmpty(name)) return null;
return GetItemOption(GetItemOptionFilter(itemId, name, context));
}
//-------------------------------------------------------------------
// Validate Item.
public override bool IsValidItemOptionData (SaItemOption.Data itemOptionData, SaItemOption.ErrField errField)
{
ClearErrorState();
if (!base.IsValidItemOptionData(itemOptionData, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Item.
public override bool InsertItemOption (SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidItemOption(itemOption)) return false;
//if (itemOption.Id.IsValid()) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
PopulateTo(dbItemOption, itemOption, dbUpdateInfo);
if (SaItemOption_Db.FieldsNonId.Contains("Id"))
{
// Item has no Id.
//dbItemOption._Id = SysId.ToInt(Database.GetNextId("SaItemOption", dbUpdateInfo));
}
dbItemOption.ExecuteInsertCommand(dbCommand);
//itemOption.Id = new SysId(dbItemOption._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Item.
public override bool UpdateItemOption (SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidItemOption(itemOption)) return false;
//if (!itemOption.Id.IsValid()) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve itemOption.
dbConnection.Open();
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
dbItemOption.PopulateFrom(dbCommand, aliasItemOption, GetItemOptionFilter(itemOption));
// Update properties.
PopulateTo(dbItemOption, itemOption, dbUpdateInfo);
dbItemOption.ExecuteUpdateCommand(dbCommand);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Item.
public override bool ItemOptionCanBeDeleted (SaItemOption itemOption)
{
ClearErrorState();
if (!base.ItemOptionCanBeDeleted(itemOption)) return false;
return true;
}
public override bool DeleteItemOption (SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemOptionCanBeDeleted(itemOption)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve itemOption.
dbConnection.Open();
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
dbItemOption.PopulateFrom(dbCommand, aliasItemOption, GetItemOptionFilter(itemOption));
// Delete itemOption.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + SaItemOptionDbDfn.GetTableName(SaItemOptionDbDfn.TableIdx.SaItemOption) + " WHERE " + GetItemOptionFilter(itemOption) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
public override bool ClearItemOptionsForItem (ItemId itemId, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ItemId.IsValid(itemId)) return SetErrorState("Item Id must be specified");
String colItemType = SaItemOptionDbDfn.GetColumnName(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemType);
String colItemId = SaItemOptionDbDfn.GetColumnName(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemId);
String query = "Delete From "+TableName_ItemOption+" WHERE "+colItemType+"="+itemId.Type.ToString()+" AND "+colItemId+"="+SysId.ToString(itemId.Id);
Database.ExecuteNonQuery(query);
if (Database.HasErrorState())
SetErrorState("Failed to clear item options - " + Database.ErrorStateMessage);
return !HasErrorState();
}
//-------------------------------------------------------------------
// Item Option Value encryption inherited from C++ Sapphire.
// The encryption key must not be changed where data shared with Sapphire.
private static String encryptedOptionValueKey = "SaItemOptionMgr_Odbc";
// Copy data properties to and from database.
private void PopulateTo (SaItemOption_Db dbItemOption, SaItemOption itemOption, DbUpdateInfo dbUpdateInfo)
{
dbItemOption._ItemType = itemOption.ItemId.Type;
dbItemOption._ItemId = SysId.ToInt(itemOption.ItemId.Id);
dbItemOption._Name = itemOption.Name;
dbItemOption._Context = itemOption.Context;
dbItemOption._Value = itemOption.Value;
if (itemOption.Encrypted)
dbItemOption._Value = SacsDataFn._saecs(itemOption.Value, new SacsData(encryptedOptionValueKey));
// Common properties.
dbItemOption._Notes = itemOption.Notes;
dbItemOption._Status = SacsSystem.GetStatusCode(itemOption.Status);
dbItemOption._Flags = (short)itemOption.Flags;
if (!SysId.IsValid(itemOption.Id))
{
dbItemOption._CreateOn = DateTime.Now;
dbItemOption._CreateBy = dbUpdateInfo.UserId.ToInt();
dbItemOption._CreateHost = dbUpdateInfo.Host;
}
dbItemOption._UpdateOn = DateTime.Now;
dbItemOption._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbItemOption._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (SaItemOption_Db dbItemOption, SaItemOption itemOption)
{
//itemOption.ItemId = new ItemId(dbItemOption._ItemType, new SysId(dbItemOption._ItemId));
//itemOption.Name = dbItemOption._Name;
//itemOption.Context = dbItemOption._Context;
itemOption.Value = dbItemOption._Value;
if (itemOption.Encrypted)
itemOption.Value = SacsDataFn._sadcs(dbItemOption._Value, new SacsData(encryptedOptionValueKey));
// Common properties.
itemOption.Notes = dbItemOption._Notes;
itemOption.Status = SacsSystem.GetStatusForCode(dbItemOption._Status);
itemOption.SetCreateStamp(dbItemOption._CreateOn, new SysId(dbItemOption._CreateBy), dbItemOption._CreateHost);
itemOption.SetUpdateStamp(dbItemOption._UpdateOn, new SysId(dbItemOption._UpdateBy), dbItemOption._UpdateHost);
itemOption.AcceptChanges();
}
//-------------------------------------------------------------------
// Column definitions.
private static readonly String aliasItemOption = "aItmOpt";
private void SetItemOptionColDfn
(ColumnDfn col, String caption, int width, SaItemOptionDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaItemOptionDbDfn.GetTableForColumn(dbCol) == SaItemOptionDbDfn.TableIdx.SaItemOption)
alias = aliasItemOption;
col.Set(caption, width, (int)dbCol, prefix + SaItemOptionDbDfn.GetColumnName(dbCol, false), SaItemOptionDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
}
public override ColumnDfn GetItemOptionColumnDfn (SaItemOption.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
switch (columnId)
{
case SaItemOption.Column.Pos:
SetItemOptionColDfn(columnDfn, "Pos", 45, SaItemOptionDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaItemOption.Column.ItemType:
SetItemOptionColDfn(columnDfn, "Item type", 80, SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SaItemOption.Column.ItemType_Desc:
SetItemOptionColDfn(columnDfn, "Item type", 100, SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemType);
break;
case SaItemOption.Column.Group:
SetItemOptionColDfn(columnDfn, "Group", 100, SaItemOptionDbDfn.ColumnIdx.Unknown);
columnDfn.ReadOnly = true;
break;
case SaItemOption.Column.Name:
SetItemOptionColDfn(columnDfn, "Name", 100, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name);
columnDfn.MaxLength = (int)SaItemOptionDbDfn.GetColTextLen(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name);
break;
case SaItemOption.Column.Name_Display:
SetItemOptionColDfn(columnDfn, "Name", 100, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name);
columnDfn.ReadOnly = true;
break;
case SaItemOption.Column.Context:
SetItemOptionColDfn(columnDfn, "Context", 160, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context);
columnDfn.MaxLength = (int)SaItemOptionDbDfn.GetColTextLen(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context);
break;
case SaItemOption.Column.Context_Display:
SetItemOptionColDfn(columnDfn, "Context", 160, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context);
columnDfn.ReadOnly = true;
break;
case SaItemOption.Column.Value:
SetItemOptionColDfn(columnDfn, "Value", 200, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Value);
columnDfn.MaxLength = (int)SaItemOptionDbDfn.GetColTextLen(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Value);
break;
case SaItemOption.Column.Value_Display:
SetItemOptionColDfn(columnDfn, "Value", 200, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Value);
columnDfn.ReadOnly = true;
break;
case SaItemOption.Column.Password:
SetItemOptionColDfn(columnDfn, "Password", 45, SaItemOptionDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Bool);
columnDfn.BoolFormat = ColumnBoolFormat.YorN;
break;
// Common properties.
case SaItemOption.Column.Notes:
SetItemOptionColDfn(columnDfn, "Notes", 240, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Notes);
columnDfn.MaxLength = (int)SaItemOptionDbDfn.GetColTextLen(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Notes);
break;
case SaItemOption.Column.Status:
SetItemOptionColDfn(columnDfn, "Status", 80, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Status, ColumnAlignment.Center);
break;
case SaItemOption.Column.Status_Desc:
SetItemOptionColDfn(columnDfn, "Status", 90, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Status, ColumnAlignment.Center);
break;
case SaItemOption.Column.Status_Ind:
SetItemOptionColDfn(columnDfn, "Status", 80, SaItemOptionDbDfn.ColumnIdx.SaItemOption_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaItemOption.Column.CreateOn_Date:
SetItemOptionColDfn(columnDfn, "Created", 80, SaItemOptionDbDfn.ColumnIdx.SaItemOption_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaItemOption.Column.UpdateOn_Date:
SetItemOptionColDfn(columnDfn, "Updated", 80, SaItemOptionDbDfn.ColumnIdx.SaItemOption_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Query filter.
public override List<string> GetItemOptionQueryFilter (SaItemOption.Params prm)
{
List<String> filter = new List<String>();
// Item Ids.
List<String> filterItemId = new List<String>();
String colItemType = SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemType, aliasItemOption);
String colItemId = SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemId, aliasItemOption);
foreach (ItemId itemId in prm.IncludedItemIds)
{
filterItemId.Add(colItemType + "=" + itemId.Type.ToString() + " And " + colItemId + "=" + SysId.ToString(itemId.Id));
}
if (filterItemId.Count > 0)
filter.Add(filterItemId.Concat(" Or ", "(", ")"));
// Included Name/Context combinations.
List<String> nameContextFilters = new List<string>();
String colName = SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name, aliasItemOption);
String colContext = SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context, aliasItemOption);
foreach (StringPair nameContext in prm.IncludedNameContexts)
{
String nameContextFilter = colName + "='" + DbQuery.FormatForCondition(nameContext.Item1) +"'";
if (!StringUtil.IsEmpty(nameContext.Item2))
nameContextFilter += " And " + colContext + "='" + DbQuery.FormatForCondition(nameContext.Item2) + "'";
nameContextFilters.Add(nameContextFilter);
}
if (nameContextFilters.Count > 0)
filter.Add(nameContextFilters.Concat(" Or ","(",")"));
// Status.
String colStatus = SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Status, aliasItemOption);
String statusCurrent = SacsSystem.GetStatusCode(SaStatus.Current);
String statusDeleted = SacsSystem.GetStatusCode(SaStatus.Deleted);
if (prm.StatusCat == SaItemOption.StatusCat.CurrentOnly)
filter.Add(colStatus + " In ('" + statusCurrent + "')");
else if (prm.StatusCat == SaItemOption.StatusCat.NotDeleted)
filter.Add(colStatus + " Not In ('" + statusDeleted + "')");
else if (prm.StatusCat == SaItemOption.StatusCat.DeletedOnly)
filter.Add(colStatus + " In ('" + statusDeleted + "')");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Sort columns.
public List<String> GetItemOptionSortColumns (SaItemOption.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for ItemOption columns in case of conflict.
String sortCol = String.Empty;
if (SaItemOptionDbDfn.GetTableForColumn((SaItemOptionDbDfn.ColumnIdx)columnDfn.DbColumn) == SaItemOptionDbDfn.TableIdx.SaItemOption)
{
sortCol = SaItemOptionDbDfn.GetColumnNameQual((SaItemOptionDbDfn.ColumnIdx)columnDfn.DbColumn, aliasItemOption);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
{
sortCol = columnDfn.SortDataName;
}
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemType, aliasItemOption) + " DESC");
sortColumnNames.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemId, aliasItemOption) + " DESC");
sortColumnNames.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name, aliasItemOption) + " DESC");
sortColumnNames.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context, aliasItemOption) + " DESC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Item count.
private long GetItemOptionCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(SaItemOptionDbDfn.GetTableName(SaItemOptionDbDfn.TableIdx.SaItemOption) + " As " + aliasItemOption, filter);
}
public override long GetItemOptionCount (SaItemOption.Params prm)
{
ClearErrorState();
return GetItemOptionCount(GetItemOptionQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Item list.
public override List<SaItemOption> GetItemOptionList (SaItemOption.Params prm)
{
List<SaItemOption> itemOptions = new List<SaItemOption>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(TableName_ItemOption, aliasItemOption);
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
qry.Columns.AddRange(dbItemOption.ExistingColumnNames);
qry.Filters.AddRange(GetItemOptionQueryFilter(prm));
qry.OrderBy.AddRange(GetItemOptionSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
itemOptions.Add(CreateItemOption(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetItemOptionList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return itemOptions;
}
//-------------------------------------------------------------------
// Item query.
public override DbResultSet ExecuteItemOptionQuery (List<ColumnDfn> columns, SaItemOption.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(SaItemOptionDbDfn.GetTableName(SaItemOptionDbDfn.TableIdx.SaItemOption), aliasItemOption);
// Add columns as defined in query list.
if (columns.HasId((int)SaItemOption.Column.ItemType) || columns.HasId((int)SaItemOption.Column.ItemType_Desc))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemType, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.ItemId))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemId, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.Name) || columns.HasId((int)SaItemOption.Column.Name))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.Context) || columns.HasId((int)SaItemOption.Column.Context))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.Value) || columns.HasId((int)SaItemOption.Column.Value_Display))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Value, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.Notes))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Notes, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.Status) || columns.HasId((int)SaItemOption.Column.Status_Desc) || columns.HasId((int)SaItemOption.Column.Status_Ind))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Status, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.CreateOn_Date))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_CreateOn, aliasItemOption));
if (columns.HasId((int)SaItemOption.Column.UpdateOn_Date))
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_UpdateOn, aliasItemOption));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetItemOptionQueryFilter(prm));
// Configure sort sequence.
foreach (String sortColumn in GetItemOptionSortColumns(prm))
query.OrderBy.Add(sortColumn);
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,21 @@
using System;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ItemOptions;
namespace Sarand.Net.Standard.Dbas.ItemOptions
{
//=======================================================================
internal class SaItemOption_Dbas : SaItemOption
{
//-------------------------------------------------------------------
// Construction.
public SaItemOption_Dbas (ItemId itemId, String name, String context, ushort flags) :
base(itemId, name, context)
{
Flags = flags;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,112 @@
using System;
using System.IO;
using System.Reflection;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.ItemOptions
{
//=======================================================================
public static class SaItemOptionsDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand Item Options Module database definition generator";
//private static String dbConnectionString = "Driver={SQL Server Native Client 11.0};Server=Sarand106\\SQL2014;Database=SaStockTracker_Solent_STN;Trusted_Connection=Yes;MARS_Connection=yes;";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate(String connectionString)
{
String fn = nameof(SaItemOptionsDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition(SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory,
};
// Schema - Tables.
config.Schema.Tables_Included.AddRange(new String[] { "SaItemOption" });
config.Schema.Tables_Excluded.AddRange(new String[] { });
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("SaItemOption", "ItemType,ItemId,Name,Context");
// Database Definition class.
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.ItemOptions";
config.DefinitionClass.Classname = "SaItemOptionDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.ItemOptions.Internal";
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder()
{
String fn = nameof(SaItemOptionsDbDfnGenerator) + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug(fn + " Assembly folder: " + directory);
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\ItemOptions\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "ItemOptions";
SaLogger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,59 @@
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ItemOptions;
using Sarand.Net.Standard.Base.UpdateLog;
namespace Sarand.LogisticsMgr.Win.Dbas.UpdateLog
{
//=======================================================================
public class SaUpdateLogItemMonitor_ItemOption : SaUpdateLogItemMonitor
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SaUpdateLogItemMonitor.Config
{
public Config(SaUpdateLogConsole updateLogConsole, short itemType, SysId itemId, DbUpdateInfo dbUpdateInfo) :
base (updateLogConsole, dbUpdateInfo)
{
ItemType = itemType;
ItemId = itemId;
}
}
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public SaUpdateLogItemMonitor_ItemOption (SaUpdateLogConsole updateLogConsole, short itemType, SaItemOption itemOption, DbUpdateInfo dbUpdateInfo) : base(new Config(updateLogConsole, itemType, itemOption.Id,dbUpdateInfo))
{
RecordAttrValues(itemOption, false);
}
//-------------------------------------------------------------------
// Record attribute values.
public bool RecordUpdatedValues (SaItemOption itemOption)
{
return RecordAttrValues(itemOption, true);
}
private bool RecordAttrValues (SaItemOption itemOption, bool newValues)
{
ClearErrorState();
// Record values that may require logging.
RecordAttrValue(SaItemOptionDbDfn.GetColumnName(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name, false), new DataValue(itemOption.Name), newValues);
RecordAttrValue(SaItemOptionDbDfn.GetColumnName(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context, false), new DataValue(itemOption.Context), newValues);
RecordAttrValue(SaItemOptionDbDfn.GetColumnName(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Value, false), new DataValue(itemOption.Value), newValues);
// Common properties.
RecordAttrValue(SaItemOptionDbDfn.GetColumnName(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Notes, false), new DataValue(itemOption.Notes), newValues);
RecordAttrValue(SaItemOptionDbDfn.GetColumnName(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Status, false), new DataValue(SacsSystem.GetStatusCode(itemOption.Status)), newValues);
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,408 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
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.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.Proc
{
//=======================================================================
public class SaDbProcess_CompareDatabaseSchemas : SacsProcess
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SacsProcess.Config
{
public Config (SacsDatabase sourceDatabase, SacsDatabase targetDatabase)
{
SourceDatabase = sourceDatabase;
TargetDatabase = targetDatabase;
}
public SacsDatabase SourceDatabase { get; }
public SacsDatabase TargetDatabase { get; }
public bool HideIdenticalObjects { get; set; }
public bool IgnoreNullable { get; set; }
public bool IgnorePosition { get; set; }
public bool IgnoreSimilarCharTypes { get; set; }
public bool IgnoreSimilarNumericTypes { get; set; }
}
//-------------------------------------------------------------------
// Definitions.
public interface IProcessNotifier : ISacsProcessNotifier
{
void OnSchemaComparisonItemAdded (SaDbProcess_CompareDatabaseSchemas proc);
}
public class SchemaComparisonItem
{
internal SchemaComparisonItem (String tableName, String columnName, int columnPosition, String indexName, String comment)
{
Id = ++SeedId;
TableName = tableName;
ColumnName = columnName;
ColumnPosition = columnPosition;
IndexName = indexName;
Comment = comment;
}
public static int SeedId { get; private set; }
public int Id { get; }
public String TableName { get; }
public String ColumnName { get; }
public int ColumnPosition { get; }
public String IndexName { get; }
public String Comment { get; }
}
//-------------------------------------------------------------------
// Data members.
private Config config;
private IProcessNotifier processNotifier = null;
private readonly List<SchemaComparisonItem> schemaComparisonItems = new List<SchemaComparisonItem>();
//-------------------------------------------------------------------
// Construction.
public SaDbProcess_CompareDatabaseSchemas (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 Schema Comparison";
public new IProcessNotifier ProcessNotifier
{
get { return processNotifier; }
set
{
processNotifier = value;
base.ProcessNotifier = value;
}
}
//-------------------------------------------------------------------
// S c h e m a D i f f e r e n c e s
//-------------------------------------------------------------------
public List<SchemaComparisonItem> GetSchemaComparisonItems (int minId = 0)
{
return new List<SchemaComparisonItem>(schemaComparisonItems.FindAll(item => item.Id >= minId));
}
//-------------------------------------------------------------------
// P r o c e s s i n g
//-------------------------------------------------------------------
protected override bool Run ()
{
schemaComparisonItems.Clear();
if (config.SourceDatabase == null) return SetProcessError("Source database must be supplied.");
CompareTables();
return OK;
}
//-------------------------------------------------------------------
private void CompareTables ()
{
List<String> sourceTables = config.SourceDatabase.GetTableNames().OrderBy(item => item).ToList();
List<String> targetTables = config.TargetDatabase.GetTableNames().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] : "");
if (StringUtil.IsEmpty(targetTableName) || targetTableName.CompareTo(sourceTableName) > 0)
{
// Target table missing.
AddSchemaComparisonItem(sourceTableName, "", 0, "", "Table is missing");
sourceTableIdx++;
continue;
}
if (StringUtil.IsEmpty(sourceTableName) || sourceTableName.CompareTo(targetTableName) > 0)
{
// Source table missing.
AddSchemaComparisonItem(targetTableName, "", 0, "", "Table is not required");
targetTableIdx++;
continue;
}
SetProgressInfo("Processing table: " + sourceTableName);
// Table is present in both databases.
if (!config.HideIdenticalObjects) AddSchemaComparisonItem(sourceTableName, "", 0, "", "Table OK");
#if DEBUG_X
if (sourceTableName.EqualsCI("address"))
Debugger.Break();
#endif
// Retrieve table definition from each database.
DbDfnTable sourceTableDfn = config.SourceDatabase.GetTableDfn (sourceTableName);
DbDfnTable targetTableDfn = config.TargetDatabase.GetTableDfn (targetTableName);
// Compare the columns and indices.
CompareTableColumns(sourceTableDfn, targetTableDfn);
CompareTableIndices(sourceTableDfn, targetTableDfn);
// Move to next table in BOTH lists.
sourceTableIdx++;
targetTableIdx++;
}
}
//-------------------------------------------------------------------
private bool CompareTableColumns (DbDfnTable sourceTableDfn, DbDfnTable targetTableDfn)
{
String tableName = sourceTableDfn.Name;
#if DEBUG_X
if (tableName.EqualsCI("company"))
Debugger.Break();
#endif
// Columns:
List<DbDfnColumn> sourceColumns = sourceTableDfn.Columns;
List<DbDfnColumn> targetColumns = targetTableDfn.Columns;
List<String> sourceColumnNames = sourceColumns.GetNames();
List<String> targetColumnNames = targetColumns.GetNames();
sourceColumnNames.Sort();
targetColumnNames.Sort();
for (int sourceColumnIdx = 0, targetColumnIdx = 0; sourceColumnIdx < sourceColumns.Count && targetColumnIdx < targetColumns.Count;)
{
// Retrieve the Column names:
int iPosition = 0;
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);
if (sourceColumn != null) iPosition = sourceColumn.Pos;
DbDfnColumn targetColumn = targetColumns.GetColumnByName(targetColumnName);
// Compare Columns.
if (StringUtil.IsEmpty(targetColumnName) || targetColumnName.CompareTo(sourceColumnName) > 0)
{
// Column is only present in SOURCE list:
AddSchemaComparisonItem(tableName, sourceColumnName, iPosition, "", "Column is missing");
// Move to next Column in SOURCE list:
sourceColumnIdx++;
continue;
}
else if (StringUtil.IsEmpty(sourceColumnName) || sourceColumnName.CompareTo(targetColumnName) > 0)
{
// Column is only present in TARGET list:
AddSchemaComparisonItem(tableName, targetColumnName, iPosition, "", "Column is not required");
// Move to next Column in TARGET list:
targetColumnIdx++;
continue;
}
else
{
// Column is present in both databases.
List<String> lDifferences = new List<string>();
// Verify column attributes:
if (!config.IgnorePosition)
if (sourceColumn.Pos != targetColumn.Pos) lDifferences.Add("pos");
if (!sourceColumn.Name.EqualsCI(targetColumn.Name)) lDifferences.Add("name");
if (ColumnNativeDataTypesDiffer(sourceColumn, targetColumn)) lDifferences.Add((String)"native type (" + sourceColumn.DataTypeNameNative + ":" + targetColumn.DataTypeNameNative + ")");
else if (ColumnDataTypesDiffer(sourceColumn, targetColumn)) lDifferences.Add("data type (" + sourceColumn.DataTypeName + ":" + targetColumn.DataTypeName + ")");
if (ColumnSizesDiffer(sourceColumn, targetColumn)) lDifferences.Add((String)"size (" + sourceColumn.Size + ":" + targetColumn.Size + ")");
if (ColumnDecimalsDiffer(sourceColumn, targetColumn)) lDifferences.Add("decimals (" + sourceColumn.DecimalDigits + "," + targetColumn.DecimalDigits + ")");
if (!config.IgnoreNullable)
{
if (sourceColumn.Nullable != targetColumn.Nullable) lDifferences.Add("nullable");
if (sourceColumn.IsNullable != targetColumn.IsNullable) lDifferences.Add("is nullable");
}
// Display results:
if (!config.HideIdenticalObjects || !lDifferences.IsEmpty())
AddSchemaComparisonItem(tableName, sourceColumnName, iPosition, "", (lDifferences.IsEmpty() ? "Column OK" : "Different: " + lDifferences.Concat(", ")));
// Move to next Column in BOTH lists:
sourceColumnIdx++;
targetColumnIdx++;
}
}
return OK;
}
private static long iLargeSizeThreshold = 4000;
private bool ColumnSizesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
{
if (sourceColumn.Size == targetColumn.Size) return false;
// If both columns are large, treat then as equal:
if (sourceColumn.Size >= iLargeSizeThreshold && targetColumn.Size >= iLargeSizeThreshold) return false;
// If one column is large (eg. varchar max) and the other zero (eg. Access Large Text):
if (sourceColumn.Size >= iLargeSizeThreshold && targetColumn.Size == 0) return false;
if (sourceColumn.Size == 0 && targetColumn.Size >= iLargeSizeThreshold) return false;
// Check for specific data types:
String sourceDataType = sourceColumn.DataTypeNameNative;
String targetDataType = targetColumn.DataTypeNameNative;
// Ignore length check for numeric types.
if (config.IgnoreSimilarNumericTypes)
{
// Floating point types.
List<String> numericTypes = StringListUtil.Split("Real,Float,Double,Decimal,Numeric",",");
if (numericTypes.ContainsCI(sourceDataType) && numericTypes.ContainsCI(targetDataType)) return false;
}
// DateTimes:
List<String> dateTimeTypes = StringListUtil.Split("DateTime",",");
if (dateTimeTypes.ContainsCI(sourceDataType) && dateTimeTypes.ContainsCI(targetDataType)) return false;
return true;
}
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<String> floatTypes = StringListUtil.Split("Real,Float,Double",",");
List<String> 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<String> dateTimeTypes = StringListUtil.Split("DateTime",",");
if (dateTimeTypes.ContainsCI(sourceDataType) && dateTimeTypes.ContainsCI(targetDataType)) return false;
return true;
}
private bool ColumnDataTypesDiffer (DbDfnColumn sourceColumn, DbDfnColumn targetColumn)
{
if (sourceColumn.DataType == targetColumn.DataType) return false;
// Check for specific data type matches:
String sourceDataType = sourceColumn.DataTypeName;
String targetDataType = targetColumn.DataTypeName;
if (config.IgnoreSimilarCharTypes)
{
}
if (config.IgnoreSimilarNumericTypes)
{
// Similar numeric type.
List<String> 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)
{
if (sourceColumn.DataTypeNative == targetColumn.DataTypeNative) return false;
// Check for specific data type matches:
String sourceDataType = sourceColumn.DataTypeNameNative;
String targetDataType = targetColumn.DataTypeNameNative;
if (config.IgnoreSimilarCharTypes)
{
// Similar Char types.
List<String> varCharTypes = StringListUtil.Split("VarChar,LongVarChar,LongChar,NVarChar,VarWChar",",");
if (varCharTypes.ContainsCI(sourceDataType) && varCharTypes.ContainsCI(targetDataType)) return false;
}
if (config.IgnoreSimilarNumericTypes)
{
// Similar numeric types.
List<String> 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)
{
String sTable = sourceTableDfn.Name;
// Indices:
List<DbDfnIndex> sourceIndices = sourceTableDfn.Indices;
List<DbDfnIndex> targetIndices = targetTableDfn.Indices;
List<String> sourceIndexNames = sourceIndices.GetNames().OrderBy(item => item).ToList();
List<String> targetIndexNames = targetIndices.GetNames().OrderBy(item => item).ToList();
for (int sourceIndexIdx = 0, targetIndexIdx = 0; OK && sourceIndexIdx < sourceIndexNames.Count && targetIndexIdx < targetIndexNames.Count; )
{
// Retrieve the Index names.
String sourceIndexName = sourceIndexIdx < sourceIndexNames.Count ? sourceIndexNames[sourceIndexIdx] : "";
String targetIndexName = targetIndexIdx < targetIndexNames.Count ? targetIndexNames[targetIndexIdx] : "";
// Compare Indices.
if (StringUtil.IsEmpty(targetIndexName) || targetIndexName.CompareTo(sourceIndexName) > 0)
{
// Index is only present in SOURCE list.
AddSchemaComparisonItem(sTable, "", 0, sourceIndexName, "Index is missing");
// Move to next Index in SOURCE list.
sourceIndexIdx++;
}
else if (StringUtil.IsEmpty(sourceIndexName) || sourceIndexName.CompareTo(targetIndexName) > 0)
{
// Index is only present in TARGET list.
AddSchemaComparisonItem(sTable, "", 0, targetIndexName, "Index is not required");
// Move to next Index in TARGET list.
targetIndexIdx++;
}
else
{
// Index is present in both databases.
// Retrieve Index definition from each database.
DbDfnIndex sourceIndex = sourceIndices.GetIndexByName(sourceIndexName);
DbDfnIndex targetIndex = targetIndices.GetIndexByName(targetIndexName);
List<String> indexDifferences = new List<string>();
// Verify Index attributes.
if (!sourceIndex.Name.EqualsCI(targetIndex.Name)) indexDifferences.Add("name");
if (sourceIndex.Primary != targetIndex.Primary) indexDifferences.Add("primary");
if (sourceIndex.Unique != targetIndex.Unique) indexDifferences.Add("unique");
if (sourceIndex.Nullable != targetIndex.Nullable) indexDifferences.Add("nullable");
// Display results.
if (!config.HideIdenticalObjects || indexDifferences.Count > 0)
AddSchemaComparisonItem(sTable, "", 0, sourceIndexName, (indexDifferences.IsEmpty() ? "Index OK" : "Different: " + indexDifferences.Concat(",")));
// Compare index column lists:
List<DbDfnIndexColumn> sourceIndexColumns = sourceIndex.Columns;
List<DbDfnIndexColumn> targetIndexColumns = targetIndex.Columns;
for (int sourceColumnIdx = 0; sourceColumnIdx < sourceIndexColumns.Count; sourceColumnIdx++)
{
String columnName = sourceIndexColumns[sourceColumnIdx].Name;
int columnPos = sourceColumnIdx + 1;
if (!targetIndexColumns.Exists(item => item.Name.EqualsCI(columnName)))
AddSchemaComparisonItem(sTable, columnName, columnPos, sourceIndexName, "Index column is missing");
else if (sourceColumnIdx != targetIndexColumns.GetPosForName(columnName) - 1)
AddSchemaComparisonItem(sTable, columnName, columnPos, sourceIndexName, "Index column in different position");
}
for (int targetColumnIdx = 0; targetColumnIdx < targetIndexColumns.Count; targetColumnIdx++)
{
String columnName = targetIndexColumns[targetColumnIdx].Name;
int columnPos = targetColumnIdx + 1;
if (!sourceIndexColumns.Exists(item => item.Name.EqualsCI(columnName)))
AddSchemaComparisonItem(sTable, columnName, columnPos, targetIndexName, "Index column is not required");
}
// Move to next Index in BOTH lists.
sourceIndexIdx++;
targetIndexIdx++;
}
}
return OK;
}
//-------------------------------------------------------------------
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);
}
//-------------------------------------------------------------------
}
//=======================================================================
public static class SchemaComparisonItemList
{
/// <summary>Identify the maximum Id value in the list.</summary>
public static int GetMaxId (this IEnumerable<SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem> values)
{
int maxId = 0;
foreach (SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem schemaComparisonItem in values)
maxId = Math.Max(maxId, schemaComparisonItem.Id);
return maxId;
}
}
//=======================================================================
}
@@ -0,0 +1,438 @@
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;
namespace Sarand.Net.Standard.Dbas.Proc
{
//=======================================================================
public class SaDbProcess_ConvertDbDefinition : SacsProcess
{
//-------------------------------------------------------------------
// Configuration.
public enum SourceDefinitionType
{
Unknown = 0,
CppCode
}
public enum TargetDefinitionType
{
Unknown = 0,
CsCode
}
public new class Config : SacsProcess.Config
{
public Config ()
{
}
public SourceDefinitionType SourceDefinitionType { get; set; }
public String SourceDefinitionFilePath { get; set; }
public TargetDefinitionType TargetDefinitionType { get; set; }
public String TargetDefinitionFilePath { get; set; }
}
//-------------------------------------------------------------------
// Definitions.
public interface IProcessNotifier : ISacsProcessNotifier
{
}
private class Statistics
{
}
//-------------------------------------------------------------------
// Data members.
private Config config;
private IProcessNotifier processNotifier;
private readonly List<DbDfnTable> tableDfns = new List<DbDfnTable>();
private Statistics stats;
//-------------------------------------------------------------------
// Construction.
public SaDbProcess_ConvertDbDefinition (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 new IProcessNotifier ProcessNotifier
{
get { return processNotifier; }
set
{
processNotifier = value;
base.ProcessNotifier = value;
}
}
/// <summary>Processing statistics.</summary>
public override List<StringPair> ProcessingStatistics
{
get
{
List<StringPair> processStats = new List<StringPair>();
if (stats != null)
{
//if (tableDfns.Count > 0)
processStats.Add("Tables found", tableDfns.Count.ToString());
processStats.Add("Columns found", tableDfns.GetColumnCount().ToString());
}
return processStats;
}
}
//-------------------------------------------------------------------
// P r o c e s s i n g
//-------------------------------------------------------------------
protected override bool Run ()
{
// Initialise process.
tableDfns.Clear();
stats = new Statistics();
// Validate configuration.
if (!ValidateConfiguration()) return false;
ConvertCppDatabaseDefinition();
return OK;
}
protected bool ValidateConfiguration ()
{
// Source file.
if (config.SourceDefinitionType <= 0)
return SetProcessError("Source definition type must be specified.");
if (StringUtil.IsEmpty(config.SourceDefinitionFilePath))
return SetProcessError("Source definition file must be specified.");
if (!FileUtil.IsFile(config.SourceDefinitionFilePath))
return SetProcessError("Source definition file not found.");
// Target file.
if (config.TargetDefinitionType <= 0)
return SetProcessError("Target definition type must be specified.");
if (StringUtil.IsEmpty(config.TargetDefinitionFilePath))
return SetProcessError("Target definition file must be specified.");
if (!DirectoryUtil.DirectoryExists(DirectoryUtil.GetDirectoryName(config.TargetDefinitionFilePath)))
return SetProcessError("Target folder not found.");
if (config.SourceDefinitionFilePath.EqualsCI(config.TargetDefinitionFilePath))
return SetProcessError("Target file must not be the same as the source file.");
return OK;
}
//-------------------------------------------------------------------
private bool ConvertCppDatabaseDefinition ()
{
if (!OK) return false;
// Read source database definition.
ExtractDatabaseDefinition();
return OK;
}
//-------------------------------------------------------------------
// E x t r a c t S o u r c e D e f i n i t i o n
//-------------------------------------------------------------------
private class TableData
{
public String TableName { get; set; } = "";
public int TableIdx { get; set; } = -1;
}
private class ColumnData
{
public String TableName { get; set; } = "";
public String ColumnName { get; set; } = "";
public int DataType { get; set; } = -1;
public int ColumnLength { get; set; } = -1;
public int TableIdx { get; set; } = -1;
public int ColumnIdx { get; set; } = -1;
}
private class SourceDefinition_Params
{
protected SourceDefinition_Params () { }
public int LineNumber { get; set; } = -1;
public int TableIdx { get; set; } = -1;
public int ColumnIdx { get; set; } = -1;
}
private class SourceDefinition_Params_CppCode : SourceDefinition_Params
{
public bool TablesEnumFound { get; set; }
public bool InTablesEnum { get; set; }
public bool ColumnsEnumFound { get; set; }
public bool InColumnsEnum { get; set; }
public bool ColumnsDfnsFound { get; set; }
public bool InColumnsDfns { get; set; }
public Dictionary<String, TableData> TableMap { get; } = new Dictionary<String, TableData>();
public Dictionary<StringPair, ColumnData> ColumnMap { get; } = new Dictionary<StringPair, ColumnData>();
}
//-------------------------------------------------------------------
private bool ExtractDatabaseDefinition ()
{
if (!OK) return false;
// Source definition parameters.
SourceDefinition_Params sourceDfnParams = null;
SourceDefinition_Params_CppCode sourceDfnParams_CppCode = null;
if (config.SourceDefinitionType == SourceDefinitionType.CppCode)
{
sourceDfnParams_CppCode = new SourceDefinition_Params_CppCode();
sourceDfnParams = sourceDfnParams_CppCode;
}
try
{
// Extract source database definition.
using (StreamReader file = new StreamReader(config.SourceDefinitionFilePath))
{
while (OK)
{
String line = file.ReadLine();
if (line == null) break;
sourceDfnParams.LineNumber++;
SetProgressInfo("Extracting source database definition.");
line = line.Trim(new char[] { ' ', '\t', '\r', '\n' });
if (config.SourceDefinitionType == SourceDefinitionType.CppCode)
{
ExtractDatabaseDefinitionLine_CppCode(sourceDfnParams_CppCode, line);
}
}
file.Close();
}
// Generate target database definition.
String dbDfnClassname = "SaDbDfn";
using (System.IO.StreamWriter file = new System.IO.StreamWriter(config.TargetDefinitionFilePath))
{
file.WriteLine("using Sarand.Net.Standard.Base.Core;");
file.WriteLine("using Sarand.Net.Standard.Base.Dbas;");
file.WriteLine("using System;");
file.WriteLine("using System.Collections.Generic;");
file.WriteLine("using System.Linq;");
file.WriteLine("");
file.WriteLine("//---------------------------------------------------------------------------");
file.WriteLine("// Code generated by Sarand Database Utilities " + DateTime.Now.Format("ddd d-MMM-yyyy HH:mm:ss"));
file.WriteLine("//---------------------------------------------------------------------------");
file.WriteLine("namespace sarand.database.definition");
file.WriteLine("{");
file.WriteLine("\tpublic class " + dbDfnClassname);
file.WriteLine("\t{");
file.WriteLine("\t\t//-------------------------------------------------------------------");
DatabaseDefinitionGenerator.GenerateDatabaseDefinitionTablesEnum(tableDfns, file);
DatabaseDefinitionGenerator.GenerateDatabaseDefinitionColumnsEnum(tableDfns, file);
DatabaseDefinitionGenerator.GenerateDatabaseDefinitionClass(tableDfns, dbDfnClassname, file);
file.WriteLine("\t}");
file.WriteLine("}");
file.Close();
}
}
catch (Exception exc) { SaLogger.Warn(ExceptionUtil.GetLogMessage(exc)); SetProcessError(ExceptionUtil.GetErrorStateMessage(exc)); }
return OK;
}
//-------------------------------------------------------------------
// C + + C o d e S o u r c e
//-------------------------------------------------------------------
private readonly Dictionary<int,String> cppColumnDataTypes = new Dictionary<int, string>()
{
{ 1, "VarChar" },
{ -7, "Bit" },
{ -6, "TinyInt" },
{ 5, "SmallInt" },
{ -16, "Int" },
{ -25, "BigInt" },
{ 7, "Single" },
{ 8, "Double" },
{ 93, "DateTime" }
};
private bool ExtractDatabaseDefinitionLine_CppCode (SourceDefinition_Params_CppCode sourceDfnParams, String line)
{
if (!OK) return false;
// C++ Code definition.
//---------------------------------------------------------------
// Table enums.
if (line.EqualsCI("enum eSaDbTable"))
{
// Table enum start.
if (sourceDfnParams.TablesEnumFound)
return SetProcessError("Found multiple table enums at line " + sourceDfnParams.LineNumber + ": " + line + ".");
sourceDfnParams.TablesEnumFound = true;
sourceDfnParams.InTablesEnum = true;
return OK;
}
if (sourceDfnParams.InTablesEnum)
{
// In Tables enum.
if (line.Equals("};") || line.EqualsCI("// Database column identifiers:"))
sourceDfnParams.InTablesEnum = false;
else if (!line.ContainsCI("eSaDbTblUnknown"))
{
if (!line.ContainsCI("eSaDbTbl"))
return SetProcessError("Invalid table definition on line " + sourceDfnParams.LineNumber + ": " + line + ".");
// Extract table name.
String tableName = line.ReplaceAll("eSaDbTbl","").ReplaceAll(",","");
if (StringUtil.IsEmpty(tableName))
return SetProcessError("Blank table name on line " + sourceDfnParams.LineNumber + ": " + line + ".");
if (tableDfns.Exists(item => item.Name.EqualsCI(tableName)))
return SetProcessError("Duplicate table name on line " + sourceDfnParams.LineNumber + ": " + line + ".");
// Add this table to the list.
sourceDfnParams.TableIdx++;
//SaLogger.Debug("Table #" + sourceDfnParams.TableIdx + ": " + tableName);
sourceDfnParams.TableMap.Add(tableName, new TableData() { TableName = tableName, TableIdx = sourceDfnParams.TableIdx });
tableDfns.Add(new DbDfnTable("", tableName, ""));
}
return OK;
}
//---------------------------------------------------------------
// Column enums.
if (line.EqualsCI("enum eSaDbColumn"))
{
// Column enum start.
if (sourceDfnParams.ColumnsEnumFound)
return SetProcessError("Found multiple columns enums at line " + sourceDfnParams.LineNumber + ": " + line + ".");
sourceDfnParams.ColumnsEnumFound = true;
sourceDfnParams.InColumnsEnum = true;
return OK;
}
if (sourceDfnParams.InColumnsEnum)
{
// In Columns enum.
if (line.Equals("};") || line.StartsWithCI("//----"))
sourceDfnParams.InColumnsEnum = false;
else if (!line.ContainsCI("eSaDbColUnknown"))
{
if (!line.ContainsCI("eSaDbCol"))
return SetProcessError("Invalid column definition on line " + sourceDfnParams.LineNumber + ": " + line + ".");
// Column definitions:
// eSaDbColUnknown = -1,
// #define eSaDbColVendorType_ListID (eSaDbColumn)4101
// #define eSaDbColSaCode_Notes (eSaDbColumn)101
// Extract Table/Column name pair - value starts 'eSaDbCol'.
int colDfnStartIdx = line.IndexOf("eSaDbCol");
String tableColumnName = line.Substring(colDfnStartIdx + "eSaDbCol".Length);
// Table/Column names end with space, equals or comma.
int colDfnEndIdx = tableColumnName.IndexOf(' ');
if (colDfnEndIdx > 0)
tableColumnName = tableColumnName.Left(colDfnEndIdx + 1);
colDfnEndIdx = tableColumnName.IndexOf('=');
if (colDfnEndIdx > 0)
tableColumnName = tableColumnName.Left(colDfnEndIdx + 1);
colDfnEndIdx = tableColumnName.IndexOf(',');
if (colDfnEndIdx > 0)
tableColumnName = tableColumnName.Left(colDfnEndIdx + 1);
//SaLogger.Debug("Table/Column name: " + tableColumnName);
// Split table and column names on Underscore.
String[] tableColumnNameParts = tableColumnName.Split('_');
if (tableColumnNameParts.Length != 2)
return SetProcessError("Invalid column definition on line (missing underscore?) " + sourceDfnParams.LineNumber + ": " + line + ".");
sourceDfnParams.ColumnIdx++;
String tableName = tableColumnNameParts[0];
String columnName = tableColumnNameParts[1];
//SaLogger.Debug("Column #" + sourceDfnParams.ColumnIdx + ": " + tableName + "." + columnName);
sourceDfnParams.ColumnMap.Add(new StringPair(tableName, columnName), new ColumnData() { TableName = tableName, ColumnName = columnName, ColumnIdx = sourceDfnParams.ColumnIdx });
}
return OK;
}
//---------------------------------------------------------------
// Column definitions.
if (line.StartsWithCI("SaDbColumnDefinition dfnColumn []"))
{
// Column definitions start.
if (sourceDfnParams.ColumnsDfnsFound)
return SetProcessError("Found multiple column definitions at line " + sourceDfnParams.LineNumber + ": " + line + ".");
sourceDfnParams.ColumnsDfnsFound = true;
sourceDfnParams.InColumnsDfns = true;
sourceDfnParams.ColumnIdx = -1;
return OK;
}
if (sourceDfnParams.InColumnsDfns)
{
if (line.Equals("{")) return OK;
if (line.Equals("};"))
{
sourceDfnParams.InColumnsDfns = false;
return OK;
}
// Column definition:
// { TableIdx,"ColumnName",DataType,Length }, ... [multiple per line]
// Column data types:
// eString = 1 SQL_C_CHAR
// eBool = -7 SQL_C_BIT
// eByte = -6 SQL_C_TINYINT
// eShortInt = 5 SQL_C_SHORT
// eLongInt = -16 SQL_C_SLONG
// eBigInt = -25 SQL_C_SBIGINT
// eReal = 7 SQL_C_FLOAT
// eDouble = 8 SQL_C_DOUBLE
// eTime = 93 SQL_C_TYPE_TIMESTAMP
foreach (String columnDfnDataRaw in line.Split(new String[] { "}," }, StringSplitOptions.RemoveEmptyEntries))
{
String columnDfnData = columnDfnDataRaw.ReplaceAll("{","").TrimAll();
//SaLogger.Debug("Column dfn: " + columnDfnData);
String[] columnDfnParts = columnDfnData.Split(',');
if (columnDfnParts.Length != 4) return SetProcessError("Invalid column definition (expecting 4 parts) at line " + sourceDfnParams.LineNumber + ": " + line + ".");
String tableIdxRaw = columnDfnParts[0].TrimAll();
int tableIdx = StringUtil.ToInt(tableIdxRaw);
String columnName = columnDfnParts[1].TrimAll().ReplaceAll("\"","");
String dataTypeRaw = columnDfnParts[2].TrimAll();
int dataType = StringUtil.ToInt(dataTypeRaw);
String columnLengthRaw = columnDfnParts[3].TrimAll();
int columnLength = StringUtil.ToInt(columnLengthRaw);
if (!tableIdxRaw.IsNumeric()) return SetProcessError("Invalid table index in column definition (" + tableIdxRaw + ") at line " + sourceDfnParams.LineNumber + ": " + line + ".");
if (StringUtil.IsEmpty(columnName)) return SetProcessError("Blank name in column definition at line " + sourceDfnParams.LineNumber + ": " + line + ".");
if (!dataTypeRaw.IsNumeric(true) || !cppColumnDataTypes.ContainsKey(dataType)) return SetProcessError("Invalid data type in column definition (" + dataTypeRaw + ") at line " + sourceDfnParams.LineNumber + ": " + line + ".");
if (!columnLengthRaw.IsNumeric()) return SetProcessError("Invalid column length in column definition (" + columnLengthRaw + ") at line " + sourceDfnParams.LineNumber + ": " + line + ".");
// Table definition.
String tableName = sourceDfnParams.TableMap.Values.ToList().Find(item => item.TableIdx == tableIdx)?.TableName ?? "";
if (StringUtil.IsEmpty(tableName)) return SetProcessError("Unable to identify table name for Table idx " + tableIdx + " at line " + sourceDfnParams.LineNumber + ": " + line + ".");
DbDfnTable tableDfn = tableDfns.GetTableByName(tableName);
if (tableDfn == null) return SetProcessError("Unable to retrieve table definition for Table name " + tableName + " at line " + sourceDfnParams.LineNumber + ": " + line + ".");
// Column data.
sourceDfnParams.ColumnIdx++;
ColumnData columnData = sourceDfnParams.ColumnMap.Values.ToList().Find(item => item.TableName.EqualsCI(tableName) && item.ColumnIdx == sourceDfnParams.ColumnIdx);
if (columnData == null) return SetProcessError("Unable to column data for table " + tableName + " and column " + columnName + " at line " + sourceDfnParams.LineNumber + ": " + line + ".");
if (columnData.ColumnName.EqualsCI(columnName)) return SetProcessError("Inconsistent column name for table " + tableName + " and column " + columnName + " at line " + sourceDfnParams.LineNumber + ": " + line + ".");
// Column definition.
DbDfnColumn columnDfn = new DbDfnColumn()
{
Table = tableName,
Name = columnName,
DataType = EnumUtil.ParseEnum(cppColumnDataTypes.GetValue(dataType,""),DbColumnDataType.Unknown),
Size = columnLength
};
if (columnDfn.DataType < 0) return SetProcessError("Invalid data type for table " + tableName + " and column " + columnName + " at line " + sourceDfnParams.LineNumber + ": " + line + ".");
tableDfn.AddColumn(columnDfn);
}
return OK;
}
//---------------------------------------------------------------
return OK;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,230 @@
using Microsoft.Data.SqlClient;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:11:01
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ReferenceData.Internal
{
internal class Currency_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataString _Name { get; } = new ColumnDataString("Name");
public ColumnDataInt32 _Primary { get; } = new ColumnDataInt32("Primary");
public ColumnDataString _Division { get; } = new ColumnDataString("Division");
public ColumnDataInt32 _Region { get; } = new ColumnDataInt32("Region");
public ColumnDataString _Symbol { get; } = new ColumnDataString("Symbol");
public ColumnDataBoolean _Suffix { get; } = new ColumnDataBoolean("Suffix");
public ColumnDataBoolean _IncSpace { get; } = new ColumnDataBoolean("IncSpace");
public ColumnDataInt16 _Decimals { get; } = new ColumnDataInt16("Decimals");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Code",
"Name",
"Primary",
"Division",
"Region",
"Symbol",
"Suffix",
"IncSpace",
"Decimals",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"",
};
//-------------------------------------------------------------------
// Construction.
internal Currency_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "Currency";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public String _Name { get { return Cols._Name.Value; } set { Cols._Name.Value = value; } }
public Int32 _Primary { get { return Cols._Primary.Value; } set { Cols._Primary.Value = value; } }
public String _Division { get { return Cols._Division.Value; } set { Cols._Division.Value = value; } }
public Int32 _Region { get { return Cols._Region.Value; } set { Cols._Region.Value = value; } }
public String _Symbol { get { return Cols._Symbol.Value; } set { Cols._Symbol.Value = value; } }
public Boolean _Suffix { get { return Cols._Suffix.Value; } set { Cols._Suffix.Value = value; } }
public Boolean _IncSpace { get { return Cols._IncSpace.Value; } set { Cols._IncSpace.Value = value; } }
public Int16 _Decimals { get { return Cols._Decimals.Value; } set { Cols._Decimals.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_Name = GetFieldString(dbDataReader, "Name", _Name);
_Primary = GetFieldInt32(dbDataReader, "Primary", _Primary);
_Division = GetFieldString(dbDataReader, "Division", _Division);
_Region = GetFieldInt32(dbDataReader, "Region", _Region);
_Symbol = GetFieldString(dbDataReader, "Symbol", _Symbol);
_Suffix = GetFieldBoolean(dbDataReader, "Suffix", _Suffix);
_IncSpace = GetFieldBoolean(dbDataReader, "IncSpace", _IncSpace);
_Decimals = GetFieldInt16(dbDataReader, "Decimals", _Decimals);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("Primary")) AddCommandParameter(dbCommand, "@Primary", _Primary);
if (columnNames.ContainsCI("Division")) AddCommandParameter(dbCommand, "@Division", _Division);
if (columnNames.ContainsCI("Region")) AddCommandParameter(dbCommand, "@Region", _Region);
if (columnNames.ContainsCI("Symbol")) AddCommandParameter(dbCommand, "@Symbol", _Symbol);
if (columnNames.ContainsCI("Suffix")) AddCommandParameter(dbCommand, "@Suffix", _Suffix);
if (columnNames.ContainsCI("IncSpace")) AddCommandParameter(dbCommand, "@IncSpace", _IncSpace);
if (columnNames.ContainsCI("Decimals")) AddCommandParameter(dbCommand, "@Decimals", _Decimals);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("Primary")) AddCommandParameter(dbCommand, "@Primary", _Primary);
if (columnNames.ContainsCI("Division")) AddCommandParameter(dbCommand, "@Division", _Division);
if (columnNames.ContainsCI("Region")) AddCommandParameter(dbCommand, "@Region", _Region);
if (columnNames.ContainsCI("Symbol")) AddCommandParameter(dbCommand, "@Symbol", _Symbol);
if (columnNames.ContainsCI("Suffix")) AddCommandParameter(dbCommand, "@Suffix", _Suffix);
if (columnNames.ContainsCI("IncSpace")) AddCommandParameter(dbCommand, "@IncSpace", _IncSpace);
if (columnNames.ContainsCI("Decimals")) AddCommandParameter(dbCommand, "@Decimals", _Decimals);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,207 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:11:01
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ReferenceData.Internal
{
internal class Language_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataString _Name { get; } = new ColumnDataString("Name");
public ColumnDataInt32 _Primary { get; } = new ColumnDataInt32("Primary");
public ColumnDataBoolean _Unicode { get; } = new ColumnDataBoolean("Unicode");
public ColumnDataBoolean _Translation { get; } = new ColumnDataBoolean("Translation");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Code",
"Name",
"Primary",
"Unicode",
"Translation",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"",
};
//-------------------------------------------------------------------
// Construction.
internal Language_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "Language";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public String _Name { get { return Cols._Name.Value; } set { Cols._Name.Value = value; } }
public Int32 _Primary { get { return Cols._Primary.Value; } set { Cols._Primary.Value = value; } }
public Boolean _Unicode { get { return Cols._Unicode.Value; } set { Cols._Unicode.Value = value; } }
public Boolean _Translation { get { return Cols._Translation.Value; } set { Cols._Translation.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_Name = GetFieldString(dbDataReader, "Name", _Name);
_Primary = GetFieldInt32(dbDataReader, "Primary", _Primary);
_Unicode = GetFieldBoolean(dbDataReader, "Unicode", _Unicode);
_Translation = GetFieldBoolean(dbDataReader, "Translation", _Translation);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("Primary")) AddCommandParameter(dbCommand, "@Primary", _Primary);
if (columnNames.ContainsCI("Unicode")) AddCommandParameter(dbCommand, "@Unicode", _Unicode);
if (columnNames.ContainsCI("Translation")) AddCommandParameter(dbCommand, "@Translation", _Translation);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("Primary")) AddCommandParameter(dbCommand, "@Primary", _Primary);
if (columnNames.ContainsCI("Unicode")) AddCommandParameter(dbCommand, "@Unicode", _Unicode);
if (columnNames.ContainsCI("Translation")) AddCommandParameter(dbCommand, "@Translation", _Translation);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,212 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:11:01
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ReferenceData.Internal
{
internal class Region_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataString _Type { get; } = new ColumnDataString("Type");
public ColumnDataString _Name { get; } = new ColumnDataString("Name");
public ColumnDataInt32 _Parent { get; } = new ColumnDataInt32("Parent");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Type",
"Name",
"Parent",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Type",
};
//-------------------------------------------------------------------
// Construction.
internal Region_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "Region";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public String _Type { get { return Cols._Type.Value; } set { Cols._Type.Value = value; } }
public String _Name { get { return Cols._Name.Value; } set { Cols._Name.Value = value; } }
public Int32 _Parent { get { return Cols._Parent.Value; } set { Cols._Parent.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Type = GetFieldString(dbDataReader, "Type", _Type);
_Name = GetFieldString(dbDataReader, "Name", _Name);
_Parent = GetFieldInt32(dbDataReader, "Parent", _Parent);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("Parent")) AddCommandParameter(dbCommand, "@Parent", _Parent);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("Parent")) AddCommandParameter(dbCommand, "@Parent", _Parent);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,255 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:11:01
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ReferenceData.Internal
{
internal class TaxCode_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataString _CodeAlt1 { get; } = new ColumnDataString("CodeAlt1");
public ColumnDataString _CodeAlt2 { get; } = new ColumnDataString("CodeAlt2");
public ColumnDataString _Description { get; } = new ColumnDataString("Description");
public ColumnDataInt32 _RegionId { get; } = new ColumnDataInt32("RegionId");
public ColumnDataDateTime _EffectFrom { get; } = new ColumnDataDateTime("EffectFrom");
public ColumnDataDateTime _EffectTo { get; } = new ColumnDataDateTime("EffectTo");
public ColumnDataDouble _TaxRate { get; } = new ColumnDataDouble("TaxRate");
public ColumnDataDouble _TaxRatePrev { get; } = new ColumnDataDouble("TaxRatePrev");
public ColumnDataInt32 _TaxCodeIdLink { get; } = new ColumnDataInt32("TaxCodeIdLink");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Code",
"CodeAlt1",
"CodeAlt2",
"Description",
"RegionId",
"EffectFrom",
"EffectTo",
"TaxRate",
"TaxRatePrev",
"TaxCodeIdLink",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"",
};
//-------------------------------------------------------------------
// Construction.
internal TaxCode_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "TaxCode";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public String _CodeAlt1 { get { return Cols._CodeAlt1.Value; } set { Cols._CodeAlt1.Value = value; } }
public String _CodeAlt2 { get { return Cols._CodeAlt2.Value; } set { Cols._CodeAlt2.Value = value; } }
public String _Description { get { return Cols._Description.Value; } set { Cols._Description.Value = value; } }
public Int32 _RegionId { get { return Cols._RegionId.Value; } set { Cols._RegionId.Value = value; } }
public DateTime _EffectFrom { get { return Cols._EffectFrom.Value; } set { Cols._EffectFrom.Value = value; } }
public DateTime _EffectTo { get { return Cols._EffectTo.Value; } set { Cols._EffectTo.Value = value; } }
public Double _TaxRate { get { return Cols._TaxRate.Value; } set { Cols._TaxRate.Value = value; } }
public Double _TaxRatePrev { get { return Cols._TaxRatePrev.Value; } set { Cols._TaxRatePrev.Value = value; } }
public Int32 _TaxCodeIdLink { get { return Cols._TaxCodeIdLink.Value; } set { Cols._TaxCodeIdLink.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_CodeAlt1 = GetFieldString(dbDataReader, "CodeAlt1", _CodeAlt1);
_CodeAlt2 = GetFieldString(dbDataReader, "CodeAlt2", _CodeAlt2);
_Description = GetFieldString(dbDataReader, "Description", _Description);
_RegionId = GetFieldInt32(dbDataReader, "RegionId", _RegionId);
_EffectFrom = GetFieldDateTime(dbDataReader, "EffectFrom", _EffectFrom);
_EffectTo = GetFieldDateTime(dbDataReader, "EffectTo", _EffectTo);
_TaxRate = GetFieldDouble(dbDataReader, "TaxRate", _TaxRate);
_TaxRatePrev = GetFieldDouble(dbDataReader, "TaxRatePrev", _TaxRatePrev);
_TaxCodeIdLink = GetFieldInt32(dbDataReader, "TaxCodeIdLink", _TaxCodeIdLink);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("CodeAlt1")) AddCommandParameter(dbCommand, "@CodeAlt1", _CodeAlt1);
if (columnNames.ContainsCI("CodeAlt2")) AddCommandParameter(dbCommand, "@CodeAlt2", _CodeAlt2);
if (columnNames.ContainsCI("Description")) AddCommandParameter(dbCommand, "@Description", _Description);
if (columnNames.ContainsCI("RegionId")) AddCommandParameter(dbCommand, "@RegionId", _RegionId);
if (columnNames.ContainsCI("EffectFrom")) AddCommandParameter(dbCommand, "@EffectFrom", _EffectFrom);
if (columnNames.ContainsCI("EffectTo")) AddCommandParameter(dbCommand, "@EffectTo", _EffectTo);
if (columnNames.ContainsCI("TaxRate")) AddCommandParameter(dbCommand, "@TaxRate", _TaxRate);
if (columnNames.ContainsCI("TaxRatePrev")) AddCommandParameter(dbCommand, "@TaxRatePrev", _TaxRatePrev);
if (columnNames.ContainsCI("TaxCodeIdLink")) AddCommandParameter(dbCommand, "@TaxCodeIdLink", _TaxCodeIdLink);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("CodeAlt1")) AddCommandParameter(dbCommand, "@CodeAlt1", _CodeAlt1);
if (columnNames.ContainsCI("CodeAlt2")) AddCommandParameter(dbCommand, "@CodeAlt2", _CodeAlt2);
if (columnNames.ContainsCI("Description")) AddCommandParameter(dbCommand, "@Description", _Description);
if (columnNames.ContainsCI("RegionId")) AddCommandParameter(dbCommand, "@RegionId", _RegionId);
if (columnNames.ContainsCI("EffectFrom")) AddCommandParameter(dbCommand, "@EffectFrom", _EffectFrom);
if (columnNames.ContainsCI("EffectTo")) AddCommandParameter(dbCommand, "@EffectTo", _EffectTo);
if (columnNames.ContainsCI("TaxRate")) AddCommandParameter(dbCommand, "@TaxRate", _TaxRate);
if (columnNames.ContainsCI("TaxRatePrev")) AddCommandParameter(dbCommand, "@TaxRatePrev", _TaxRatePrev);
if (columnNames.ContainsCI("TaxCodeIdLink")) AddCommandParameter(dbCommand, "@TaxCodeIdLink", _TaxCodeIdLink);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,273 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:11:01
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.ReferenceData.Internal
{
internal class UnitMeasure_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataInt16 _Category { get; } = new ColumnDataInt16("Category");
public ColumnDataInt16 _Type { get; } = new ColumnDataInt16("Type");
public ColumnDataInt16 _UnitType { get; } = new ColumnDataInt16("UnitType");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataString _Abbr { get; } = new ColumnDataString("Abbr");
public ColumnDataString _Single { get; } = new ColumnDataString("Single");
public ColumnDataString _Multiple { get; } = new ColumnDataString("Multiple");
public ColumnDataDouble _EquValue { get; } = new ColumnDataDouble("EquValue");
public ColumnDataInt32 _UomIdEqu { get; } = new ColumnDataInt32("UomIdEqu");
public ColumnDataInt32 _EquAlgorythm { get; } = new ColumnDataInt32("EquAlgorythm");
public ColumnDataInt32 _UomIdRef1 { get; } = new ColumnDataInt32("UomIdRef1");
public ColumnDataInt32 _UomIdRef2 { get; } = new ColumnDataInt32("UomIdRef2");
public ColumnDataInt32 _UomIdRef3 { get; } = new ColumnDataInt32("UomIdRef3");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Category",
"Type",
"UnitType",
"Code",
"Abbr",
"Single",
"Multiple",
"EquValue",
"UomIdEqu",
"EquAlgorythm",
"UomIdRef1",
"UomIdRef2",
"UomIdRef3",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"",
};
//-------------------------------------------------------------------
// Construction.
internal UnitMeasure_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "UnitMeasure";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int16 _Category { get { return Cols._Category.Value; } set { Cols._Category.Value = value; } }
public Int16 _Type { get { return Cols._Type.Value; } set { Cols._Type.Value = value; } }
public Int16 _UnitType { get { return Cols._UnitType.Value; } set { Cols._UnitType.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public String _Abbr { get { return Cols._Abbr.Value; } set { Cols._Abbr.Value = value; } }
public String _Single { get { return Cols._Single.Value; } set { Cols._Single.Value = value; } }
public String _Multiple { get { return Cols._Multiple.Value; } set { Cols._Multiple.Value = value; } }
public Double _EquValue { get { return Cols._EquValue.Value; } set { Cols._EquValue.Value = value; } }
public Int32 _UomIdEqu { get { return Cols._UomIdEqu.Value; } set { Cols._UomIdEqu.Value = value; } }
public Int32 _EquAlgorythm { get { return Cols._EquAlgorythm.Value; } set { Cols._EquAlgorythm.Value = value; } }
public Int32 _UomIdRef1 { get { return Cols._UomIdRef1.Value; } set { Cols._UomIdRef1.Value = value; } }
public Int32 _UomIdRef2 { get { return Cols._UomIdRef2.Value; } set { Cols._UomIdRef2.Value = value; } }
public Int32 _UomIdRef3 { get { return Cols._UomIdRef3.Value; } set { Cols._UomIdRef3.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Category = GetFieldInt16(dbDataReader, "Category", _Category);
_Type = GetFieldInt16(dbDataReader, "Type", _Type);
_UnitType = GetFieldInt16(dbDataReader, "UnitType", _UnitType);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_Abbr = GetFieldString(dbDataReader, "Abbr", _Abbr);
_Single = GetFieldString(dbDataReader, "Single", _Single);
_Multiple = GetFieldString(dbDataReader, "Multiple", _Multiple);
_EquValue = GetFieldDouble(dbDataReader, "EquValue", _EquValue);
_UomIdEqu = GetFieldInt32(dbDataReader, "UomIdEqu", _UomIdEqu);
_EquAlgorythm = GetFieldInt32(dbDataReader, "EquAlgorythm", _EquAlgorythm);
_UomIdRef1 = GetFieldInt32(dbDataReader, "UomIdRef1", _UomIdRef1);
_UomIdRef2 = GetFieldInt32(dbDataReader, "UomIdRef2", _UomIdRef2);
_UomIdRef3 = GetFieldInt32(dbDataReader, "UomIdRef3", _UomIdRef3);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Category")) AddCommandParameter(dbCommand, "@Category", _Category);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("UnitType")) AddCommandParameter(dbCommand, "@UnitType", _UnitType);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Abbr")) AddCommandParameter(dbCommand, "@Abbr", _Abbr);
if (columnNames.ContainsCI("Single")) AddCommandParameter(dbCommand, "@Single", _Single);
if (columnNames.ContainsCI("Multiple")) AddCommandParameter(dbCommand, "@Multiple", _Multiple);
if (columnNames.ContainsCI("EquValue")) AddCommandParameter(dbCommand, "@EquValue", _EquValue);
if (columnNames.ContainsCI("UomIdEqu")) AddCommandParameter(dbCommand, "@UomIdEqu", _UomIdEqu);
if (columnNames.ContainsCI("EquAlgorythm")) AddCommandParameter(dbCommand, "@EquAlgorythm", _EquAlgorythm);
if (columnNames.ContainsCI("UomIdRef1")) AddCommandParameter(dbCommand, "@UomIdRef1", _UomIdRef1);
if (columnNames.ContainsCI("UomIdRef2")) AddCommandParameter(dbCommand, "@UomIdRef2", _UomIdRef2);
if (columnNames.ContainsCI("UomIdRef3")) AddCommandParameter(dbCommand, "@UomIdRef3", _UomIdRef3);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Category")) AddCommandParameter(dbCommand, "@Category", _Category);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("UnitType")) AddCommandParameter(dbCommand, "@UnitType", _UnitType);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Abbr")) AddCommandParameter(dbCommand, "@Abbr", _Abbr);
if (columnNames.ContainsCI("Single")) AddCommandParameter(dbCommand, "@Single", _Single);
if (columnNames.ContainsCI("Multiple")) AddCommandParameter(dbCommand, "@Multiple", _Multiple);
if (columnNames.ContainsCI("EquValue")) AddCommandParameter(dbCommand, "@EquValue", _EquValue);
if (columnNames.ContainsCI("UomIdEqu")) AddCommandParameter(dbCommand, "@UomIdEqu", _UomIdEqu);
if (columnNames.ContainsCI("EquAlgorythm")) AddCommandParameter(dbCommand, "@EquAlgorythm", _EquAlgorythm);
if (columnNames.ContainsCI("UomIdRef1")) AddCommandParameter(dbCommand, "@UomIdRef1", _UomIdRef1);
if (columnNames.ContainsCI("UomIdRef2")) AddCommandParameter(dbCommand, "@UomIdRef2", _UomIdRef2);
if (columnNames.ContainsCI("UomIdRef3")) AddCommandParameter(dbCommand, "@UomIdRef3", _UomIdRef3);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,28 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
class SaCurrency_Dbas : SaCurrency
{
//-------------------------------------------------------------------
// Construction.
public SaCurrency_Dbas (SysId id, ushort flags) : base(id)
{
Flags = flags;
}
//-------------------------------------------------------------------
// Associated data.
public override bool HasDependentCurrencies ()
{
throw new NotImplementedException(this.GetFn(".HasDependentCurrencies"));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,29 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
class SaLanguage_Dbas : SaLanguage
{
//-------------------------------------------------------------------
// Construction.
public SaLanguage_Dbas(SysId id, ushort flags) :
base(id)
{
Flags = flags;
}
//-------------------------------------------------------------------
// Associated data.
public override bool HasDependentLanguages ()
{
throw new NotImplementedException(this.GetFn(".HasDependentLanguages"));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,58 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
partial class SaReferenceDataConsole_Dbas
{
//*******************************************************************
// C u r r e n c i e s
//*******************************************************************
// Properties.
public override String TableName_Currency { get { return SaReferenceDataDbDfn.GetTableName(SaReferenceDataDbDfn.TableIdx.Currency, false); } }
public override bool DatabaseIsValid_Currency { get { return Database.TableExists(TableName_Currency); } }
// Retrieve Currency.
public override SaCurrency GetCurrency (SaCurrency.Params prmCurrency)
{
return referenceDataMgr.GetCurrency(prmCurrency);
}
// Currency list.
public override ColumnDfn GetCurrencyColumnDfn (SaCurrency.Column columnId, String caption = "", int width = 0)
{
return referenceDataMgr.GetCurrencyColumnDfn(columnId, caption, width);
}
public override List<String> GetCurrencyQueryFilter (SaCurrency.Params prm)
{
return referenceDataMgr.GetCurrencyQueryFilter(prm);
}
public override long GetCurrencyCount (SaCurrency.Params prmCurrency)
{
return referenceDataMgr.GetCurrencyCount(prmCurrency);
}
public override List<SaCurrency> GetCurrencyList (SaCurrency.Params prmCurrency)
{
return referenceDataMgr.GetCurrencyList(prmCurrency);
}
public override DbResultSet ExecuteCurrencyQuery (List<ColumnDfn> columns, SaCurrency.Params prm)
{
return referenceDataMgr.ExecuteCurrencyQuery(columns, prm);
}
public override DataValue GetCurrencyDataValue (ColumnDfn column, NamedValue.Map values)
{
return referenceDataMgr.GetCurrencyDataValue(column, values);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,58 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
partial class SaReferenceDataConsole_Dbas
{
//*******************************************************************
// L a n g u a g e s
//*******************************************************************
// Properties.
public override String TableName_Language { get { return SaReferenceDataDbDfn.GetTableName(SaReferenceDataDbDfn.TableIdx.Language, false); } }
public override bool DatabaseIsValid_Language { get { return Database.TableExists(TableName_Language); } }
// Retrieve Language.
public override SaLanguage GetLanguage (SaLanguage.Params prmLanguage)
{
return referenceDataMgr.GetLanguage(prmLanguage);
}
// Language list.
public override ColumnDfn GetLanguageColumnDfn (SaLanguage.Column columnId, String caption = "", int width = 0)
{
return referenceDataMgr.GetLanguageColumnDfn(columnId, caption, width);
}
public override List<String> GetLanguageQueryFilter (SaLanguage.Params prm)
{
return referenceDataMgr.GetLanguageQueryFilter(prm);
}
public override long GetLanguageCount (SaLanguage.Params prmLanguage)
{
return referenceDataMgr.GetLanguageCount(prmLanguage);
}
public override List<SaLanguage> GetLanguageList (SaLanguage.Params prmLanguage)
{
return referenceDataMgr.GetLanguageList(prmLanguage);
}
public override DbResultSet ExecuteLanguageQuery (List<ColumnDfn> columns, SaLanguage.Params prm)
{
return referenceDataMgr.ExecuteLanguageQuery(columns, prm);
}
public override DataValue GetLanguageDataValue (ColumnDfn column, NamedValue.Map values)
{
return referenceDataMgr.GetLanguageDataValue(column, values);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,58 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
partial class SaReferenceDataConsole_Dbas
{
//*******************************************************************
// R e g i o n s
//*******************************************************************
// Properties.
public override String TableName_Region { get { return SaReferenceDataDbDfn.GetTableName(SaReferenceDataDbDfn.TableIdx.Region, false); } }
public override bool DatabaseIsValid_Region { get { return Database.TableExists(TableName_Region); } }
// Retrieve Region.
public override SaRegion GetRegion (SaRegion.Params prmRegion)
{
return referenceDataMgr.GetRegion(prmRegion);
}
// Region list.
public override ColumnDfn GetRegionColumnDfn (SaRegion.Column columnId, String caption = "", int width = 0)
{
return referenceDataMgr.GetRegionColumnDfn(columnId, caption, width);
}
public override List<String> GetRegionQueryFilter (SaRegion.Params prm)
{
return referenceDataMgr.GetRegionQueryFilter(prm);
}
public override long GetRegionCount (SaRegion.Params prmRegion)
{
return referenceDataMgr.GetRegionCount(prmRegion);
}
public override List<SaRegion> GetRegionList (SaRegion.Params prmRegion)
{
return referenceDataMgr.GetRegionList(prmRegion);
}
public override DbResultSet ExecuteRegionQuery (List<ColumnDfn> columns, SaRegion.Params prm)
{
return referenceDataMgr.ExecuteRegionQuery(columns, prm);
}
public override DataValue GetRegionDataValue (ColumnDfn column, NamedValue.Map values)
{
return referenceDataMgr.GetRegionDataValue(column, values);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,58 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
partial class SaReferenceDataConsole_Dbas
{
//*******************************************************************
// T a x C o d e s
//*******************************************************************
// Properties.
public override String TableName_TaxCode { get { return SaReferenceDataDbDfn.GetTableName(SaReferenceDataDbDfn.TableIdx.TaxCode, false); } }
public override bool DatabaseIsValid_TaxCode { get { return Database.TableExists(TableName_TaxCode); } }
// Retrieve TaxCode.
public override SaTaxCode GetTaxCode (SaTaxCode.Params prmTaxCode)
{
return referenceDataMgr.GetTaxCode(prmTaxCode);
}
// TaxCode list.
public override ColumnDfn GetTaxCodeColumnDfn (SaTaxCode.Column columnId, String caption = "", int width = 0)
{
return referenceDataMgr.GetTaxCodeColumnDfn(columnId, caption, width);
}
public override List<String> GetTaxCodeQueryFilter (SaTaxCode.Params prm)
{
return referenceDataMgr.GetTaxCodeQueryFilter(prm);
}
public override long GetTaxCodeCount (SaTaxCode.Params prmTaxCode)
{
return referenceDataMgr.GetTaxCodeCount(prmTaxCode);
}
public override List<SaTaxCode> GetTaxCodeList (SaTaxCode.Params prmTaxCode)
{
return referenceDataMgr.GetTaxCodeList(prmTaxCode);
}
public override DbResultSet ExecuteTaxCodeQuery (List<ColumnDfn> columns, SaTaxCode.Params prm)
{
return referenceDataMgr.ExecuteTaxCodeQuery(columns, prm);
}
public override DataValue GetTaxCodeDataValue (ColumnDfn column, NamedValue.Map values)
{
return referenceDataMgr.GetTaxCodeDataValue(column, values);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,58 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
partial class SaReferenceDataConsole_Dbas
{
//*******************************************************************
// U n i t s M e a s u r e
//*******************************************************************
// Properties.
public override String TableName_UnitMeasure { get { return SaReferenceDataDbDfn.GetTableName(SaReferenceDataDbDfn.TableIdx.UnitMeasure, false); } }
public override bool DatabaseIsValid_UnitMeasure { get { return Database.TableExists(TableName_UnitMeasure); } }
// Retrieve Unit of Measure.
public override SaUnitMeasure GetUnitMeasure (SaUnitMeasure.Params prmUnitMeasure)
{
return referenceDataMgr.GetUnitMeasure(prmUnitMeasure);
}
// Unit of Measure list.
public override ColumnDfn GetUnitMeasureColumnDfn (SaUnitMeasure.Column columnId, String caption = "", int width = 0)
{
return referenceDataMgr.GetUnitMeasureColumnDfn(columnId, caption, width);
}
public override List<String> GetUnitMeasureQueryFilter (SaUnitMeasure.Params prm)
{
return referenceDataMgr.GetUnitMeasureQueryFilter(prm);
}
public override long GetUnitMeasureCount (SaUnitMeasure.Params prmUnitMeasure)
{
return referenceDataMgr.GetUnitMeasureCount(prmUnitMeasure);
}
public override List<SaUnitMeasure> GetUnitMeasureList (SaUnitMeasure.Params prmUnitMeasure)
{
return referenceDataMgr.GetUnitMeasureList(prmUnitMeasure);
}
public override DbResultSet ExecuteUnitMeasureQuery (List<ColumnDfn> columns, SaUnitMeasure.Params prm)
{
return referenceDataMgr.ExecuteUnitMeasureQuery(columns, prm);
}
public override DataValue GetUnitMeasureDataValue (ColumnDfn column, NamedValue.Map values)
{
return referenceDataMgr.GetUnitMeasureDataValue(column, values);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
public abstract partial class SaReferenceDataConsole_Dbas : SaReferenceDataConsole
{
//-------------------------------------------------------------------
// Definitions.
private SaReferenceDataMgr_Dbas referenceDataMgr = null;
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Static initialisation.
//-------------------------------------------------------------------
// Construction.
protected SaReferenceDataConsole_Dbas (SacsDatabase database) :
base()
{
Database = database;
referenceDataMgr = new SaReferenceDataMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Properties.
internal SacsDatabase Database { get; set; }
public override bool CanUpdateDatabase { get { return referenceDataMgr.CanUpdateDatabase; } }
//-------------------------------------------------------------------
// M a n a g e R e f e r e n c e D a t a
//-------------------------------------------------------------------
// Manage Reference Data - returns true if changes made.
public override bool ManageReferenceData (bool userCanManageReferenceData, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
MaintainReferenceDataFn?.Invoke(this, userCanManageReferenceData, dbUpdateInfo);
return false;
}
// Method to display ReferenceData management dialog.
protected delegate bool MaintainReferenceDataFunction (SaReferenceDataConsole codeTypeConsole, bool userCanManageReferenceData, DbUpdateInfo dbUpdateInfo);
protected abstract MaintainReferenceDataFunction MaintainReferenceDataFn { get; }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,120 @@
using System;
using System.IO;
using System.Reflection;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
public static class SaReferenceDataDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand ReferenceData Module database definition generator";
//private static String dbConnectionString = "Driver={SQL Server Native Client 11.0};Server=Sarand106\\SQL2014;Database=SaStockTracker_Solent_STN;Trusted_Connection=Yes;MARS_Connection=yes;";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate(String connectionString)
{
String fn = nameof(SaReferenceDataDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition(SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory,
};
// Schema - Tables.
config.Schema.Tables_Included.AddRange(new String[] { "Language", "Region", "Currency", "TaxCode", "UnitMeasure" });
config.Schema.Tables_Excluded.AddRange(new String[] { });
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("Language", "");
config.Schema.InsertOnlyColumns.Add("Region", "Type");
config.Schema.InsertOnlyColumns.Add("Currency", "");
config.Schema.InsertOnlyColumns.Add("TaxCode", "");
config.Schema.InsertOnlyColumns.Add("UnitMeasure", "");
// Database Definition class.
config.DefinitionClass.Usings.Clear();
config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Core");
config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Utils");
config.DefinitionClass.Usings.Add("Sarand.Net.Standard.Base.Dbas");
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.ReferenceData";
config.DefinitionClass.Classname = "SaReferenceDataDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.ReferenceData.Internal";
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder()
{
String fn = nameof(SaReferenceDataDbDfnGenerator) + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug(fn + " Assembly folder: " + directory);
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\ReferenceData\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "ReferenceData";
SaLogger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,13 @@
using Sarand.Net.Standard.Base.ReferenceData;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
internal static class SaReferenceDataInternal
{
internal static SaReferenceDataMgr CreateReferenceDataMgr (this SaReferenceDataConsole codeTypeConsole)
{
if (!(codeTypeConsole is SaReferenceDataConsole_Dbas)) return null;
return new SaReferenceDataMgr_Dbas((SaReferenceDataConsole_Dbas)codeTypeConsole);
}
}
}
@@ -0,0 +1,37 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
class SaRegion_Dbas : SaRegion
{
//-------------------------------------------------------------------
// Construction.
public SaRegion_Dbas (SysId id, SaRegionType regionType, ushort flags) :
base(id, regionType)
{
Flags = flags;
}
//-------------------------------------------------------------------
// Associated data.
public override bool HasDependentRegions ()
{
throw new NotImplementedException(this.GetFn(".HasDependentRegions"));
}
public override bool HasDependentCurrencies ()
{
throw new NotImplementedException(this.GetFn(".HasDependentCurrencies"));
}
public override bool HasDependentTaxCodes ()
{
throw new NotImplementedException(this.GetFn(".HasDependentTaxCodes"));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,29 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
class SaTaxCode_Dbas : SaTaxCode
{
//-------------------------------------------------------------------
// Construction.
public SaTaxCode_Dbas(SysId id, ushort flags) :
base(id)
{
Flags = flags;
}
//-------------------------------------------------------------------
// Associated data.
public override bool HasDependentTaxCodes ()
{
throw new NotImplementedException(this.GetFn(".HasDependentTaxCodes"));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,29 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Utils;
using System;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
class SaUnitMeasure_Dbas : SaUnitMeasure
{
//-------------------------------------------------------------------
// Construction.
public SaUnitMeasure_Dbas(SysId id, ushort flags) :
base(id)
{
Flags = flags;
}
//-------------------------------------------------------------------
// Associated data.
public override bool HasDependentUnitsOfMeasure ()
{
throw new NotImplementedException(this.GetFn(".HasDependentUnitsOfMeasure"));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,524 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Dbas.ReferenceData.Internal;
using Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Base.App;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
{
//*******************************************************************
// C u r r e n c i e s
//*******************************************************************
// Create Currency.
public override SaCurrency CreateCurrency ()
{
ClearErrorState();
return new SaCurrency_Dbas(null, 0);
}
private SaCurrency_Dbas CreateCurrency (Currency_Db dbCurrency)
{
ClearErrorState();
SaCurrency_Dbas currency = new SaCurrency_Dbas(new SysId(dbCurrency._Id), 0);
PopulateFrom(dbCurrency, currency);
return currency;
}
private SaCurrency CreateCurrency (DbDataReader dataReader)
{
Currency_Db dbCurrency = new Currency_Db(DbInfo);
dbCurrency.PopulateFrom(dataReader);
return CreateCurrency(dbCurrency);
}
//-------------------------------------------------------------------
// Currency exists.
public override bool CurrencyExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetCurrencyCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Id, aliasCurrency) + "=" + SysId.ToString(id)) == 1;
}
public override bool CurrencyExistsByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return false;
return GetCurrencyCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency) + "='" + DbQuery.FormatForCondition(code) + "'") == 1;
}
//-------------------------------------------------------------------
// Get Currency.
public override SaCurrency GetCurrency (SaCurrency.Params prm)
{
return GetCurrency(GetCurrencyQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaCurrency GetCurrency (String filter)
{
ClearErrorState();
long count = GetCurrencyCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple currencys found");
return null;
}
SaCurrency currency = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Currency_Db dbCurrency = new Currency_Db(DbInfo);
dbCurrency.PopulateFrom(dbCommand, aliasCurrency, filter);
currency = CreateCurrency(dbCurrency);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn(GetType().Name + ".GetCurrency\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return currency;
}
public override SaCurrency GetCurrencyById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetCurrency("Id=" + SysId.ToString(id));
}
public override SaCurrency GetCurrencyByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return null;
return GetCurrency("Code='" + DbQuery.FormatForCondition(code) + "'");
}
//-------------------------------------------------------------------
// Validate Currency.
public override bool IsValidCurrencyData (SaCurrency.Data data, SaCurrency.ErrField errField)
{
ClearErrorState();
if (!base.IsValidCurrencyData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Currency.
public override bool InsertCurrency (SaCurrency currency, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidCurrency(currency)) return false;
if (SysId.IsValid(currency.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Currency_Db dbCurrency = new Currency_Db(DbInfo);
PopulateTo(dbCurrency, currency, dbUpdateInfo);
if (Currency_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbCurrency._Id = SysId.ToInt(Database.GetNextId("Currency", dbUpdateInfo));
}
dbCurrency.ExecuteInsertCommand(dbCommand);
currency.Id = new SysId(dbCurrency._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Currency.
public override bool UpdateCurrency (SaCurrency currency, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidCurrency(currency)) return false;
if (!SysId.IsValid(currency.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve currency.
dbConnection.Open();
Currency_Db dbCurrency = new Currency_Db(DbInfo);
dbCurrency.PopulateFrom(dbCommand, aliasCurrency, "Id=" + SysId.ToString(currency.Id));
SaUpdateLogItemMonitor_Currency updateLogMonitor = new SaUpdateLogItemMonitor_Currency(ReferenceDataConsole, CreateCurrency(dbCurrency), dbUpdateInfo);
// Update properties.
PopulateTo(dbCurrency, currency, dbUpdateInfo);
dbCurrency.ExecuteUpdateCommand(dbCommand);
// Record updates.
updateLogMonitor.RecordUpdatedValues(currency);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Currency.
public override bool CurrencyCanBeDeleted (SaCurrency currency)
{
ClearErrorState();
if (!base.CurrencyCanBeDeleted(currency)) return false;
return true;
}
public override bool DeleteCurrency (SaCurrency currency, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!CurrencyCanBeDeleted(currency)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve currency.
dbConnection.Open();
Currency_Db dbCurrency = new Currency_Db(DbInfo);
dbCurrency.PopulateFrom(dbCommand, aliasCurrency, "Id=" + currency.Id.ToString());
// Delete currency.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + ReferenceDataConsole.TableName_Currency + " WHERE Id=" + SysId.ToString(currency.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (Currency_Db dbCurrency, SaCurrency currency, DbUpdateInfo dbUpdateInfo)
{
dbCurrency._Id = currency.Id.ToInt();
dbCurrency._Code = currency.Code;
dbCurrency._Name = currency.Name;
dbCurrency._Primary = SysId.ToInt(currency.CurrencyIdPrimary);
dbCurrency._Division = currency.Division;
dbCurrency._Region = SysId.ToInt(currency.RegionId);
dbCurrency._Symbol = currency.Symbol;
dbCurrency._Suffix = currency.SuffixSymbol;
dbCurrency._IncSpace = currency.IncludeSpace;
dbCurrency._Decimals = currency.Decimals;
// Common properties.
/*
dbCurrency._Notes = currency.Notes;
dbCurrency._Status = SacsSystem.GetStatusCode(currency.Status);
dbCurrency._Flags = (short)currency.Flags;
*/
if (!SysId.IsValid(currency.Id))
{
dbCurrency._CreateOn = DateTime.UtcNow;
dbCurrency._CreateBy = dbUpdateInfo.UserId.ToInt();
dbCurrency._CreateHost = dbUpdateInfo.Host;
}
dbCurrency._UpdateOn = DateTime.UtcNow;
dbCurrency._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbCurrency._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (Currency_Db dbCurrency, SaCurrency currency)
{
//currency.Id = new SysId(dbCurrency._Id);
currency.Code = dbCurrency._Code;
currency.Name = dbCurrency._Name;
currency.CurrencyIdPrimary = new SysId(dbCurrency._Primary);
currency.Division = dbCurrency._Division;
currency.RegionId = new SysId(dbCurrency._Region);
currency.Symbol = dbCurrency._Symbol;
currency.SuffixSymbol = dbCurrency._Suffix;
currency.IncludeSpace = dbCurrency._IncSpace;
currency.Decimals = dbCurrency._Decimals;
// Common properties.
/*
currency.Notes = dbCurrency._Notes;
currency.Status = SacsSystem.GetStatusForCode(dbCurrency._Status);
*/
currency.SetCreateStamp(dbCurrency._CreateOn, new SysId(dbCurrency._CreateBy), dbCurrency._CreateHost);
currency.SetUpdateStamp(dbCurrency._UpdateOn, new SysId(dbCurrency._UpdateBy), dbCurrency._UpdateHost);
currency.AcceptChanges();
}
//-------------------------------------------------------------------
// Currency column definitions.
private static readonly String aliasCurrency = "aCur";
private void SetCurrencyColDfn
(ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaReferenceDataDbDfn.GetTableForColumn(dbCol) == SaReferenceDataDbDfn.TableIdx.Currency)
alias = aliasCurrency;
col.Set(caption, width, (int)dbCol, prefix + SaReferenceDataDbDfn.GetColumnName(dbCol, false), SaReferenceDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
if (dataType == DataValue.DataType.String && dbCol != SaReferenceDataDbDfn.ColumnIdx.Unknown)
col.MaxLength = (int)SaReferenceDataDbDfn.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting currency column definition.
public override ColumnDfn GetCurrencyColumnDfn (SaCurrency.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SaCurrency.Column.Pos:
SetCurrencyColDfn(columnDfn, "Pos", 45, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaCurrency.Column.Id:
SetCurrencyColDfn(columnDfn, "Id", 60, SaReferenceDataDbDfn.ColumnIdx.Currency_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Currency Properties.
case SaCurrency.Column.Code:
SetCurrencyColDfn(columnDfn, "Code", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Code);
break;
case SaCurrency.Column.Name:
SetCurrencyColDfn(columnDfn, "Name", 100, SaReferenceDataDbDfn.ColumnIdx.Currency_Name);
break;
case SaCurrency.Column.PrimaryCurrencyId:
SetCurrencyColDfn(columnDfn, "Primary", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Primary, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.NumDecimals = 3;
break;
case SaCurrency.Column.Division:
SetCurrencyColDfn(columnDfn, "Division", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Division, ColumnAlignment.Center);
columnDfn.NumDecimals = 3;
break;
case SaCurrency.Column.RegionId:
SetCurrencyColDfn(columnDfn, "Region Id", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_Region, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.NumDecimals = 3;
break;
case SaCurrency.Column.Symbol:
SetCurrencyColDfn(columnDfn, "Symbol", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_Symbol, ColumnAlignment.Center);
columnDfn.NumDecimals = 3;
break;
case SaCurrency.Column.SuffixSymbol_Y:
SetCurrencyColDfn(columnDfn, "Suffix", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_Suffix, ColumnAlignment.Center);
columnDfn.NumDecimals = 3;
break;
case SaCurrency.Column.IncludeSpace_Y:
SetCurrencyColDfn(columnDfn, "Include Space", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_IncSpace, ColumnAlignment.Center);
columnDfn.NumDecimals = 3;
break;
case SaCurrency.Column.Decimals:
SetCurrencyColDfn(columnDfn, "Decimals", 70, SaReferenceDataDbDfn.ColumnIdx.Currency_Decimals, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.NumDecimals = 3;
break;
// Common properties.
case SaCurrency.Column.CreateOn_Date:
SetCurrencyColDfn(columnDfn, "Created", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaCurrency.Column.UpdateOn_Date:
SetCurrencyColDfn(columnDfn, "Updated", 80, SaReferenceDataDbDfn.ColumnIdx.Currency_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Currency query filter.
public override List<string> GetCurrencyQueryFilter (SaCurrency.Params prm)
{
List<String> filter = new List<String>();
// Currency Id.
String colCurrency_Id = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Id, aliasCurrency);
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(colCurrency_Id + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(colCurrency_Id + " NOT IN (" + excludedIds + ")");
// Code.
String colCurrency_Code = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency);
if (!StringUtil.IsEmpty(prm.Code))
filter.Add(colCurrency_Code + "='" + DbQuery.FormatForCondition(prm.Code) + "'");
if (!StringUtil.IsEmpty(prm.CodePartial))
filter.Add(colCurrency_Code + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'");
// Name.
String colCurrency_Name = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Name, aliasCurrency);
if (!StringUtil.IsEmpty(prm.Name))
filter.Add(colCurrency_Name + "='" + DbQuery.FormatForCondition(prm.Name) + "'");
if (!StringUtil.IsEmpty(prm.NamePartial))
filter.Add(colCurrency_Name + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%'");
// RegionId.
String colCurrency_Region = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Region, aliasCurrency);
if (SysId.IsValid(prm.RegionId))
filter.Add(colCurrency_Region + "=" + SysId.ToString(prm.RegionId));
// Status - no status on currency.
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Currency sort columns.
public List<String> GetCurrencySortColumns (SaCurrency.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for Currency columns in case of conflict.
String sortCol = String.Empty;
if (SaReferenceDataDbDfn.GetTableForColumn((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaReferenceDataDbDfn.TableIdx.Currency)
{
sortCol = SaReferenceDataDbDfn.GetColumnNameQual((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasCurrency);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Currency count.
private long GetCurrencyCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(ReferenceDataConsole.TableName_Currency + " As " + aliasCurrency, filter);
}
public override long GetCurrencyCount (SaCurrency.Params prm)
{
ClearErrorState();
return GetCurrencyCount(GetCurrencyQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Currency list.
public override List<SaCurrency> GetCurrencyList (SaCurrency.Params prm)
{
List<SaCurrency> currencies = new List<SaCurrency>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(ReferenceDataConsole.TableName_Currency, aliasCurrency);
// NB Can't use raw columns names as 'Primary' is a reserved word.
// So don't add any columns and set default to 'Select * From Currency'.
Currency_Db dbCurrency = new Currency_Db(DbInfo);
//qry.Columns.AddRange(dbCurrency.ExistingColumnNames);
qry.Filters.AddRange(GetCurrencyQueryFilter(prm));
qry.OrderBy.AddRange(GetCurrencySortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
currencies.Add(CreateCurrency(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetCurrencyList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return currencies;
}
//-------------------------------------------------------------------
// Currency query execution.
public override DbResultSet ExecuteCurrencyQuery (List<ColumnDfn> columns, SaCurrency.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(ReferenceDataConsole.TableName_Currency, aliasCurrency);
// Currency Properties - add columns as defined in query list.
if (columns.HasId(SaCurrency.Column.Id))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Id, aliasCurrency));
if (columns.HasId(SaCurrency.Column.Code))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency));
if (columns.HasId(SaCurrency.Column.Name))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Name, aliasCurrency));
if (columns.HasId(SaCurrency.Column.PrimaryCurrencyId))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnName(SaReferenceDataDbDfn.ColumnIdx.Currency_Primary), aliasCurrency);
if (columns.HasId(SaCurrency.Column.Division))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Division, aliasCurrency));
if (columns.HasId(SaCurrency.Column.RegionId))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Region, aliasCurrency));
if (columns.HasId(SaCurrency.Column.Symbol))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Symbol, aliasCurrency));
if (columns.HasId(SaCurrency.Column.SuffixSymbol_Y) || columns.HasId(SaCurrency.Column.SuffixSymbol_Tick))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Suffix, aliasCurrency));
if (columns.HasId(SaCurrency.Column.IncludeSpace_Y) || columns.HasId(SaCurrency.Column.IncludeSpace_Tick))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_IncSpace, aliasCurrency));
if (columns.HasId(SaCurrency.Column.Decimals))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Decimals, aliasCurrency));
// Common Properties.
/*
if (columns.HasId(SaCurrency.Column.Notes))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Notes, aliasCurrency));
if (columns.HasId(SaCurrency.Column.Status) || columns.HasId(SaCurrency.Column.Status_Desc) || columns.HasId(SaCurrency.Column.Status_Ind))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Status, aliasCurrency));
*/
if (columns.HasId(SaCurrency.Column.CreateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_CreateOn, aliasCurrency));
if (columns.HasId(SaCurrency.Column.UpdateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_UpdateOn, aliasCurrency));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetCurrencyQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetCurrencySortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery());
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,522 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.ReferenceData.Internal;
using Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
{
//*******************************************************************
// L a n g u a g e s
//*******************************************************************
// Create Language.
public override SaLanguage CreateLanguage ()
{
ClearErrorState();
return new SaLanguage_Dbas(null, 0);
}
private SaLanguage_Dbas CreateLanguage (Language_Db dbLanguage)
{
ClearErrorState();
SaLanguage_Dbas language = new SaLanguage_Dbas(new SysId(dbLanguage._Id), 0);
PopulateFrom(dbLanguage, language);
return language;
}
private SaLanguage CreateLanguage (DbDataReader dataReader)
{
Language_Db dbLanguage = new Language_Db(DbInfo);
dbLanguage.PopulateFrom(dataReader);
return CreateLanguage(dbLanguage);
}
//-------------------------------------------------------------------
// Language exists.
public override bool LanguageExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetLanguageCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage) + "=" + SysId.ToString(id)) == 1;
}
public override bool LanguageExistsByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return false;
return GetLanguageCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + "='" + DbQuery.FormatForCondition(code) + "'") == 1;
}
//-------------------------------------------------------------------
// Get Language.
public override SaLanguage GetLanguage (SaLanguage.Params prm)
{
return GetLanguage(GetLanguageQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaLanguage GetLanguage (String filter)
{
ClearErrorState();
long count = GetLanguageCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple languages found");
return null;
}
SaLanguage language = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Language_Db dbLanguage = new Language_Db(DbInfo);
dbLanguage.PopulateFrom(dbCommand, aliasLanguage, filter);
language = CreateLanguage(dbLanguage);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn(GetType().Name + ".GetLanguage\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return language;
}
public override SaLanguage GetLanguageById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetLanguage("Id=" + SysId.ToString(id));
}
public override SaLanguage GetLanguageByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return null;
return GetLanguage("Code='" + DbQuery.FormatForCondition(code) + "'");
}
//-------------------------------------------------------------------
// Validate Language.
public override bool IsValidLanguageData (SaLanguage.Data data, SaLanguage.ErrField errField)
{
ClearErrorState();
if (!base.IsValidLanguageData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Language.
public override bool InsertLanguage (SaLanguage language, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidLanguage(language)) return false;
if (SysId.IsValid(language.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Language_Db dbLanguage = new Language_Db(DbInfo);
PopulateTo(dbLanguage, language, dbUpdateInfo);
if (Language_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbLanguage._Id = SysId.ToInt(Database.GetNextId("Language", dbUpdateInfo));
}
dbLanguage.ExecuteInsertCommand(dbCommand);
language.Id = new SysId(dbLanguage._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Language.
public override bool UpdateLanguage (SaLanguage language, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidLanguage(language)) return false;
if (!SysId.IsValid(language.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve language.
dbConnection.Open();
Language_Db dbLanguage = new Language_Db(DbInfo);
dbLanguage.PopulateFrom(dbCommand, aliasLanguage, "Id=" + SysId.ToString(language.Id));
SaUpdateLogItemMonitor_Language updateLogMonitor = new SaUpdateLogItemMonitor_Language(ReferenceDataConsole, CreateLanguage(dbLanguage), dbUpdateInfo);
// Update properties.
PopulateTo(dbLanguage, language, dbUpdateInfo);
dbLanguage.ExecuteUpdateCommand(dbCommand);
// Record updates.
updateLogMonitor.RecordUpdatedValues(language);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Language.
public override bool LanguageCanBeDeleted (SaLanguage language)
{
ClearErrorState();
if (!base.LanguageCanBeDeleted(language)) return false;
return true;
}
public override bool DeleteLanguage (SaLanguage language, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!LanguageCanBeDeleted(language)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve language.
dbConnection.Open();
Language_Db dbLanguage = new Language_Db(DbInfo);
dbLanguage.PopulateFrom(dbCommand, aliasLanguage, "Id=" + language.Id.ToString());
// Delete language.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + ReferenceDataConsole.TableName_Language + " WHERE Id=" + SysId.ToString(language.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (Language_Db dbLanguage, SaLanguage language, DbUpdateInfo dbUpdateInfo)
{
dbLanguage._Id = language.Id.ToInt();
dbLanguage._Code = language.Code;
dbLanguage._Primary = SysId.ToInt(language.LanguageIdPrimary);
dbLanguage._Unicode = language.Unicode;
dbLanguage._Translation = language.Translation;
// Common properties.
/*
dbLanguage._Notes = language.Notes;
dbLanguage._Status = SacsSystem.GetStatusCode(language.Status);
dbLanguage._Flags = (short)language.Flags;
*/
if (!SysId.IsValid(language.Id))
{
dbLanguage._CreateOn = DateTime.UtcNow;
dbLanguage._CreateBy = dbUpdateInfo.UserId.ToInt();
dbLanguage._CreateHost = dbUpdateInfo.Host;
}
dbLanguage._UpdateOn = DateTime.UtcNow;
dbLanguage._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbLanguage._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (Language_Db dbLanguage, SaLanguage language)
{
//language.Id = new SysId(dbLanguage._Id);
//language.Code = dbLanguage._Code;
language.LanguageIdPrimary = new SysId(dbLanguage._Primary);
language.Unicode = dbLanguage._Unicode;
language.Translation = dbLanguage._Translation;
// Common properties.
/*
language.Notes = dbLanguage._Notes;
language.Status = SacsSystem.GetStatusForCode(dbLanguage._Status);
*/
language.SetCreateStamp(dbLanguage._CreateOn, new SysId(dbLanguage._CreateBy), dbLanguage._CreateHost);
language.SetUpdateStamp(dbLanguage._UpdateOn, new SysId(dbLanguage._UpdateBy), dbLanguage._UpdateHost);
language.AcceptChanges();
}
//-------------------------------------------------------------------
// Language column definitions.
private static readonly String aliasLanguage = "aLng";
private void SetLanguageColDfn
(ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaReferenceDataDbDfn.GetTableForColumn(dbCol) == SaReferenceDataDbDfn.TableIdx.Language)
alias = aliasLanguage;
col.Set(caption, width, (int)dbCol, prefix + SaReferenceDataDbDfn.GetColumnName(dbCol, false), SaReferenceDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
if (dataType == DataValue.DataType.String && dbCol != SaReferenceDataDbDfn.ColumnIdx.Unknown)
col.MaxLength = (int)SaReferenceDataDbDfn.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting language column definition.
public override ColumnDfn GetLanguageColumnDfn (SaLanguage.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SaLanguage.Column.Pos:
SetLanguageColDfn(columnDfn, "Pos", 45, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaLanguage.Column.Id:
SetLanguageColDfn(columnDfn, "Id", 60, SaReferenceDataDbDfn.ColumnIdx.Language_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Language Properties.
case SaLanguage.Column.Code:
SetLanguageColDfn(columnDfn, "Code", 100, SaReferenceDataDbDfn.ColumnIdx.Language_Code);
break;
case SaLanguage.Column.Name:
SetLanguageColDfn(columnDfn, "Name", 100, SaReferenceDataDbDfn.ColumnIdx.Language_Name);
break;
case SaLanguage.Column.LanguageIdPrimary:
SetLanguageColDfn(columnDfn, "Primary Id", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Primary, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaLanguage.Column.Unicode:
SetLanguageColDfn(columnDfn, "Unicode", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Unicode, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaLanguage.Column.Translation:
SetLanguageColDfn(columnDfn, "Translation", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Translation, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
// Derived properties.
/*
case SaLanguage.Column.MovementCount:
SetLanguageColDfn(columnDfn, "Movements", 80, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colLanguage_MovementCount;
columnDfn.ReadOnly = true;
break;
case SaLanguage.Column.PendingMovementCount:
SetLanguageColDfn(columnDfn, "Pending", 80, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colLanguage_MovementCount_Pending;
columnDfn.ReadOnly = true;
break;
case SaLanguage.Column.OnSite_Y:
SetLanguageColDfn(columnDfn, "On site", 70, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.String);
columnDfn.DataName = colLanguage_MovementCount_OnSite;
columnDfn.ReadOnly = true;
break;
case SaLanguage.Column.OnSite_Tick:
SetLanguageColDfn(columnDfn, "On site", 70, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Bool);
columnDfn.DataName = colLanguage_MovementCount_OnSite;
columnDfn.BoolFormat = ColumnBoolFormat.Tick;
columnDfn.ReadOnly = true;
break;
*/
// Common properties.
/*
case SaLanguage.Column.Notes:
SetLanguageColDfn(columnDfn, "Notes", 240, SaReferenceDataDbDfn.ColumnIdx.Language_Notes);
break;
case SaLanguage.Column.Status:
SetLanguageColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Status, ColumnAlignment.Center);
break;
case SaLanguage.Column.Status_Desc:
SetLanguageColDfn(columnDfn, "Status", 90, SaReferenceDataDbDfn.ColumnIdx.Language_Status, ColumnAlignment.Center);
break;
case SaLanguage.Column.Status_Ind:
SetLanguageColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.Language_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
*/
case SaLanguage.Column.CreateOn_Date:
SetLanguageColDfn(columnDfn, "Created", 80, SaReferenceDataDbDfn.ColumnIdx.Language_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaLanguage.Column.UpdateOn_Date:
SetLanguageColDfn(columnDfn, "Updated", 80, SaReferenceDataDbDfn.ColumnIdx.Language_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Language query filter.
public override List<string> GetLanguageQueryFilter (SaLanguage.Params prm)
{
List<String> filter = new List<String>();
// Language Id.
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage) + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage) + " NOT IN (" + excludedIds + ")");
// Code.
if (!StringUtil.IsEmpty(prm.Code))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + " = '" + DbQuery.FormatForCondition(prm.Code) + "'");
if (!StringUtil.IsEmpty(prm.CodePartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'");
// Name.
if (!StringUtil.IsEmpty(prm.Name))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage) + " = '" + DbQuery.FormatForCondition(prm.Name) + "'");
if (!StringUtil.IsEmpty(prm.NamePartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage) + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%'");
// Lang Primary Id.
if (SysId.IsValid(prm.LanguageIdPrimary))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Primary, aliasCurrency) + " = " + SysId.ToString(prm.LanguageIdPrimary,"0"));
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Language sort columns.
public List<String> GetLanguageSortColumns (SaLanguage.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for Language columns in case of conflict.
String sortCol = String.Empty;
if (SaReferenceDataDbDfn.GetTableForColumn((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaReferenceDataDbDfn.TableIdx.Language)
{
sortCol = SaReferenceDataDbDfn.GetColumnNameQual((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasLanguage);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Language count.
private long GetLanguageCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(ReferenceDataConsole.TableName_Language + " As " + aliasLanguage, filter);
}
public override long GetLanguageCount (SaLanguage.Params prm)
{
ClearErrorState();
return GetLanguageCount(GetLanguageQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Language list.
public override List<SaLanguage> GetLanguageList (SaLanguage.Params prm)
{
List<SaLanguage> languages = new List<SaLanguage>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(ReferenceDataConsole.TableName_Language, aliasLanguage);
Language_Db dbLanguage = new Language_Db(DbInfo);
qry.Columns.AddRange(dbLanguage.ExistingColumnNames);
qry.Filters.AddRange(GetLanguageQueryFilter(prm));
qry.OrderBy.AddRange(GetLanguageSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
languages.Add(CreateLanguage(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetLanguageList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return languages;
}
//-------------------------------------------------------------------
// Language query execution.
public override DbResultSet ExecuteLanguageQuery (List<ColumnDfn> columns, SaLanguage.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(ReferenceDataConsole.TableName_Language, aliasLanguage);
// Language Propertiees - add columns as defined in query list.
if (columns.HasId((int)SaLanguage.Column.Id))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage));
if (columns.HasId((int)SaLanguage.Column.Code))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage));
if (columns.HasId((int)SaLanguage.Column.Name))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage));
if (columns.HasId((int)SaLanguage.Column.LanguageIdPrimary))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Primary, aliasLanguage));
if (columns.HasId((int)SaLanguage.Column.Unicode))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Unicode, aliasLanguage));
if (columns.HasId((int)SaLanguage.Column.Translation))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Translation, aliasLanguage));
//Common Properties.
/*
if (columns.HasId((int)SaLanguage.Column.Notes))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Notes, aliasLanguage));
if (columns.HasId((int)SaLanguage.Column.Status) || columns.HasId((int)SaLanguage.Column.Status_Desc) || columns.HasId((int)SaLanguage.Column.Status_Ind))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Status, aliasLanguage));
*/
if (columns.HasId((int)SaLanguage.Column.CreateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_CreateOn, aliasLanguage));
if (columns.HasId((int)SaLanguage.Column.UpdateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_UpdateOn, aliasLanguage));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetLanguageQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetLanguageSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery());
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,495 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.ReferenceData.Internal;
using Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
{
//*******************************************************************
// R e g i o n s
//*******************************************************************
// Create Region.
public override SaRegion CreateRegion (SaRegionType regionType)
{
ClearErrorState();
return new SaRegion_Dbas(null, regionType, 0);
}
private SaRegion_Dbas CreateRegion (Region_Db dbRegion)
{
ClearErrorState();
SaRegion_Dbas region = new SaRegion_Dbas(new SysId(dbRegion._Id), (SaRegionType)regionTypes.GetTypeForCode(dbRegion._Type), (ushort)dbRegion._Flags);
PopulateFrom(dbRegion, region);
return region;
}
private SaRegion CreateRegion (DbDataReader dataReader)
{
Region_Db dbRegion = new Region_Db(DbInfo);
dbRegion.PopulateFrom(dataReader);
return CreateRegion(dbRegion);
}
//-------------------------------------------------------------------
// Region exists.
public override bool RegionExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetRegionCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Id, aliasRegion) + "=" + SysId.ToString(id)) == 1;
}
public override bool RegionExistsByType (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return false;
return GetRegionCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Type, aliasRegion) + "='" + DbQuery.FormatForCondition(code) + "'") == 1;
}
//-------------------------------------------------------------------
// Get Region.
public override SaRegion GetRegion (SaRegion.Params prm)
{
return GetRegion(GetRegionQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaRegion GetRegion (String filter)
{
ClearErrorState();
long count = GetRegionCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple regions found");
return null;
}
SaRegion region = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Region_Db dbRegion = new Region_Db(DbInfo);
dbRegion.PopulateFrom(dbCommand, aliasRegion, filter);
region = CreateRegion(dbRegion);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn(GetType().Name + ".GetRegion\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return region;
}
public override SaRegion GetRegionById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetRegion("Id=" + SysId.ToString(id));
}
public override SaRegion GetRegionByType (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return null;
return GetRegion("Code='" + DbQuery.FormatForCondition(code) + "'");
}
//-------------------------------------------------------------------
// Validate Region.
public override bool IsValidRegionData (SaRegion.Data data, SaRegion.ErrField errField)
{
ClearErrorState();
if (!base.IsValidRegionData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Region.
public override bool InsertRegion (SaRegion region, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidRegion(region)) return false;
if (SysId.IsValid(region.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
Region_Db dbRegion = new Region_Db(DbInfo);
PopulateTo(dbRegion, region, dbUpdateInfo);
if (Region_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbRegion._Id = SysId.ToInt(Database.GetNextId("Region", dbUpdateInfo));
}
dbRegion.ExecuteInsertCommand(dbCommand);
region.Id = new SysId(dbRegion._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Region.
public override bool UpdateRegion (SaRegion region, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidRegion(region)) return false;
if (!SysId.IsValid(region.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve region.
dbConnection.Open();
Region_Db dbRegion = new Region_Db(DbInfo);
dbRegion.PopulateFrom(dbCommand, aliasRegion, "Id=" + SysId.ToString(region.Id));
SaUpdateLogItemMonitor_Region updateLogMonitor = new SaUpdateLogItemMonitor_Region(ReferenceDataConsole, CreateRegion(dbRegion), dbUpdateInfo);
// Update properties.
PopulateTo(dbRegion, region, dbUpdateInfo);
dbRegion.ExecuteUpdateCommand(dbCommand);
// Record updates.
updateLogMonitor.RecordUpdatedValues(region);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Region.
public override bool RegionCanBeDeleted (SaRegion region)
{
ClearErrorState();
if (!base.RegionCanBeDeleted(region)) return false;
return true;
}
public override bool DeleteRegion (SaRegion region, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!RegionCanBeDeleted(region)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve region.
dbConnection.Open();
Region_Db dbRegion = new Region_Db(DbInfo);
dbRegion.PopulateFrom(dbCommand, aliasRegion, "Id=" + region.Id.ToString());
// Delete region.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + ReferenceDataConsole.TableName_Region + " WHERE Id=" + SysId.ToString(region.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (Region_Db dbRegion, SaRegion region, DbUpdateInfo dbUpdateInfo)
{
dbRegion._Id = region.Id.ToInt();
dbRegion._Type = regionTypes.GetCodeForType(region.RegionType);
dbRegion._Name = region.Name;
dbRegion._Parent = SysId.ToInt(region.RegionIdParent);
// Common properties.
dbRegion._Notes = region.Notes;
dbRegion._Status = SacsSystem.GetStatusCode(region.Status);
dbRegion._Flags = (short)region.Flags;
if (!SysId.IsValid(region.Id))
{
dbRegion._CreateOn = DateTime.UtcNow;
dbRegion._CreateBy = dbUpdateInfo.UserId.ToInt();
dbRegion._CreateHost = dbUpdateInfo.Host;
}
dbRegion._UpdateOn = DateTime.UtcNow;
dbRegion._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbRegion._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (Region_Db dbRegion, SaRegion region)
{
//region.Id = new SysId(dbRegion._Id);
//region.RegionType = (SaRegionType)regionTypes.GetTypeForCode(dbRegion._Type);
region.Name = dbRegion._Name;
region.RegionIdParent = new SysId(dbRegion._Parent);
// Common properties.
region.Notes = dbRegion._Notes;
region.Status = SacsSystem.GetStatusForCode(dbRegion._Status);
region.SetCreateStamp(dbRegion._CreateOn, new SysId(dbRegion._CreateBy), dbRegion._CreateHost);
region.SetUpdateStamp(dbRegion._UpdateOn, new SysId(dbRegion._UpdateBy), dbRegion._UpdateHost);
region.AcceptChanges();
}
//-------------------------------------------------------------------
// Region column definitions.
private static readonly String aliasRegion = "aReg";
private void SetRegionColDfn
(ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaReferenceDataDbDfn.GetTableForColumn(dbCol) == SaReferenceDataDbDfn.TableIdx.Region)
alias = aliasRegion;
col.Set(caption, width, (int)dbCol, prefix + SaReferenceDataDbDfn.GetColumnName(dbCol, false), SaReferenceDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
if (dataType == DataValue.DataType.String && dbCol != SaReferenceDataDbDfn.ColumnIdx.Unknown)
col.MaxLength = (int)SaReferenceDataDbDfn.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting region column definition.
public override ColumnDfn GetRegionColumnDfn (SaRegion.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SaRegion.Column.Pos:
SetRegionColDfn(columnDfn, "Pos", 45, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaRegion.Column.Id:
SetRegionColDfn(columnDfn, "Id", 60, SaReferenceDataDbDfn.ColumnIdx.Region_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Region Properties.
case SaRegion.Column.Type:
SetRegionColDfn(columnDfn, "Type", 100, SaReferenceDataDbDfn.ColumnIdx.Region_Type);
break;
case SaRegion.Column.Name:
SetRegionColDfn(columnDfn, "Name", 100, SaReferenceDataDbDfn.ColumnIdx.Region_Name);
break;
case SaRegion.Column.Parent:
SetRegionColDfn(columnDfn, "Parent Id", 80, SaReferenceDataDbDfn.ColumnIdx.Region_Parent, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
// Derived properties.
/*
case SaRegion.Column.MovementCount:
SetRegionColDfn(columnDfn, "Movements", 80, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colRegion_MovementCount;
columnDfn.ReadOnly = true;
break;
case SaRegion.Column.PendingMovementCount:
SetRegionColDfn(columnDfn, "Pending", 80, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colRegion_MovementCount_Pending;
columnDfn.ReadOnly = true;
break;
case SaRegion.Column.OnSite_Y:
SetRegionColDfn(columnDfn, "On site", 70, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.String);
columnDfn.DataName = colRegion_MovementCount_OnSite;
columnDfn.ReadOnly = true;
break;
case SaRegion.Column.OnSite_Tick:
SetRegionColDfn(columnDfn, "On site", 70, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Bool);
columnDfn.DataName = colRegion_MovementCount_OnSite;
columnDfn.BoolFormat = ColumnBoolFormat.Tick;
columnDfn.ReadOnly = true;
break;
*/
// Common properties.
case SaRegion.Column.Notes:
SetRegionColDfn(columnDfn, "Notes", 240, SaReferenceDataDbDfn.ColumnIdx.Region_Notes);
break;
case SaRegion.Column.Status:
SetRegionColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.Region_Status, ColumnAlignment.Center);
break;
case SaRegion.Column.Status_Desc:
SetRegionColDfn(columnDfn, "Status", 90, SaReferenceDataDbDfn.ColumnIdx.Region_Status, ColumnAlignment.Center);
break;
case SaRegion.Column.Status_Ind:
SetRegionColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.Region_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaRegion.Column.CreateOn_Date:
SetRegionColDfn(columnDfn, "Created", 80, SaReferenceDataDbDfn.ColumnIdx.Region_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaRegion.Column.UpdateOn_Date:
SetRegionColDfn(columnDfn, "Updated", 80, SaReferenceDataDbDfn.ColumnIdx.Region_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Region query filter.
public override List<string> GetRegionQueryFilter (SaRegion.Params prm)
{
List<String> filter = new List<String>();
// Region Id.
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Id, aliasRegion) + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Id, aliasRegion) + " NOT IN (" + excludedIds + ")");
// Type.
if ((int)prm.RegionType > 0)
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Type, aliasRegion) + "='" + regionTypes.GetCodeForType(prm.RegionType) + "'");
// Parent.
if (SysId.IsValid(prm.RegionIdParent))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Parent, aliasCurrency) + "=" + SysId.ToInt(prm.RegionIdParent));
// Status.
if (prm.StatusCat == SaRegion.StatusCat.ActiveOnly)
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Status, aliasRegion) + " In ('" + SacsSystem.GetStatusCode(SaStatus.Current) + "','" + SacsSystem.GetStatusCode(SaStatus.Active) + "')");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Region sort columns.
public List<String> GetRegionSortColumns (SaRegion.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for Region columns in case of conflict.
String sortCol = String.Empty;
if (SaReferenceDataDbDfn.GetTableForColumn((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaReferenceDataDbDfn.TableIdx.Region)
{
sortCol = SaReferenceDataDbDfn.GetColumnNameQual((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasRegion);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Type, aliasRegion) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Region count.
private long GetRegionCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(ReferenceDataConsole.TableName_Region + " As " + aliasRegion, filter);
}
public override long GetRegionCount (SaRegion.Params prm)
{
ClearErrorState();
return GetRegionCount(GetRegionQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Region list.
public override List<SaRegion> GetRegionList (SaRegion.Params prm)
{
List<SaRegion> regions = new List<SaRegion>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(ReferenceDataConsole.TableName_Region, aliasRegion);
Region_Db dbRegion = new Region_Db(DbInfo);
qry.Columns.AddRange(dbRegion.ExistingColumnNames);
qry.Filters.AddRange(GetRegionQueryFilter(prm));
qry.OrderBy.AddRange(GetRegionSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
regions.Add(CreateRegion(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetRegionList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return regions;
}
//-------------------------------------------------------------------
// Region query execution.
public override DbResultSet ExecuteRegionQuery (List<ColumnDfn> columns, SaRegion.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(ReferenceDataConsole.TableName_Region, aliasRegion);
// Region Properties - add columns as defined in query list.
if (columns.HasId((int)SaRegion.Column.Id))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Id, aliasRegion));
if (columns.HasId((int)SaRegion.Column.Type))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Type, aliasRegion));
if (columns.HasId((int)SaRegion.Column.Name))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Name, aliasRegion));
if (columns.HasId((int)SaRegion.Column.Parent))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Parent, aliasRegion));
// Common Properties
if (columns.HasId((int)SaRegion.Column.Notes))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Notes, aliasRegion));
if (columns.HasId((int)SaRegion.Column.Status) || columns.HasId((int)SaRegion.Column.Status_Desc) || columns.HasId((int)SaRegion.Column.Status_Ind))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Status, aliasRegion));
if (columns.HasId((int)SaRegion.Column.CreateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_CreateOn, aliasRegion));
if (columns.HasId((int)SaRegion.Column.UpdateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_UpdateOn, aliasRegion));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetRegionQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetRegionSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery());
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,550 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.ReferenceData.Internal;
using Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
{
//*******************************************************************
// T a x C o d e s
//*******************************************************************
// Create TaxCode.
public override SaTaxCode CreateTaxCode ()
{
ClearErrorState();
return new SaTaxCode_Dbas(null, 0);
}
private SaTaxCode_Dbas CreateTaxCode (TaxCode_Db dbTaxCode)
{
ClearErrorState();
SaTaxCode_Dbas taxCode = new SaTaxCode_Dbas(new SysId(dbTaxCode._Id), (ushort)dbTaxCode._Flags);
PopulateFrom(dbTaxCode, taxCode);
return taxCode;
}
private SaTaxCode CreateTaxCode (DbDataReader dataReader)
{
TaxCode_Db dbTaxCode = new TaxCode_Db(DbInfo);
dbTaxCode.PopulateFrom(dataReader);
return CreateTaxCode(dbTaxCode);
}
//-------------------------------------------------------------------
// TaxCode exists.
public override bool TaxCodeExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetTaxCodeCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Id, aliasTaxCode) + "=" + SysId.ToString(id)) == 1;
}
public override bool TaxCodeExistsByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return false;
return GetTaxCodeCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, aliasTaxCode) + "='" + DbQuery.FormatForCondition(code) + "'") == 1;
}
//-------------------------------------------------------------------
// Get TaxCode.
public override SaTaxCode GetTaxCode (SaTaxCode.Params prm)
{
return GetTaxCode(GetTaxCodeQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaTaxCode GetTaxCode (String filter)
{
ClearErrorState();
long count = GetTaxCodeCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple taxCodes found");
return null;
}
SaTaxCode taxCode = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
TaxCode_Db dbTaxCode = new TaxCode_Db(DbInfo);
dbTaxCode.PopulateFrom(dbCommand, aliasTaxCode, filter);
taxCode = CreateTaxCode(dbTaxCode);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn(GetType().Name + ".GetTaxCode\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return taxCode;
}
public override SaTaxCode GetTaxCodeById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetTaxCode("Id=" + SysId.ToString(id));
}
public override SaTaxCode GetTaxCodeByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return null;
return GetTaxCode("Code='" + DbQuery.FormatForCondition(code) + "'");
}
//-------------------------------------------------------------------
// Validate TaxCode.
public override bool IsValidTaxCodeData (SaTaxCode.Data data, SaTaxCode.ErrField errField)
{
ClearErrorState();
if (!base.IsValidTaxCodeData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert TaxCode.
public override bool InsertTaxCode (SaTaxCode taxCode, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidTaxCode(taxCode)) return false;
if (SysId.IsValid(taxCode.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
TaxCode_Db dbTaxCode = new TaxCode_Db(DbInfo);
PopulateTo(dbTaxCode, taxCode, dbUpdateInfo);
if (TaxCode_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbTaxCode._Id = SysId.ToInt(Database.GetNextId("TaxCode", dbUpdateInfo));
}
dbTaxCode.ExecuteInsertCommand(dbCommand);
taxCode.Id = new SysId(dbTaxCode._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update TaxCode.
public override bool UpdateTaxCode (SaTaxCode taxCode, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidTaxCode(taxCode)) return false;
if (!SysId.IsValid(taxCode.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve taxCode.
dbConnection.Open();
TaxCode_Db dbTaxCode = new TaxCode_Db(DbInfo);
dbTaxCode.PopulateFrom(dbCommand, aliasTaxCode, "Id=" + SysId.ToString(taxCode.Id));
SaUpdateLogItemMonitor_TaxCode updateLogMonitor = new SaUpdateLogItemMonitor_TaxCode(ReferenceDataConsole, CreateTaxCode(dbTaxCode), dbUpdateInfo);
// Update properties.
PopulateTo(dbTaxCode, taxCode, dbUpdateInfo);
dbTaxCode.ExecuteUpdateCommand(dbCommand);
// Record updates.
updateLogMonitor.RecordUpdatedValues(taxCode);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete TaxCode.
public override bool TaxCodeCanBeDeleted (SaTaxCode taxCode)
{
ClearErrorState();
if (!base.TaxCodeCanBeDeleted(taxCode)) return false;
return true;
}
public override bool DeleteTaxCode (SaTaxCode taxCode, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!TaxCodeCanBeDeleted(taxCode)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve taxCode.
dbConnection.Open();
TaxCode_Db dbTaxCode = new TaxCode_Db(DbInfo);
dbTaxCode.PopulateFrom(dbCommand, aliasTaxCode, "Id=" + taxCode.Id.ToString());
// Delete taxCode.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + ReferenceDataConsole.TableName_TaxCode + " WHERE Id=" + SysId.ToString(taxCode.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (TaxCode_Db dbTaxCode, SaTaxCode taxCode, DbUpdateInfo dbUpdateInfo)
{
dbTaxCode._Id = taxCode.Id.ToInt();
dbTaxCode._Code = taxCode.Code;
dbTaxCode._CodeAlt1 = taxCode.CodeAlt1;
dbTaxCode._CodeAlt2 = taxCode.CodeAlt2;
dbTaxCode._Description = taxCode.Description;
dbTaxCode._RegionId = SysId.ToInt(taxCode.RegionId);
dbTaxCode._EffectFrom = taxCode.EffectFrom;
dbTaxCode._EffectTo = taxCode.EffectTo;
dbTaxCode._TaxRate = (double)taxCode.TaxRate;
dbTaxCode._TaxRatePrev = (double)taxCode.TaxRatePrev;
dbTaxCode._TaxCodeIdLink = SysId.ToInt(taxCode.TaxCodeIdLink);
// Common properties.
dbTaxCode._Notes = taxCode.Notes;
dbTaxCode._Status = SacsSystem.GetStatusCode(taxCode.Status);
dbTaxCode._Flags = (short)taxCode.Flags;
if (!SysId.IsValid(taxCode.Id))
{
dbTaxCode._CreateOn = DateTime.UtcNow;
dbTaxCode._CreateBy = dbUpdateInfo.UserId.ToInt();
dbTaxCode._CreateHost = dbUpdateInfo.Host;
}
dbTaxCode._UpdateOn = DateTime.UtcNow;
dbTaxCode._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbTaxCode._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (TaxCode_Db dbTaxCode, SaTaxCode taxCode)
{
//taxCode.Id = new SysId(dbTaxCode._Id);
//taxCode.Code = dbTaxCode._Code;
taxCode.CodeAlt1 = dbTaxCode._CodeAlt1;
taxCode.CodeAlt2 = dbTaxCode._CodeAlt2;
taxCode.Description = dbTaxCode._Description;
taxCode.RegionId = new SysId(dbTaxCode._RegionId);
taxCode.EffectFrom = dbTaxCode._EffectFrom;
taxCode.EffectTo = dbTaxCode._EffectTo;
taxCode.TaxRate = (decimal)dbTaxCode._TaxRate;
taxCode.TaxRatePrev = (decimal)dbTaxCode._TaxRatePrev;
taxCode.TaxCodeIdLink = new SysId(dbTaxCode._TaxCodeIdLink);
// Common properties.
taxCode.Notes = dbTaxCode._Notes;
taxCode.Status = SacsSystem.GetStatusForCode(dbTaxCode._Status);
taxCode.SetCreateStamp(dbTaxCode._CreateOn, new SysId(dbTaxCode._CreateBy), dbTaxCode._CreateHost);
taxCode.SetUpdateStamp(dbTaxCode._UpdateOn, new SysId(dbTaxCode._UpdateBy), dbTaxCode._UpdateHost);
taxCode.AcceptChanges();
}
//-------------------------------------------------------------------
// TaxCode column definitions.
private static readonly String aliasTaxCode = "aTax";
private void SetTaxCodeColDfn
(ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaReferenceDataDbDfn.GetTableForColumn(dbCol) == SaReferenceDataDbDfn.TableIdx.TaxCode)
alias = aliasTaxCode;
col.Set(caption, width, (int)dbCol, prefix + SaReferenceDataDbDfn.GetColumnName(dbCol, false), SaReferenceDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
if (dataType == DataValue.DataType.String && dbCol != SaReferenceDataDbDfn.ColumnIdx.Unknown)
col.MaxLength = (int)SaReferenceDataDbDfn.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting taxcode column definition.
public override ColumnDfn GetTaxCodeColumnDfn (SaTaxCode.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SaTaxCode.Column.Pos:
SetTaxCodeColDfn(columnDfn, "Pos", 45, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaTaxCode.Column.Id:
SetTaxCodeColDfn(columnDfn, "Id", 60, SaReferenceDataDbDfn.ColumnIdx.TaxCode_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// TaxCode Properties.
case SaTaxCode.Column.Code:
SetTaxCodeColDfn(columnDfn, "Code", 100, SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code);
break;
case SaTaxCode.Column.CodeAlt1:
SetTaxCodeColDfn(columnDfn, "CodeAlt1", 100, SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt1);
break;
case SaTaxCode.Column.CodeAlt2:
SetTaxCodeColDfn(columnDfn, "CodeAlt2", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt2, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaTaxCode.Column.Description:
SetTaxCodeColDfn(columnDfn, "Description", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_Description, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaTaxCode.Column.RegionId:
SetTaxCodeColDfn(columnDfn, "RegionId", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_RegionId, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaTaxCode.Column.EffectFrom:
SetTaxCodeColDfn(columnDfn, "Effect From", 100, SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectFrom);
break;
case SaTaxCode.Column.EffectTo:
SetTaxCodeColDfn(columnDfn, "Effect To", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectTo, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaTaxCode.Column.TaxRate:
SetTaxCodeColDfn(columnDfn, "Tax Rate", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRate, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaTaxCode.Column.TaxRatePrev:
SetTaxCodeColDfn(columnDfn, "Tax Rate Prev", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRatePrev, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaTaxCode.Column.TaxCodeIdLink:
SetTaxCodeColDfn(columnDfn, "Tax Code Id Link", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxCodeIdLink, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
// Derived properties.
// Common properties.
case SaTaxCode.Column.Notes:
SetTaxCodeColDfn(columnDfn, "Notes", 240, SaReferenceDataDbDfn.ColumnIdx.TaxCode_Notes);
break;
case SaTaxCode.Column.Status:
SetTaxCodeColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_Status, ColumnAlignment.Center);
break;
case SaTaxCode.Column.Status_Desc:
SetTaxCodeColDfn(columnDfn, "Status", 90, SaReferenceDataDbDfn.ColumnIdx.TaxCode_Status, ColumnAlignment.Center);
break;
case SaTaxCode.Column.Status_Ind:
SetTaxCodeColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaTaxCode.Column.CreateOn_Date:
SetTaxCodeColDfn(columnDfn, "Created", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaTaxCode.Column.UpdateOn_Date:
SetTaxCodeColDfn(columnDfn, "Updated", 80, SaReferenceDataDbDfn.ColumnIdx.TaxCode_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// TaxCode query filter.
public override List<string> GetTaxCodeQueryFilter (SaTaxCode.Params prm)
{
List<String> filter = new List<String>();
// TaxCode Id.
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Id, aliasTaxCode) + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Id, aliasTaxCode) + " NOT IN (" + excludedIds + ")");
// Code.
if (!StringUtil.IsEmpty(prm.Code))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, aliasTaxCode) + "='" + DbQuery.FormatForCondition(prm.Code) + "'");
if (!StringUtil.IsEmpty(prm.CodePartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, aliasTaxCode) + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'");
// CodeAlt1.
if (!StringUtil.IsEmpty(prm.CodeAlt1))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt1, aliasTaxCode) + "='" + DbQuery.FormatForCondition(prm.CodeAlt1) + "'");
// CodeAlt2.
if (!StringUtil.IsEmpty(prm.CodeAlt2))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt2, aliasTaxCode) + "='" + DbQuery.FormatForCondition(prm.CodeAlt2) + "'");
// RegionId.
if (SysId.IsValid(prm.RegionId))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_RegionId, aliasTaxCode) + "=" + SysId.ToInt(prm.RegionId));
// EffectOn.
if (DateUtil.IsValid(prm.EffectOn))
{
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectFrom, aliasTaxCode) + ">" + DbQuery.FormatDateForCondition(prm.EffectOn));
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectTo, aliasTaxCode) + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.EffectOn,1)));
}
// Notes.
if (!StringUtil.IsEmpty(prm.NotesPartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Notes, aliasTaxCode) + " LIKE '%" + DbQuery.FormatForLike(prm.NotesPartial) + "%'");
// Status.
if (prm.StatusCat == SaTaxCode.StatusCat.ActiveOnly)
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Status, aliasTaxCode) + " In ('" + SacsSystem.GetStatusCode(SaStatus.Current) + "','" + SacsSystem.GetStatusCode(SaStatus.Active) + "')");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// TaxCode sort columns.
public List<String> GetTaxCodeSortColumns (SaTaxCode.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for TaxCode columns in case of conflict.
String sortCol = String.Empty;
if (SaReferenceDataDbDfn.GetTableForColumn((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaReferenceDataDbDfn.TableIdx.TaxCode)
{
sortCol = SaReferenceDataDbDfn.GetColumnNameQual((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasTaxCode);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, aliasTaxCode) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// TaxCode count.
private long GetTaxCodeCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(ReferenceDataConsole.TableName_TaxCode + " As " + aliasTaxCode, filter);
}
public override long GetTaxCodeCount (SaTaxCode.Params prm)
{
ClearErrorState();
return GetTaxCodeCount(GetTaxCodeQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// TaxCode list.
public override List<SaTaxCode> GetTaxCodeList (SaTaxCode.Params prm)
{
List<SaTaxCode> taxCodes = new List<SaTaxCode>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(ReferenceDataConsole.TableName_TaxCode, aliasTaxCode);
TaxCode_Db dbTaxCode = new TaxCode_Db(DbInfo);
qry.Columns.AddRange(dbTaxCode.ExistingColumnNames);
qry.Filters.AddRange(GetTaxCodeQueryFilter(prm));
qry.OrderBy.AddRange(GetTaxCodeSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
taxCodes.Add(CreateTaxCode(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetTaxCodeList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return taxCodes;
}
//-------------------------------------------------------------------
// TaxCode query execution.
public override DbResultSet ExecuteTaxCodeQuery (List<ColumnDfn> columns, SaTaxCode.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(ReferenceDataConsole.TableName_TaxCode, aliasTaxCode);
// TaxCode Properties - add columns as defined in query list.
if (columns.HasId((int)SaTaxCode.Column.Id))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Id, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.Code))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.CodeAlt1))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt1, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.CodeAlt2))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt2, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.Description))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Description, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.RegionId))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_RegionId, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.EffectFrom))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectFrom, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.EffectTo))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectTo, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.TaxRate))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRate, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.TaxRatePrev))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRatePrev, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.TaxCodeIdLink))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxCodeIdLink, aliasTaxCode));
// Common Properties.
if (columns.HasId((int)SaTaxCode.Column.Notes))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Notes, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.Status) || columns.HasId((int)SaTaxCode.Column.Status_Desc) || columns.HasId((int)SaTaxCode.Column.Status_Ind))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Status, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.CreateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CreateOn, aliasTaxCode));
if (columns.HasId((int)SaTaxCode.Column.UpdateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_UpdateOn, aliasTaxCode));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetTaxCodeQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetTaxCodeSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery());
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,563 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Dbas.ReferenceData.Internal;
using Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
{
//*******************************************************************
// U n i t s o f M e a s u r e
//*******************************************************************
// Create UnitMeasure.
public override SaUnitMeasure CreateUnitMeasure ()
{
ClearErrorState();
return new SaUnitMeasure_Dbas(null, 0);
}
private SaUnitMeasure_Dbas CreateUnitMeasure (UnitMeasure_Db dbUnitMeasure)
{
ClearErrorState();
SaUnitMeasure_Dbas unitMeasure = new SaUnitMeasure_Dbas(new SysId(dbUnitMeasure._Id), (ushort)dbUnitMeasure._Flags);
PopulateFrom(dbUnitMeasure, unitMeasure);
return unitMeasure;
}
private SaUnitMeasure CreateUnitMeasure (DbDataReader dataReader)
{
UnitMeasure_Db dbUnitMeasure = new UnitMeasure_Db(DbInfo);
dbUnitMeasure.PopulateFrom(dataReader);
return CreateUnitMeasure(dbUnitMeasure);
}
//-------------------------------------------------------------------
// UnitMeasure exists.
public override bool UnitMeasureExistsById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return false;
return GetUnitMeasureCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Id, aliasUnitMeasure) + "=" + SysId.ToString(id)) == 1;
}
public override bool UnitMeasureExistsByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return false;
return GetUnitMeasureCount(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, aliasUnitMeasure) + "='" + DbQuery.FormatForCondition(code) + "'") == 1;
}
//-------------------------------------------------------------------
// Get UnitMeasure.
public override SaUnitMeasure GetUnitMeasure (SaUnitMeasure.Params prm)
{
return GetUnitMeasure(GetUnitMeasureQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SaUnitMeasure GetUnitMeasure (String filter)
{
ClearErrorState();
long count = GetUnitMeasureCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple unitMeasures found");
return null;
}
SaUnitMeasure unitMeasure = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
UnitMeasure_Db dbUnitMeasure = new UnitMeasure_Db(DbInfo);
dbUnitMeasure.PopulateFrom(dbCommand, aliasUnitMeasure, filter);
unitMeasure = CreateUnitMeasure(dbUnitMeasure);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn(GetType().Name + ".GetUnitMeasure\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return unitMeasure;
}
public override SaUnitMeasure GetUnitMeasureById (SysId id)
{
ClearErrorState();
if (!SysId.IsValid(id)) return null;
return GetUnitMeasure("Id=" + SysId.ToString(id));
}
public override SaUnitMeasure GetUnitMeasureByCode (string code)
{
ClearErrorState();
if (StringUtil.IsEmpty(code)) return null;
return GetUnitMeasure("Code='" + DbQuery.FormatForCondition(code) + "'");
}
//-------------------------------------------------------------------
// Validate UnitMeasure.
public override bool IsValidUnitMeasureData (SaUnitMeasure.Data data, SaUnitMeasure.ErrField errField)
{
ClearErrorState();
if (!base.IsValidUnitMeasureData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert UnitMeasure.
public override bool InsertUnitMeasure (SaUnitMeasure unitMeasure, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidUnitMeasure(unitMeasure)) return false;
if (SysId.IsValid(unitMeasure.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
UnitMeasure_Db dbUnitMeasure = new UnitMeasure_Db(DbInfo);
PopulateTo(dbUnitMeasure, unitMeasure, dbUpdateInfo);
if (UnitMeasure_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbUnitMeasure._Id = SysId.ToInt(Database.GetNextId("UnitMeasure", dbUpdateInfo));
}
dbUnitMeasure.ExecuteInsertCommand(dbCommand);
unitMeasure.Id = new SysId(dbUnitMeasure._Id);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update UnitMeasure.
public override bool UpdateUnitMeasure (SaUnitMeasure unitMeasure, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidUnitMeasure(unitMeasure)) return false;
if (!SysId.IsValid(unitMeasure.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve unitMeasure.
dbConnection.Open();
UnitMeasure_Db dbUnitMeasure = new UnitMeasure_Db(DbInfo);
dbUnitMeasure.PopulateFrom(dbCommand, aliasUnitMeasure, "Id=" + SysId.ToString(unitMeasure.Id));
SaUpdateLogItemMonitor_UnitMeasure updateLogMonitor = new SaUpdateLogItemMonitor_UnitMeasure(ReferenceDataConsole, CreateUnitMeasure(dbUnitMeasure), dbUpdateInfo);
// Update properties.
PopulateTo(dbUnitMeasure, unitMeasure, dbUpdateInfo);
dbUnitMeasure.ExecuteUpdateCommand(dbCommand);
// Record updates.
updateLogMonitor.RecordUpdatedValues(unitMeasure);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete UnitMeasure.
public override bool UnitMeasureCanBeDeleted (SaUnitMeasure unitMeasure)
{
ClearErrorState();
if (!base.UnitMeasureCanBeDeleted(unitMeasure)) return false;
return true;
}
public override bool DeleteUnitMeasure (SaUnitMeasure unitMeasure, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!UnitMeasureCanBeDeleted(unitMeasure)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve unitMeasure.
dbConnection.Open();
UnitMeasure_Db dbUnitMeasure = new UnitMeasure_Db(DbInfo);
dbUnitMeasure.PopulateFrom(dbCommand, aliasUnitMeasure, "Id=" + unitMeasure.Id.ToString());
// Delete unitMeasure.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + ReferenceDataConsole.TableName_UnitMeasure + " WHERE Id=" + SysId.ToString(unitMeasure.Id) + ";";
dbCommand.ExecuteNonQuery();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo (UnitMeasure_Db dbUnitMeasure, SaUnitMeasure unitMeasure, DbUpdateInfo dbUpdateInfo)
{
dbUnitMeasure._Id = unitMeasure.Id.ToInt();
dbUnitMeasure._Category = (short)unitMeasure.Category;
dbUnitMeasure._UnitType = (short)unitMeasure.UnitType;
dbUnitMeasure._Code = unitMeasure.Code;
dbUnitMeasure._Abbr = unitMeasure.Abbr;
dbUnitMeasure._Single = unitMeasure.Single;
dbUnitMeasure._Multiple = unitMeasure.Multiple;
dbUnitMeasure._EquValue = (double)unitMeasure.EquivalencyValue;
dbUnitMeasure._UomIdEqu = unitMeasure.UomIdEquivalency;
dbUnitMeasure._EquAlgorythm = unitMeasure.EquivalencyAlgorythm;
dbUnitMeasure._UomIdRef1 = unitMeasure.UomIdRef1;
dbUnitMeasure._UomIdRef2 = unitMeasure.UomIdRef2;
dbUnitMeasure._UomIdRef3 = unitMeasure.UomIdRef3;
// Common properties.
dbUnitMeasure._Notes = unitMeasure.Notes;
dbUnitMeasure._Status = SacsSystem.GetStatusCode(unitMeasure.Status);
dbUnitMeasure._Flags = (short)unitMeasure.Flags;
if (!SysId.IsValid(unitMeasure.Id))
{
dbUnitMeasure._CreateOn = DateTime.UtcNow;
dbUnitMeasure._CreateBy = dbUpdateInfo.UserId.ToInt();
dbUnitMeasure._CreateHost = dbUpdateInfo.Host;
}
dbUnitMeasure._UpdateOn = DateTime.UtcNow;
dbUnitMeasure._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbUnitMeasure._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom (UnitMeasure_Db dbUnitMeasure, SaUnitMeasure unitMeasure)
{
//unitMeasure.Id = new SysId(dbUnitMeasure._Id);
unitMeasure.Category = (SaUomCategory)dbUnitMeasure._Category;
if ((int)unitMeasure.Category < 1)
unitMeasure.Category = (SaUomCategory)dbUnitMeasure._Type;
unitMeasure.UnitType = (SaUomType)dbUnitMeasure._UnitType;
//unitMeasure.Code = dbUnitMeasure._Code;
unitMeasure.Abbr = dbUnitMeasure._Abbr;
unitMeasure.Single = dbUnitMeasure._Single;
unitMeasure.Multiple = dbUnitMeasure._Multiple;
unitMeasure.EquivalencyValue = (decimal)dbUnitMeasure._EquValue;
unitMeasure.UomIdEquivalency = dbUnitMeasure._UomIdEqu;
unitMeasure.EquivalencyAlgorythm = dbUnitMeasure._EquAlgorythm;
unitMeasure.UomIdRef1 = dbUnitMeasure._UomIdRef1;
unitMeasure.UomIdRef2 = dbUnitMeasure._UomIdRef2;
unitMeasure.UomIdRef3 = dbUnitMeasure._UomIdRef3;
// Common properties.
unitMeasure.Notes = dbUnitMeasure._Notes;
unitMeasure.Status = SacsSystem.GetStatusForCode(dbUnitMeasure._Status);
unitMeasure.SetCreateStamp(dbUnitMeasure._CreateOn, new SysId(dbUnitMeasure._CreateBy), dbUnitMeasure._CreateHost);
unitMeasure.SetUpdateStamp(dbUnitMeasure._UpdateOn, new SysId(dbUnitMeasure._UpdateBy), dbUnitMeasure._UpdateHost);
unitMeasure.AcceptChanges();
}
//-------------------------------------------------------------------
// UnitMeasure column definitions.
private static readonly String aliasUnitMeasure = "aUom";
private void SetUnitMeasureColDfn
(ColumnDfn col, String caption, int width, SaReferenceDataDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaReferenceDataDbDfn.GetTableForColumn(dbCol) == SaReferenceDataDbDfn.TableIdx.UnitMeasure)
alias = aliasUnitMeasure;
col.Set(caption, width, (int)dbCol, prefix + SaReferenceDataDbDfn.GetColumnName(dbCol, false), SaReferenceDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
if (dataType == DataValue.DataType.String && dbCol != SaReferenceDataDbDfn.ColumnIdx.Unknown)
col.MaxLength = (int)SaReferenceDataDbDfn.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting uom column definition.
public override ColumnDfn GetUnitMeasureColumnDfn (SaUnitMeasure.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SaUnitMeasure.Column.Pos:
SetUnitMeasureColDfn(columnDfn, "Pos", 45, SaReferenceDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SaUnitMeasure.Column.Id:
SetUnitMeasureColDfn(columnDfn, "Id", 60, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// UnitMeasure Properties.
case SaUnitMeasure.Column.Category:
SetUnitMeasureColDfn(columnDfn, "Uom Category", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Category);
break;
case SaUnitMeasure.Column.UnitType:
SetUnitMeasureColDfn(columnDfn, "Uom Type", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UnitType);
break;
case SaUnitMeasure.Column.Code:
SetUnitMeasureColDfn(columnDfn, "Code", 100, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code);
break;
case SaUnitMeasure.Column.Abbr:
SetUnitMeasureColDfn(columnDfn, "Abbr", 100, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Abbr);
break;
case SaUnitMeasure.Column.Single:
SetUnitMeasureColDfn(columnDfn, "Single", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Single, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaUnitMeasure.Column.Multiple:
SetUnitMeasureColDfn(columnDfn, "Multiple", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Multiple, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaUnitMeasure.Column.EquivalencyValue:
SetUnitMeasureColDfn(columnDfn, "Equal Value", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquValue, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaUnitMeasure.Column.UomIdEquivalency:
SetUnitMeasureColDfn(columnDfn, "Uom Id Equal", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdEqu, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaUnitMeasure.Column.EquivalencyAlgorythm:
SetUnitMeasureColDfn(columnDfn, "Equal Algorythm", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquAlgorythm, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaUnitMeasure.Column.UomIdRef1:
SetUnitMeasureColDfn(columnDfn, "Uom Id Ref1", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef1, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaUnitMeasure.Column.UomIdRef2:
SetUnitMeasureColDfn(columnDfn, "Uom Id Ref2", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef2, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
case SaUnitMeasure.Column.UomIdRef3:
SetUnitMeasureColDfn(columnDfn, "Uom Id Ref3", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef3, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 3;
break;
// Derived properties.
// Common properties.
case SaUnitMeasure.Column.Notes:
SetUnitMeasureColDfn(columnDfn, "Notes", 240, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Notes);
break;
case SaUnitMeasure.Column.Status:
SetUnitMeasureColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Status, ColumnAlignment.Center);
break;
case SaUnitMeasure.Column.Status_Desc:
SetUnitMeasureColDfn(columnDfn, "Status", 90, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Status, ColumnAlignment.Center);
break;
case SaUnitMeasure.Column.Status_Ind:
SetUnitMeasureColDfn(columnDfn, "Status", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SaUnitMeasure.Column.CreateOn_Date:
SetUnitMeasureColDfn(columnDfn, "Created", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaUnitMeasure.Column.UpdateOn_Date:
SetUnitMeasureColDfn(columnDfn, "Updated", 80, SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// UnitMeasure query filter.
public override List<string> GetUnitMeasureQueryFilter (SaUnitMeasure.Params prm)
{
List<String> filter = new List<String>();
// UnitMeasure Id.
String includedIds = prm.IncludedIds.Concat(",");
if (!includedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Id, aliasUnitMeasure) + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Id, aliasUnitMeasure) + " NOT IN (" + excludedIds + ")");
// Category.
/*
if (!StringUtil.IsEmpty(prm.Category))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Category, aliasUnitMeasure) + " = '" + DbQuery.FormatForCondition(prm.Category) + "'");
if (!StringUtil.IsEmpty(prm.CategoryPartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Category, aliasUnitMeasure) + " LIKE '%" + DbQuery.FormatForLike(prm.CategoryPartial) + "%'");
// UnitType.
if (!StringUtil.IsEmpty(prm.UnitType))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UnitType, aliasUnitMeasure) + " = '" + DbQuery.FormatForCondition(prm.UnitType) + "'");
if (!StringUtil.IsEmpty(prm.UnitTypePartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UnitType, aliasUnitMeasure) + " LIKE '%" + DbQuery.FormatForLike(prm.UnitTypePartial) + "%'");
*/
// Code.
if (!StringUtil.IsEmpty(prm.Code))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, aliasUnitMeasure) + " = '" + DbQuery.FormatForCondition(prm.Code) + "'");
if (!StringUtil.IsEmpty(prm.CodePartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, aliasUnitMeasure) + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'");
// Notes.
/*
if (!StringUtil.IsEmpty(prm.NotesPartial))
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Notes, aliasUnitMeasure) + " LIKE '%" + DbQuery.FormatForLike(prm.NotesPartial) + "%'");
// Status.
if (prm.StatusCat == SaUnitMeasure.StatusCat.ActiveOnly)
filter.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Status, aliasUnitMeasure) + " = '" + SacsSystem.GetStatusCode(SaStatus.Active) + "'");
*/
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// UnitMeasure sort columns.
public List<String> GetUnitMeasureSortColumns (SaUnitMeasure.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for UnitMeasure columns in case of conflict.
String sortCol = String.Empty;
if (SaReferenceDataDbDfn.GetTableForColumn((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaReferenceDataDbDfn.TableIdx.UnitMeasure)
{
sortCol = SaReferenceDataDbDfn.GetColumnNameQual((SaReferenceDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasUnitMeasure);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns:
sortColumnNames.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, aliasUnitMeasure) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// UnitMeasure count.
private long GetUnitMeasureCount (String filter)
{
ClearErrorState();
return Database.GetRowCount(ReferenceDataConsole.TableName_UnitMeasure + " As " + aliasUnitMeasure, filter);
}
public override long GetUnitMeasureCount (SaUnitMeasure.Params prm)
{
ClearErrorState();
return GetUnitMeasureCount(GetUnitMeasureQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// UnitMeasure list.
public override List<SaUnitMeasure> GetUnitMeasureList (SaUnitMeasure.Params prm)
{
List<SaUnitMeasure> unitMeasures = new List<SaUnitMeasure>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(ReferenceDataConsole.TableName_UnitMeasure, aliasUnitMeasure);
UnitMeasure_Db dbUnitMeasure = new UnitMeasure_Db(DbInfo);
qry.Columns.AddRange(dbUnitMeasure.ExistingColumnNames);
qry.Filters.AddRange(GetUnitMeasureQueryFilter(prm));
qry.OrderBy.AddRange(GetUnitMeasureSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
unitMeasures.Add(CreateUnitMeasure(dbDataReader));
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetUnitMeasureList\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
}
}
return unitMeasures;
}
//-------------------------------------------------------------------
// UnitMeasure query execution.
public override DbResultSet ExecuteUnitMeasureQuery (List<ColumnDfn> columns, SaUnitMeasure.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(ReferenceDataConsole.TableName_UnitMeasure, aliasUnitMeasure);
// UnitMeasure Properties - add columns as defined in query list.
if (columns.HasId((int)SaUnitMeasure.Column.Id))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Id, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.Category))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Category, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.UnitType))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UnitType, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.Code))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.Abbr))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Abbr, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.Single))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Single, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.Multiple))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Multiple, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.EquivalencyValue))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquValue, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.UomIdEquivalency))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdEqu, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.EquivalencyAlgorythm))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquAlgorythm, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.UomIdRef1))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef1, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.UomIdRef2))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef2, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.UomIdRef3))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef3, aliasUnitMeasure));
// Common Properties.
if (columns.HasId((int)SaUnitMeasure.Column.Notes))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Notes, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.Status) || columns.HasId((int)SaUnitMeasure.Column.Status_Desc) || columns.HasId((int)SaUnitMeasure.Column.Status_Ind))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Status, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.CreateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_CreateOn, aliasUnitMeasure));
if (columns.HasId((int)SaUnitMeasure.Column.UpdateOn_Date))
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UpdateOn, aliasUnitMeasure));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetUnitMeasureQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetUnitMeasureSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery());
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,45 @@
using Sarand.Net.Standard.Dbas.Base;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
namespace Sarand.Net.Standard.Dbas.ReferenceData
{
//=======================================================================
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
{
//-------------------------------------------------------------------
// Data members.
private List<TypeCodeDesc> regionTypes;
private List<TypeCodeDesc> uomCategories;
private List<TypeCodeDesc> uomUnitTypes;
//-------------------------------------------------------------------
// Construction.
public SaReferenceDataMgr_Dbas (SaReferenceDataConsole_Dbas referenceDataConsole) :
base()
{
ReferenceDataConsole = referenceDataConsole;
DbInfo = new DbDataItem.DatabaseInfo(referenceDataConsole.Database);
regionTypes = SaReferenceDataConsole.GetReferenceDataCodes(ReferenceDataSystemCode.RegionType);
uomCategories = SaReferenceDataConsole.GetReferenceDataCodes(ReferenceDataSystemCode.UnitMeasureCategory);
uomUnitTypes = SaReferenceDataConsole.GetReferenceDataCodes(ReferenceDataSystemCode.UnitMeasureType);
}
//-------------------------------------------------------------------
// Properties.
internal SaReferenceDataConsole_Dbas ReferenceDataConsole { get; }
internal SacsDatabase Database { get { return ReferenceDataConsole.Database; } }
private DbDataItem.DatabaseInfo DbInfo { get; }
public override bool DatabaseIsValid_Language { get { return (Database != null && (Database.GetTableNames().Contains(ReferenceDataConsole.TableName_Language))); } }
public override bool DatabaseIsValid_Region { get { return (Database != null && (Database.GetTableNames().Contains(ReferenceDataConsole.TableName_Region))); } }
public override bool DatabaseIsValid_Currency { get { return (Database != null && (Database.GetTableNames().Contains(ReferenceDataConsole.TableName_Currency))); } }
public override bool DatabaseIsValid_TaxCode { get { return (Database != null && (Database.GetTableNames().Contains(ReferenceDataConsole.TableName_TaxCode))); } }
public override bool DatabaseIsValid_UnitMeasure { get { return (Database != null && (Database.GetTableNames().Contains(ReferenceDataConsole.TableName_UnitMeasure))); } }
public override bool CanUpdateDatabase { get { return (DatabaseIsValid_Language || DatabaseIsValid_Region || DatabaseIsValid_Currency || DatabaseIsValid_TaxCode || DatabaseIsValid_UnitMeasure); } }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,65 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
namespace Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog
{
//=======================================================================
public class SaUpdateLogItemMonitor_Currency : SaUpdateLogItemMonitor_ReferenceData
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SaUpdateLogItemMonitor_ReferenceData.Config
{
public Config(SaReferenceDataConsole referenceDataConsole, SysId itemId, DbUpdateInfo dbUpdateInfo) :
base(referenceDataConsole.UpdateLogConsole, dbUpdateInfo)
{
ItemType = referenceDataConsole.CurrencyItemType;
ItemId = itemId;
}
}
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public SaUpdateLogItemMonitor_Currency(SaReferenceDataConsole referenceDataConsole, SaCurrency currency, DbUpdateInfo dbUpdateInfo) :
base(new Config(referenceDataConsole, currency.Id, dbUpdateInfo))
{
RecordAttrValues(currency, false);
}
//-------------------------------------------------------------------
// Record attribute values.
public bool RecordUpdatedValues (SaCurrency currency)
{
return RecordAttrValues(currency, true);
}
private bool RecordAttrValues(SaCurrency currency, bool newValues)
{
ClearErrorState();
// Record values that may require logging.
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, currency.Code, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Name, currency.Name, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Primary, SysId.ToInt(currency.CurrencyIdPrimary), newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Division, currency.Division, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Region, SysId.ToInt(currency.RegionId), newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Symbol, currency.Symbol, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Suffix, currency.SuffixSymbol ? 1 : 0, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_IncSpace, currency.IncludeSpace ? 1 : 0, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Decimals, currency.Decimals, newValues);
// Common properties.
/*
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Notes, currency.Notes, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Currency_Status, SacsSystem.GetStatusCode(currency.Status), newValues);
*/
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,61 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
namespace Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog
{
//=======================================================================
public class SaUpdateLogItemMonitor_Language : SaUpdateLogItemMonitor_ReferenceData
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SaUpdateLogItemMonitor_ReferenceData.Config
{
public Config (SaReferenceDataConsole referenceDataConsole, SysId itemId, DbUpdateInfo dbUpdateInfo) :
base(referenceDataConsole.UpdateLogConsole, dbUpdateInfo)
{
ItemType = referenceDataConsole.LanguageItemType;
ItemId = itemId;
}
}
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public SaUpdateLogItemMonitor_Language(SaReferenceDataConsole referenceDataConsole, SaLanguage language, DbUpdateInfo dbUpdateInfo) :
base(new Config(referenceDataConsole, language.Id, dbUpdateInfo))
{
RecordAttrValues(language, false);
}
//-------------------------------------------------------------------
// Record attribute values.
public bool RecordUpdatedValues(SaLanguage language)
{
return RecordAttrValues(language, true);
}
private bool RecordAttrValues(SaLanguage language, bool newValues)
{
ClearErrorState();
// Language Properties - record values that may require logging.
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Language_Code, language.Code, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Language_Name, language.Name, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Language_Primary, SysId.ToInt(language.LanguageIdPrimary), newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Language_Unicode, language.Unicode ? 1 : 0, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Language_Translation, language.Translation ? 1 : 0, newValues);
// Common properties.
/*
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Language_Notes, language.Notes, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Language_Status, SacsSystem.GetStatusCode(language.Status), newValues);
*/
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,72 @@
using System;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog
{
//=======================================================================
public class SaUpdateLogItemMonitor_ReferenceData : SaUpdateLogItemMonitor
{
// ------------------------ Configuration. --------------------------
public new class Config : SaUpdateLogItemMonitor.Config
{
public Config(SaUpdateLogConsole updateLogConsole, DbUpdateInfo dbUpdateInfo) :
base(updateLogConsole, dbUpdateInfo)
{
}
}
//-------------------------------------------------------------------
// ------------------------- Data members. --------------------------
private Config config = null;
//-------------------------------------------------------------------
// -------------------------- Construction. -------------------------
protected SaUpdateLogItemMonitor_ReferenceData (Config config) : base(config)
{
this.config = config;
}
//-------------------------------------------------------------------
// ------------------------- Internal utilities. --------------------
// ToDo SaUpdateLogItemMonitor Require SaReferenceDataDbDfn
protected virtual bool IsColumnChangeLogged(SaReferenceDataDbDfn.ColumnIdx columnIdx)
{
if (!config.UpdateLogConsole.CanUpdateDatabase) return false;
return true;
}
protected bool RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx columnIdx, String value, bool newValue)
{
return RecordAttrValue(columnIdx, new DataValue(value), newValue);
}
protected bool RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx columnIdx, int value, bool newValue, bool blankZeroValue = true)
{
return RecordAttrValue(columnIdx, new DataValue(value == 0 && blankZeroValue ? "" : value.ToString()), newValue);
}
protected bool RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx columnIdx, decimal value, bool newValue, bool blankZeroValue = true, ushort decimals = 2)
{
return RecordAttrValue(columnIdx, new DataValue(value == 0.0m && blankZeroValue ? "" : value.ToString("N" + decimals.ToString())), newValue);
}
protected bool RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx columnIdx, DateTime value, bool newValue, bool includeTime = true)
{
return RecordAttrValue(columnIdx, new DataValue(DateUtil.Format(value, (includeTime ? "d-MMM-yyyy HH:mm" : "d-MMM-yyyy"))), newValue);
}
protected bool RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx columnIdx, DataValue value, bool newValue)
{
ClearErrorState();
if (!IsColumnChangeLogged(columnIdx)) return true;
String attrName = SaReferenceDataDbDfn.GetColumnName(columnIdx);
if (attrName.IsEmpty()) return SetErrorState("Blank attribute name [" + columnIdx.ToString() + "]");
return RecordAttrValue(attrName, value, newValue);
}
// ---------------------------- Columns. ----------------------------
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,64 @@
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
namespace Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog
{
//=======================================================================
public class SaUpdateLogItemMonitor_Region : SaUpdateLogItemMonitor_ReferenceData
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SaUpdateLogItemMonitor_ReferenceData.Config
{
public Config (SaReferenceDataConsole referenceDataConsole, SysId itemId, DbUpdateInfo dbUpdateInfo) :
base(referenceDataConsole.UpdateLogConsole, dbUpdateInfo)
{
ItemType = referenceDataConsole.RegionItemType;
ItemId = itemId;
}
}
//-------------------------------------------------------------------
// Data members.
private List<TypeCodeDesc> regionTypes;
//-------------------------------------------------------------------
// Construction.
public SaUpdateLogItemMonitor_Region (SaReferenceDataConsole referenceDataConsole, SaRegion region, DbUpdateInfo dbUpdateInfo) :
base(new Config(referenceDataConsole, region.Id, dbUpdateInfo))
{
regionTypes = SaReferenceDataConsole.GetReferenceDataCodes(ReferenceDataSystemCode.RegionType);
RecordAttrValues(region, false);
}
//-------------------------------------------------------------------
// Record attribute values.
public bool RecordUpdatedValues (SaRegion region)
{
return RecordAttrValues(region, true);
}
private bool RecordAttrValues (SaRegion region, bool newValues)
{
ClearErrorState();
// Region Property - record values that may require logging.
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Region_Type, regionTypes.GetCodeForType(region.RegionType, region.RegionType.ToString()), newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Region_Name, region.Name, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Region_Parent, SysId.ToInt(region.RegionIdParent), newValues);
// Common properties.
/*
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Region_Notes, region.Notes, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.Region_Status, SacsSystem.GetStatusCode(region.Status), newValues);
*/
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,66 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
namespace Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog
{
//=======================================================================
public class SaUpdateLogItemMonitor_TaxCode : SaUpdateLogItemMonitor_ReferenceData
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SaUpdateLogItemMonitor_ReferenceData.Config
{
public Config (SaReferenceDataConsole referenceDataConsole, SysId itemId, DbUpdateInfo dbUpdateInfo) :
base(referenceDataConsole.UpdateLogConsole, dbUpdateInfo)
{
ItemType = referenceDataConsole.TaxCodeItemType;
ItemId = itemId;
}
}
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
public SaUpdateLogItemMonitor_TaxCode(SaReferenceDataConsole referenceDataConsole, SaTaxCode taxcode, DbUpdateInfo dbUpdateInfo) :
base(new Config(referenceDataConsole, taxcode.Id, dbUpdateInfo))
{
RecordAttrValues(taxcode, false);
}
//-------------------------------------------------------------------
// Record attribute values.
public bool RecordUpdatedValues(SaTaxCode taxcode)
{
return RecordAttrValues(taxcode, true);
}
private bool RecordAttrValues(SaTaxCode taxCode, bool newValues)
{
ClearErrorState();
// TaxCode Properties - record values that may require logging.
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, taxCode.Code, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt1, taxCode.CodeAlt1, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt2, taxCode.CodeAlt2, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Description, taxCode.Description, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_RegionId, SysId.ToInt(taxCode.RegionId), newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectFrom, taxCode.EffectFrom, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectTo, taxCode.EffectTo, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRate, taxCode.TaxRate, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRatePrev, taxCode.TaxRatePrev, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxCodeIdLink, SysId.ToInt(taxCode.TaxCodeIdLink), newValues);
// Common properties.
/*
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Notes, taxcode.Notes, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Status, SacsSystem.GetStatusCode(taxcode.Status), newValues);
*/
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,74 @@
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.ReferenceData;
namespace Sarand.Net.Standard.Dbas.ReferenceData.UpdateLog
{
//=======================================================================
public class SaUpdateLogItemMonitor_UnitMeasure : SaUpdateLogItemMonitor_ReferenceData
{
//-------------------------------------------------------------------
// Configuration.
public new class Config : SaUpdateLogItemMonitor_ReferenceData.Config
{
public Config (SaReferenceDataConsole referenceDataConsole, SysId itemId, DbUpdateInfo dbUpdateInfo) :
base(referenceDataConsole.UpdateLogConsole, dbUpdateInfo)
{
ItemType = referenceDataConsole.UnitMeasureItemType;
ItemId = itemId;
}
}
//-------------------------------------------------------------------
// Data members.
private List<TypeCodeDesc> uomCategories;
private List<TypeCodeDesc> uomUnitTypes;
//-------------------------------------------------------------------
// Construction.
public SaUpdateLogItemMonitor_UnitMeasure (SaReferenceDataConsole referenceDataConsole, SaUnitMeasure unitMeasure, DbUpdateInfo dbUpdateInfo) :
base(new Config(referenceDataConsole, unitMeasure.Id, dbUpdateInfo))
{
uomCategories = SaReferenceDataConsole.GetReferenceDataCodes(ReferenceDataSystemCode.UnitMeasureCategory);
uomUnitTypes = SaReferenceDataConsole.GetReferenceDataCodes(ReferenceDataSystemCode.UnitMeasureType);
RecordAttrValues(unitMeasure, false);
}
//-------------------------------------------------------------------
// Record attribute values.
public bool RecordUpdatedValues (SaUnitMeasure unitMeasure)
{
return RecordAttrValues(unitMeasure, true);
}
private bool RecordAttrValues (SaUnitMeasure unitMeasure, bool newValues)
{
ClearErrorState();
// UnitMeasure Properties - record values that may require logging.
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Category, uomCategories.GetCodeForType(unitMeasure.Category, unitMeasure.Category.ToString()), newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UnitType, uomUnitTypes.GetCodeForType(unitMeasure.UnitType, unitMeasure.UnitType.ToString()), newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, unitMeasure.Code, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Abbr, unitMeasure.Abbr, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Single, unitMeasure.Single, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Multiple, unitMeasure.Multiple, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquValue, unitMeasure.EquivalencyValue, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdEqu, unitMeasure.UomIdEquivalency, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquAlgorythm, unitMeasure.EquivalencyAlgorythm, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef1, unitMeasure.UomIdRef1, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef2, unitMeasure.UomIdRef2, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef3, unitMeasure.UomIdRef3, newValues);
// Common properties.
/*
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Notes, unitMeasure.Notes, newValues);
RecordAttrValue(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Status, SacsSystem.GetStatusCode(unitMeasure.Status), newValues);
*/
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,255 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:38
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Security.Internal
{
internal class SaSecItem_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id");
public ColumnDataString _Code { get; } = new ColumnDataString("Code");
public ColumnDataString _Description { get; } = new ColumnDataString("Description");
public ColumnDataByte _Type { get; } = new ColumnDataByte("Type");
public ColumnDataString _EmailAddress { get; } = new ColumnDataString("EmailAddress");
public ColumnDataString _Location { get; } = new ColumnDataString("Location");
public ColumnDataString _EncPword { get; } = new ColumnDataString("EncPword");
public ColumnDataString _PwordSalt { get; } = new ColumnDataString("PwordSalt");
public ColumnDataString _PwordHash { get; } = new ColumnDataString("PwordHash");
public ColumnDataDateTime _LastLogin { get; } = new ColumnDataDateTime("LastLogin");
public ColumnDataInt16 _DataItemType { get; } = new ColumnDataInt16("DataItemType");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"Id",
"Code",
"Description",
"Type",
"EmailAddress",
"Location",
"EncPword",
"PwordSalt",
"PwordHash",
"LastLogin",
"DataItemType",
"Notes",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"Id",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
"Code",
};
//-------------------------------------------------------------------
// Construction.
internal SaSecItem_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get { return GetActualTableName("SaSecItem"); } }
public override List<String> AlternativeTableNames { get; } = new List<string>() { "SaSecurityItem" };
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public String _Code { get { return Cols._Code.Value; } set { Cols._Code.Value = value; } }
public String _Description { get { return Cols._Description.Value; } set { Cols._Description.Value = value; } }
public Byte _Type { get { return Cols._Type.Value; } set { Cols._Type.Value = value; } }
public String _EmailAddress { get { return Cols._EmailAddress.Value; } set { Cols._EmailAddress.Value = value; } }
public String _Location { get { return Cols._Location.Value; } set { Cols._Location.Value = value; } }
public String _EncPword { get { return Cols._EncPword.Value; } set { Cols._EncPword.Value = value; } }
public String _PwordSalt { get { return Cols._PwordSalt.Value; } set { Cols._PwordSalt.Value = value; } }
public String _PwordHash { get { return Cols._PwordHash.Value; } set { Cols._PwordHash.Value = value; } }
public DateTime _LastLogin { get { return Cols._LastLogin.Value; } set { Cols._LastLogin.Value = value; } }
public Int16 _DataItemType { get { return Cols._DataItemType.Value; } set { Cols._DataItemType.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_Code = GetFieldString(dbDataReader, "Code", _Code);
_Description = GetFieldString(dbDataReader, "Description", _Description);
_Type = GetFieldByte(dbDataReader, "Type", _Type);
_EmailAddress = GetFieldString(dbDataReader, "EmailAddress", _EmailAddress);
_Location = GetFieldString(dbDataReader, "Location", _Location);
_EncPword = GetFieldString(dbDataReader, "EncPword", _EncPword);
_PwordSalt = GetFieldString(dbDataReader, "PwordSalt", _PwordSalt);
_PwordHash = GetFieldString(dbDataReader, "PwordHash", _PwordHash);
_LastLogin = GetFieldDateTime(dbDataReader, "LastLogin", _LastLogin);
_DataItemType = GetFieldInt16(dbDataReader, "DataItemType", _DataItemType);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Id")) AddCommandParameter(dbCommand, "@Id", _Id);
if (columnNames.ContainsCI("Code")) AddCommandParameter(dbCommand, "@Code", _Code);
if (columnNames.ContainsCI("Description")) AddCommandParameter(dbCommand, "@Description", _Description);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("EmailAddress")) AddCommandParameter(dbCommand, "@EmailAddress", _EmailAddress);
if (columnNames.ContainsCI("Location")) AddCommandParameter(dbCommand, "@Location", _Location);
if (columnNames.ContainsCI("EncPword")) AddCommandParameter(dbCommand, "@EncPword", _EncPword);
if (columnNames.ContainsCI("PwordSalt")) AddCommandParameter(dbCommand, "@PwordSalt", _PwordSalt);
if (columnNames.ContainsCI("PwordHash")) AddCommandParameter(dbCommand, "@PwordHash", _PwordHash);
if (columnNames.ContainsCI("LastLogin")) AddCommandParameter(dbCommand, "@LastLogin", _LastLogin);
if (columnNames.ContainsCI("DataItemType")) AddCommandParameter(dbCommand, "@DataItemType", _DataItemType);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE Id=@Id;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE Id=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("Description")) AddCommandParameter(dbCommand, "@Description", _Description);
if (columnNames.ContainsCI("Type")) AddCommandParameter(dbCommand, "@Type", _Type);
if (columnNames.ContainsCI("EmailAddress")) AddCommandParameter(dbCommand, "@EmailAddress", _EmailAddress);
if (columnNames.ContainsCI("Location")) AddCommandParameter(dbCommand, "@Location", _Location);
if (columnNames.ContainsCI("EncPword")) AddCommandParameter(dbCommand, "@EncPword", _EncPword);
if (columnNames.ContainsCI("PwordSalt")) AddCommandParameter(dbCommand, "@PwordSalt", _PwordSalt);
if (columnNames.ContainsCI("PwordHash")) AddCommandParameter(dbCommand, "@PwordHash", _PwordHash);
if (columnNames.ContainsCI("LastLogin")) AddCommandParameter(dbCommand, "@LastLogin", _LastLogin);
if (columnNames.ContainsCI("DataItemType")) AddCommandParameter(dbCommand, "@DataItemType", _DataItemType);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@Id", _Id);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,221 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Odbc;
using Microsoft.Data.SqlClient;
using System.Linq;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:10:38
//---------------------------------------------------------------------------
namespace Sarand.Net.Standard.Dbas.Security.Internal
{
internal class SaSecLink_Db : DbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt32 _ItemOwner { get; } = new ColumnDataInt32("ItemOwner");
public ColumnDataInt32 _ItemTarget { get; } = new ColumnDataInt32("ItemTarget");
public ColumnDataInt32 _ItemContext { get; } = new ColumnDataInt32("ItemContext");
public ColumnDataString _DayApplic { get; } = new ColumnDataString("DayApplic");
public ColumnDataInt32 _DateApplicFrom { get; } = new ColumnDataInt32("DateApplicFrom");
public ColumnDataInt32 _DateApplicTo { get; } = new ColumnDataInt32("DateApplicTo");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataInt32 _CreateBy { get; } = new ColumnDataInt32("CreateBy");
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
public ColumnDataInt32 _UpdateBy { get; } = new ColumnDataInt32("UpdateBy");
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
}
//-------------------------------------------------------------------
// Data members.
private static List<String> fields { get; } = new List<String>()
{
"ItemOwner",
"ItemTarget",
"ItemContext",
"DayApplic",
"DateApplicFrom",
"DateApplicTo",
"Flags",
"Status",
"CreateOn",
"CreateBy",
"CreateHost",
"UpdateOn",
"UpdateBy",
"UpdateHost",
};
private static List<String> fieldsId { get; } = new List<String>()
{
};
private static List<String> fieldsPrimary { get; } = new List<String>()
{
"ItemOwner",
"ItemTarget",
"ItemContext",
};
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
};
//-------------------------------------------------------------------
// Construction.
internal SaSecLink_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get { return GetActualTableName("SaSecLink"); } }
public override List<String> AlternativeTableNames { get; } = new List<string>() { "SaSecurityLink" };
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _ItemOwner { get { return Cols._ItemOwner.Value; } set { Cols._ItemOwner.Value = value; } }
public Int32 _ItemTarget { get { return Cols._ItemTarget.Value; } set { Cols._ItemTarget.Value = value; } }
public Int32 _ItemContext { get { return Cols._ItemContext.Value; } set { Cols._ItemContext.Value = value; } }
public String _DayApplic { get { return Cols._DayApplic.Value; } set { Cols._DayApplic.Value = value; } }
public Int32 _DateApplicFrom { get { return Cols._DateApplicFrom.Value; } set { Cols._DateApplicFrom.Value = value; } }
public Int32 _DateApplicTo { get { return Cols._DateApplicTo.Value; } set { Cols._DateApplicTo.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public Int32 _CreateBy { get { return Cols._CreateBy.Value; } set { Cols._CreateBy.Value = value; } }
public String _CreateHost { get { return Cols._CreateHost.Value; } set { Cols._CreateHost.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
public Int32 _UpdateBy { get { return Cols._UpdateBy.Value; } set { Cols._UpdateBy.Value = value; } }
public String _UpdateHost { get { return Cols._UpdateHost.Value; } set { Cols._UpdateHost.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_ItemOwner = GetFieldInt32(dbDataReader, "ItemOwner", _ItemOwner);
_ItemTarget = GetFieldInt32(dbDataReader, "ItemTarget", _ItemTarget);
_ItemContext = GetFieldInt32(dbDataReader, "ItemContext", _ItemContext);
_DayApplic = GetFieldString(dbDataReader, "DayApplic", _DayApplic);
_DateApplicFrom = GetFieldInt32(dbDataReader, "DateApplicFrom", _DateApplicFrom);
_DateApplicTo = GetFieldInt32(dbDataReader, "DateApplicTo", _DateApplicTo);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_CreateBy = GetFieldInt32(dbDataReader, "CreateBy", _CreateBy);
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
_UpdateBy = GetFieldInt32(dbDataReader, "UpdateBy", _UpdateBy);
_UpdateHost = GetFieldString(dbDataReader, "UpdateHost", _UpdateHost);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ItemOwner")) AddCommandParameter(dbCommand, "@ItemOwner", _ItemOwner);
if (columnNames.ContainsCI("ItemTarget")) AddCommandParameter(dbCommand, "@ItemTarget", _ItemTarget);
if (columnNames.ContainsCI("ItemContext")) AddCommandParameter(dbCommand, "@ItemContext", _ItemContext);
if (columnNames.ContainsCI("DayApplic")) AddCommandParameter(dbCommand, "@DayApplic", _DayApplic);
if (columnNames.ContainsCI("DateApplicFrom")) AddCommandParameter(dbCommand, "@DateApplicFrom", _DateApplicFrom);
if (columnNames.ContainsCI("DateApplicTo")) AddCommandParameter(dbCommand, "@DateApplicTo", _DateApplicTo);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("CreateBy")) AddCommandParameter(dbCommand, "@CreateBy", _CreateBy);
if (columnNames.ContainsCI("CreateHost")) AddCommandParameter(dbCommand, "@CreateHost", _CreateHost);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE ItemOwner=@ItemOwner AND ItemTarget=@ItemTarget AND ItemContext=@ItemContext;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE ItemOwner=? AND ItemTarget=? AND ItemContext=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("DayApplic")) AddCommandParameter(dbCommand, "@DayApplic", _DayApplic);
if (columnNames.ContainsCI("DateApplicFrom")) AddCommandParameter(dbCommand, "@DateApplicFrom", _DateApplicFrom);
if (columnNames.ContainsCI("DateApplicTo")) AddCommandParameter(dbCommand, "@DateApplicTo", _DateApplicTo);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
if (columnNames.ContainsCI("UpdateBy")) AddCommandParameter(dbCommand, "@UpdateBy", _UpdateBy);
if (columnNames.ContainsCI("UpdateHost")) AddCommandParameter(dbCommand, "@UpdateHost", _UpdateHost);
AddCommandParameter(dbCommand, "@ItemOwner", _ItemOwner);
AddCommandParameter(dbCommand, "@ItemTarget", _ItemTarget);
AddCommandParameter(dbCommand, "@ItemContext", _ItemContext);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -0,0 +1,776 @@
<?xml version="1.0"?>
<DbDfnDatabase xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Tables>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>SaSecItem</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>1</Pos>
<Name>Id</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>2</Pos>
<Name>Code</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>20</Size>
<BufferLen>40</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>3</Pos>
<Name>Description</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>50</Size>
<BufferLen>100</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>4</Pos>
<Name>Type</Name>
<DataType>TinyInt</DataType>
<DataTypeName />
<DataTypeNative>-6</DataTypeNative>
<DataTypeNameNative>tinyint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>1</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>5</Pos>
<Name>EmailAddress</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>12</DataTypeNative>
<DataTypeNameNative>varchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>128</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>6</Pos>
<Name>Location</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>50</Size>
<BufferLen>100</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>7</Pos>
<Name>EncPword</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>128</Size>
<BufferLen>256</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>8</Pos>
<Name>PwordSalt</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>32</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>9</Pos>
<Name>PwordHash</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>10</Pos>
<Name>LastLogin</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>11</Pos>
<Name>DataItemType</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>12</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>255</Size>
<BufferLen>510</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>13</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>14</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>12</DataTypeNative>
<DataTypeNameNative>varchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>3</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>15</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>16</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>17</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>12</DataTypeNative>
<DataTypeNameNative>varchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>64</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>18</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>19</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Pos>20</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>12</DataTypeNative>
<DataTypeNameNative>varchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>64</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Name>PK_SaSecItem</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>26</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Id</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Name>IDX_SaSecItem_TypeCode</Name>
<IndexType>3</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Type</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>Code</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Name>IDX_SaSecItem_Code</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Code</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecItem</Table>
<Name>IDX_SaSecItem_Desc</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>Description</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>SaSecLink</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>1</Pos>
<Name>ItemOwner</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>2</Pos>
<Name>ItemTarget</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>3</Pos>
<Name>ItemContext</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>4</Pos>
<Name>DayApplic</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>50</Size>
<BufferLen>100</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>5</Pos>
<Name>DateApplicFrom</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>6</Pos>
<Name>DateApplicTo</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>7</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>8</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>3</Size>
<BufferLen>6</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>9</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>10</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>11</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>12</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>13</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Pos>14</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
<DataTypeNative>-9</DataTypeNative>
<DataTypeNameNative>nvarchar</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>64</Size>
<BufferLen>128</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Name>PK_SaSecLink</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>28</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemOwner</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>ItemTarget</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>3</Seq>
<Name>ItemContext</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Name>IDX_SaSecLink_Context</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemContext</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Name>IDX_SaSecLink_Owner</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemOwner</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>SaSecLink</Table>
<Name>IDX_SaSecLink_Target</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemTarget</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
</Tables>
</DbDfnDatabase>
@@ -0,0 +1,594 @@
using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Dbas.Base;
using Sarand.Net.Standard.Dbas.Utils;
using Sarand.Net.Standard.Base.Utils;
namespace Sarand.Net.Standard.Dbas.Security
{
//=======================================================================
public abstract class SaSecurityConsole_Dbas : SaSecurityConsole
{
//-------------------------------------------------------------------
// Data members.
private SaSecurityMgr_Dbas securityMgr = null;
//-------------------------------------------------------------------
// Protected construction - use derived class.
protected SaSecurityConsole_Dbas (SacsDatabase database)
{
Database = database;
// Initialise security manager.
securityMgr = new SaSecurityMgr_Dbas(this);
}
//-------------------------------------------------------------------
// Database properties.
internal SacsDatabase Database { get; set; }
public override bool DatabaseIsValid { get { return securityMgr.DatabaseIsValid; } }
public override bool CanUpdateDatabase { get { return securityMgr.CanUpdateDatabase; } }
public override bool ColumnExists (SaSecurityDbDfn.ColumnIdx columnIdx)
{
return Database != null && Database.ColumnExists(SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.GetTableForColumn(columnIdx), false), SaSecurityDbDfn.GetColumnName(columnIdx,false));
}
//-------------------------------------------------------------------
// A p p l i c a t i o n I n t e r f a c e
//-------------------------------------------------------------------
// Show User Login form.
protected delegate bool ShowUserLoginFormFunction (SaSecurityConsole securityConsole, DbUpdateInfo dbUpdateInfo);
protected abstract ShowUserLoginFormFunction ShowUserLoginFormFn { get; }
// Manage security.
public override bool ShowUserLoginForm (DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (ShowUserLoginFormFn != null)
return ShowUserLoginFormFn(this, dbUpdateInfo);
return false;
}
//-------------------------------------------------------------------
// Method to display Security management form.
protected delegate bool ShowManageSecurityDialogFunction (SaSecurityConsole securityConsole, SaSecurityMgr securityMgr, bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo);
protected abstract ShowManageSecurityDialogFunction ShowManageSecurityDialogFn { get; }
// Manage security.
public override bool ManageSecurity (bool userCanManageSecurity, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (ShowManageSecurityDialogFn != null)
return ShowManageSecurityDialogFn(this, securityMgr, userCanManageSecurity, dbUpdateInfo);
return false;
}
//-------------------------------------------------------------------
public override bool ShowChangePasswordForm (DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
throw new NotImplementedException();
}
//-------------------------------------------------------------------
// A p p l i c a t i o n S e c u r i t y R i g h t s
//-------------------------------------------------------------------
public override bool RequiresPopulation ()
{
ClearErrorState();
if (SecurityRights.Count == 0) return false;
foreach (SaSecurityRight securityRight in SecurityRights)
{
if (!securityMgr.SecurityItemExistsByTypeCode(SaSecurity.ItemType.Right, securityRight.Code))
return true;
}
return false;
}
public override bool PopulateSecurityRights (DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (SecurityRights.Count == 0) return false;
foreach (SaSecurityRight securityRight in SecurityRights)
{
if (securityMgr.SecurityItemExistsByTypeCode(SaSecurity.ItemType.Right, securityRight.Code)) continue;
SaSecurityItem securityItem = securityMgr.CreateSecurityItem(SaSecurity.ItemType.Right);
securityItem.Code = securityRight.Code;
securityItem.Description = securityRight.Desc;
securityItem.DataItemType = securityRight.DataItemType;
if (!securityMgr.InsertSecurityItem(securityItem, dbUpdateInfo))
return SetErrorState(securityMgr.ErrorStateMessage);
}
// Ensure that there is a 'Superuser' group with all rights.
if (!HasErrorState()) PopulateSuperGroup(dbUpdateInfo);
// Create the 'admin' user.
if (!HasErrorState()) PopulateAdminUser(dbUpdateInfo);
return !HasErrorState();
}
private bool PopulateSuperGroup (DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaSecurityItem superGroup = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.Group, GroupSuperCode);
if (superGroup == null)
{
superGroup = securityMgr.CreateSecurityItem(SaSecurity.ItemType.Group);
superGroup.Code = GroupSuperCode;
superGroup.Description = "Superuser";
if (!securityMgr.InsertSecurityItem(superGroup, dbUpdateInfo))
return SetErrorState(securityMgr.ErrorStateMessage);
}
if (superGroup != null)
{
// Create a link with each right in the list.
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.SecurityItemType = SaSecurity.ItemType.Right;
foreach (SaSecurityItem securityItem in securityMgr.GetSecurityItemList(prmSecItem))
{
// Assign right to the superuser group, apart from those that specify a data item type.
SysId securityRightId = securityItem.Id;
if (SysId.IsValid(securityRightId) && securityItem.DataItemType < 1 && !securityMgr.SecurityItemHasLinksWith(superGroup.Id, securityRightId))
{
SaSecurityLink superGroupRight = securityMgr.CreateSecurityLink(superGroup.Id, securityRightId, null);
if (!securityMgr.InsertSecurityLink(superGroupRight, dbUpdateInfo))
return SetErrorState(securityMgr.ErrorStateMessage);
}
}
}
return !HasErrorState();
}
private bool PopulateAdminUser (DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
SaSecurityItem user = null;
if (!securityMgr.SecurityItemExistsByTypeCode(SaSecurity.ItemType.User, AdminUserCode))
{
// Create the admin user.
user = securityMgr.CreateSecurityItem(SaSecurity.ItemType.User);
user.Code = AdminUserCode;
user.Description = "<Admin>";
user.Location = "<System>";
user.PasswordEncrypted = SaSecurityItem.EncryptPassword(AdminUserCode);
if (!securityMgr.InsertSecurityItem(user, dbUpdateInfo))
return SetErrorState(securityMgr.ErrorStateMessage);
}
// Retrieve the user (even if just created).
user = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.User, AdminUserCode);
if (user != null)
{
// Give this user superuser rights.
SaSecurityItem superGroup = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.Group, GroupSuperCode);
if (superGroup != null)
{
if (!securityMgr.SecurityItemHasLinksWith(user.Id, superGroup.Id))
{
SaSecurityLink userSuperGroup = securityMgr.CreateSecurityLink(user.Id, superGroup.Id, null);
if (!securityMgr.InsertSecurityLink(userSuperGroup, dbUpdateInfo))
return SetErrorState(securityMgr.ErrorStateMessage);
}
}
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// A p p l i c a t i o n D a t a I t e m s
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// L o g i n
//-------------------------------------------------------------------
public override bool LoginUser (SysId userId, bool recordLastLogin = true)
{
String fn = GetType().Name + ".LoginUser";
ClearErrorState();
using (SaSecurityItem secItemUser = securityMgr.GetSecurityItemById(userId))
{
if (secItemUser == null || secItemUser.ItemType != SaSecurity.ItemType.User || !secItemUser.IsStatusEnabled)
{
SaLogger.Error(fn + " Failed to retrieve user for login. Id: " + SysId.ToString(userId) + " - " + securityMgr.ErrorStateMessage, true);
return SetErrorState("Invalid credentials supplied");
}
if (recordLastLogin)
{
secItemUser.LastLogin = DateTime.Now;
if (!securityMgr.UpdateSecurityItem(secItemUser, new DbUpdateInfo(secItemUser.Id, secItemUser.Description, SacsSystem.ComputerName)))
SaLogger.Error(fn + " Failed to update user on login. Id: " + SysId.ToString(userId) + "' - " + securityMgr.ErrorStateMessage, true);
}
OnLogin(secItemUser != null ? secItemUser.Id : null);
}
return true;
}
public override bool LoginAuthenticatedUser ()
{
String fn = GetType().Name + ".LoginAuthenticatedUser";
ClearErrorState();
String userCode = System.Environment.UserName;
SaSecurityItem secItem = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.User, userCode);
if (secItem != null)
{
secItem.LastLogin = DateTime.Now;
if (!securityMgr.UpdateSecurityItem(secItem, new DbUpdateInfo(secItem.Id, secItem.Description, SacsSystem.ComputerName)))
SaLogger.Error(fn + " Failed to update user '" + userCode + "' - " + securityMgr.ErrorStateMessage, true);
}
else
{
// Create user.
secItem = securityMgr.CreateSecurityItem(SaSecurity.ItemType.User);
secItem.Code = userCode;
secItem.Description = StringUtil.OnEmpty(SystemUtil.GetUserDisplayName(), userCode);
secItem.LastLogin = DateTime.Now;
secItem.AuthenticatedUser = true;
if (!securityMgr.InsertSecurityItem(secItem, new DbUpdateInfo(new SysId(), secItem.Description, SacsSystem.ComputerName)))
{
SaLogger.Error(fn + " Failed to create user '" + userCode + "' - " + securityMgr.ErrorStateMessage, true);
secItem = null;
}
}
OnLogin(secItem != null ? secItem.Id : null);
return !HasErrorState();
}
//-------------------------------------------------------------------
/// <summary>Logout - Clear user and security details.</summary>
public override bool LogoutUser ()
{
OnLogout();
return true;
}
//-------------------------------------------------------------------
// S e c u r i t y P r o f i l e s
//-------------------------------------------------------------------
private SaSecurityProfile hostSecurityProfile;
/// <summary>Retrieve security profile for host computer</summary>
public override SaSecurityProfile GetHostSecurityProfile ()
{
ClearErrorState();
if (hostSecurityProfile == null)
{
String hostCode = System.Environment.MachineName;
hostSecurityProfile = GetSecurityProfile(securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.Computer, hostCode));
}
return hostSecurityProfile;
}
/// <summary>Retrieve security profile for specified user</summary>
public override SaSecurityProfile GetUserSecurityProfile (SysId userId)
{
ClearErrorState();
return GetSecurityProfile(securityMgr.GetSecurityItemById(userId));
}
private SaSecurityProfile GetSecurityProfile (SaSecurityItem secItem)
{
String fn = GetType().Name + ".PopulateSecurityProfile";
if (secItem == null || !SysId.IsValid(secItem.Id)) return null;
if (LogSecurityProfile) SaLogger.Info(fn + " Populating security profile for user " + secItem.Code + " '" + secItem.Description + "'");
// Retrieve Group links associated with the Item.
SaSecurityLink.Params prmSecLinkGroups = new SaSecurityLink.Params();
prmSecLinkGroups.includedItemIdsOwner.Add(secItem.Id);
prmSecLinkGroups.TargetItemType = SaSecurity.ItemType.Group;
List<SaSecurityLink> groupLinks = securityMgr.GetSecurityLinkList(prmSecLinkGroups);
// Retrieve Right links associated with the Item and its Groups.
SaSecurityLink.Params prmSecLinkRights = new SaSecurityLink.Params();
prmSecLinkRights.includedItemIdsOwner.Add(secItem.Id);
prmSecLinkRights.includedItemIdsOwner.AddRange(groupLinks.GetTargetItemIds());
prmSecLinkRights.TargetItemType = SaSecurity.ItemType.Right;
List<SaSecurityLink> rightLinks = securityMgr.GetSecurityLinkList(prmSecLinkRights);
// Retrieve security Group and Right items.
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.IncludedIds.AddRange(groupLinks.GetTargetItemIds());
prmSecItem.IncludedIds.AddRange(rightLinks.GetTargetItemIds());
List<SaSecurityItem> secItems = securityMgr.GetSecurityItemList(prmSecItem);
// Add the Groups to the profile.
List<SaSecurityProfile.GroupData> profileGroups = new List<SaSecurityProfile.GroupData>();
foreach (SaSecurityLink secGroupLink in groupLinks)
{
// Retrieve Group.
SaSecurityItem secGroup = secItems.Find(item => item.Id.Equals(secGroupLink.ItemIdTarget) && item.ItemType == SaSecurity.ItemType.Group);
if (secGroup == null)
{
SaLogger.Warn(fn + " Failed to retrieve security group. Id: " + SysId.ToString(secGroupLink.ItemIdTarget));
continue;
}
if (LogSecurityProfile) SaLogger.Info(fn + " Adding group to profile: " + secGroup.Code + " '" + secGroup.Description + "'");
// Retrieve rights for group.
List<SaSecurityProfile.RightData> profileGroupRights = new List<SaSecurityProfile.RightData>();
foreach (SaSecurityLink secRightLink in rightLinks.FindAll(item => item.ItemIdOwner.Equals(secGroup.Id)))
{
// Retrieve Right.
SaSecurityItem secRight = secItems.Find(item => item.Id.Equals(secRightLink.ItemIdTarget) && item.ItemType == SaSecurity.ItemType.Right);
if (secRight == null)
{
SaLogger.Warn(fn + " Failed to retrieve security group right. Id: " + SysId.ToString(secRightLink.ItemIdTarget));
continue;
}
bool rightGranted = (secRightLink.Status == SaStatus.Granted);
if (LogSecurityProfile) SaLogger.Info(fn + " Adding group right to profile: " + secRight.Code + " '" + secRight.Description + "' [" + (rightGranted ? "Granted" : "Denied") + "]");
try
{
SaSecurityProfile.RightData rightData = new SaSecurityProfile.RightData(secRight, secRightLink);
profileGroupRights.Add(rightData);
}
catch (Exception exc) { SaLogger.Warn(fn + " " + exc.Message); }
}
try
{
SaSecurityProfile.GroupData groupData = new SaSecurityProfile.GroupData(secGroup, profileGroupRights);
profileGroups.Add(groupData);
}
catch (Exception exc) { SaLogger.Warn(fn + " " + exc.Message); }
}
// Add the Rights to the profile.
List<SaSecurityProfile.RightData> profileRights = new List<SaSecurityProfile.RightData>();
foreach (SaSecurityLink secRightLink in rightLinks.FindAll(item => item.ItemIdOwner.Equals(secItem.Id)))
{
// Retrieve Right.
SaSecurityItem secRight = secItems.Find(item => item.Id.Equals(secRightLink.ItemIdTarget) && item.ItemType == SaSecurity.ItemType.Right);
if (secRight == null)
{
SaLogger.Warn(fn + " Failed to retrieve security right. Id: " + SysId.ToString(secRightLink.ItemIdTarget));
continue;
}
bool rightGranted = (secRightLink.Status == SaStatus.Granted);
if (LogSecurityProfile) SaLogger.Info(fn + " Adding right to profile: " + secRight.Code + " '" + secRight.Description + "' [" + (rightGranted ? "Granted" : "Denied") + "]");
try
{
SaSecurityProfile.RightData rightData = new SaSecurityProfile.RightData(secRight, secRightLink);
profileRights.Add(rightData);
}
catch (Exception exc) { SaLogger.Warn(fn + " " + exc.Message); }
}
// Create security profile.
#if DEBUG
return CreateSecurityProfile(secItem, profileGroups, profileRights, !RequireDebugLogin);
#else
return CreateSecurityProfile(secItem, profileGroups, profileRights, false);
#endif
}
//-------------------------------------------------------------------
// U s e r S e c u r i t y R i g h t s
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// S e c u r i t y I t e m s
//-------------------------------------------------------------------
public override SaSecurityItem GetSecurityItemByCode (SaSecurity.ItemType securityItemType, string code)
{
return securityMgr.GetSecurityItemByTypeCode(securityItemType, code);
}
public override SaSecurityItem GetSecurityItem (SaSecurityItem.Params prm)
{
ClearErrorState();
SaSecurityItem securityItem = securityMgr.GetSecurityItem (prm);
SetErrorState(securityMgr.ErrorStateMessage);
return securityItem;
}
//-------------------------------------------------------------------
// Security Item properties.
public override SysId GetIdForItemCode (SaSecurity.ItemType securityItemType, string code)
{
ClearErrorState();
if (securityItemType != SaSecurity.ItemType.Unknown && !StringUtil.IsEmpty(code))
{
// Columns to query.
ColumnDfn colSecItemId = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Id);
ColumnDfn colSecItemCode = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Code);
List<ColumnDfn> columns = new List<ColumnDfn> { colSecItemId, colSecItemCode };
// Filter.
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.Code = code;
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
if (securityMgr.GetSecurityItemCount(prmSecItem) != 1) return null;
// Execute query.
using (DbResultSet dbResultSet = securityMgr.ExecuteSecurityItemQuery(columns, prmSecItem))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
SysId itemId = new SysId(StringUtil.ToInt(values.GetValue(colSecItemId.DataName).ToString()));
String itemCode = values.GetValue(colSecItemCode.DataName).ToString();
if (itemCode.EqualsCI(code))
return itemId;
}
}
}
return null;
}
public override string GetCodeForItemId (SysId itemId)
{
ClearErrorState();
if (!SysId.IsValid(itemId))
{
SetErrorState("Item id nust be specified");
return "";
}
// Columns to query.
ColumnDfn colSecItemId = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Id);
ColumnDfn colSecItemCode = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Code);
List<ColumnDfn> columns = new List<ColumnDfn> { colSecItemId, colSecItemCode };
// Filter.
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.IncludedIds.Add(itemId);
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
if (securityMgr.GetSecurityItemCount(prmSecItem) != 1) return null;
// Execute query.
using (DbResultSet dbResultSet = securityMgr.ExecuteSecurityItemQuery(columns, prmSecItem))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
if (new SysId(StringUtil.ToInt(values.GetValue(colSecItemId.DataName).ToString())).Equals(itemId))
return values.GetValue(colSecItemCode.DataName).ToString();
}
}
return "";
}
public override string GetNameForItemId (SysId itemId)
{
ClearErrorState();
if (!SysId.IsValid(itemId))
{
SetErrorState("Item id nust be specified");
return "";
}
// Columns to query.
ColumnDfn colSecItemId = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Id);
ColumnDfn colSecItemDesc = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Description);
List<ColumnDfn> columns = new List<ColumnDfn> { colSecItemId, colSecItemDesc };
// Filter.
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.IncludedIds.Add(itemId);
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
if (securityMgr.GetSecurityItemCount(prmSecItem) != 1) return null;
// Execute query.
using (DbResultSet dbResultSet = securityMgr.ExecuteSecurityItemQuery(columns, prmSecItem))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
if (new SysId(StringUtil.ToInt(values.GetValue(colSecItemId.DataName).ToString())).Equals(itemId))
return values.GetValue(colSecItemDesc.DataName).ToString();
}
}
return "";
}
public override Dictionary<SysId, String> GetSecurityItemDescriptions (List<SysId> securityItemIds)
{
ClearErrorState();
Dictionary<SysId, String> securityItemDescs = new Dictionary<SysId, String>();
if (securityItemIds.Count < 1) return securityItemDescs;
// Columns to query.
ColumnDfn colSecItemId = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Id);
ColumnDfn colSecItemDesc = securityMgr.GetSecurityItemColumnDfn(SaSecurityItem.Column.Description);
List<ColumnDfn> columns = new List<ColumnDfn> { colSecItemId, colSecItemDesc };
// Filter.
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
prmSecItem.IncludedIds.AddRange(securityItemIds);
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
// Execute query.
using (DbResultSet dbResultSet = securityMgr.ExecuteSecurityItemQuery(columns, prmSecItem))
{
while (dbResultSet != null && dbResultSet.NextRecord())
{
NamedValue.Map values = dbResultSet.GetRecordValues();
SysId itemId = new SysId(StringUtil.ToInt(values.GetValue(colSecItemId.DataName).ToString()));
String itemDesc = values.GetValue(colSecItemDesc.DataName).ToString();
securityItemDescs[itemId] = itemDesc;
}
}
return securityItemDescs;
}
//-------------------------------------------------------------------
// Security item updates.
public override bool CreateUser (string code, string name, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (StringUtil.IsEmpty(code) || StringUtil.IsEmpty(name))
return SetErrorState("User code and name must be supplied");
if (SecurityItemCodeExists(SaSecurity.ItemType.User, code))
return SetErrorState("User code already exists");
// Create User.
SaSecurityItem secItem = securityMgr.CreateSecurityItem(SaSecurity.ItemType.User);
secItem.Code = code;
secItem.Description = name;
// Insert on database.
if (!securityMgr.InsertSecurityItem(secItem, dbUpdateInfo))
return SetErrorState(securityMgr.ErrorStateMessage);
return !HasErrorState();
}
public override bool AssignUserToGroup (string userCode, string groupCode, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
throw new NotImplementedException();
}
//-------------------------------------------------------------------
// Security Item list.
public override ColumnDfn GetSecurityItemColumnDfn (SaSecurityItem.Column columnId, String caption = "", int width = 0)
{
ClearErrorState();
return securityMgr.GetSecurityItemColumnDfn(columnId, caption, width);
}
public override long GetSecurityItemCount (SaSecurityItem.Params prm)
{
ClearErrorState();
return securityMgr.GetSecurityItemCount(prm);
}
public override List<SaSecurityItem> GetSecurityItemList (SaSecurityItem.Params prm)
{
ClearErrorState();
return securityMgr.GetSecurityItemList(prm);
}
public override DbResultSet ExecuteSecurityItemQuery (List<ColumnDfn> columns, SaSecurityItem.Params prm)
{
ClearErrorState();
DbResultSet resultSet = securityMgr.ExecuteSecurityItemQuery(columns, prm);
SetErrorState(securityMgr.ErrorStateMessage);
return resultSet;
}
public override DataValue GetSecurityItemDataValue (ColumnDfn column, NamedValue.Map values)
{
ClearErrorState();
return securityMgr.GetSecurityItemDataValue(column, values);
}
//-------------------------------------------------------------------
// S e c u r i t y I t e m s L i n k s
//-------------------------------------------------------------------
// Security item links.
public override bool ItemsAreLinked (SysId itemId1, SysId itemId2)
{
ClearErrorState();
if (!SysId.IsValid(itemId1) || !SysId.IsValid(itemId2)) return false;
// From-To.
SaSecurityLink.Params prmSecLink = new SaSecurityLink.Params();
prmSecLink.includedItemIdsOwner.Add(itemId1);
prmSecLink.includedItemIdsTarget.Add(itemId2);
prmSecLink.StatusCat = SaSecurityLink.StatusCat.Any;
if (securityMgr.GetSecurityLinkCount(prmSecLink) > 0)
return true;
// To-From.
prmSecLink = new SaSecurityLink.Params();
prmSecLink.includedItemIdsOwner.Add(itemId2);
prmSecLink.includedItemIdsTarget.Add(itemId1);
prmSecLink.StatusCat = SaSecurityLink.StatusCat.Any;
if (securityMgr.GetSecurityLinkCount(prmSecLink) > 0)
return true;
return false;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,116 @@
using System;
using System.IO;
using System.Reflection;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.IO;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Base;
namespace Sarand.Net.Standard.Dbas.Security
{
//=======================================================================
public static class SaSecurityDbDfnGenerator
{
//-------------------------------------------------------------------
// Data members.
//private static string messageBoxTitle = "Sarand Security Module database definition generator";
//-------------------------------------------------------------------
/// <summary>
/// Generate database definitions.
/// </summary>
public static bool Generate(String connectionString)
{
String fn = nameof(SaSecurityDbDfnGenerator) + ".Generate";
// Locate output folder:
String directory = GetOutputFolder();
if (String.IsNullOrEmpty(directory) || !FileUtil.IsDirectory(directory)) return false;
// Open database.
// NB Must be ODBC connection - especially to retrieve index columns.
SacsDatabaseConsole.OdbcConfig config = new SacsDatabaseConsole.OdbcConfig();
config.connectionString = connectionString;
SacsDatabase database = SacsDatabaseConsole.OpenOdbcDatabase(config);
// Generate database definition.
try
{
return GenerateDatabaseDefinition(database, directory);
}
catch (Exception exc)
{
SaLogger.Error(fn + " " + ExceptionUtil.GetLogMessage(exc));
}
return false;
}
//-------------------------------------------------------------------
private static bool GenerateDatabaseDefinition(SacsDatabase database, String directory)
{
DatabaseDefinitionGenerator.Config config = new DatabaseDefinitionGenerator.Config()
{
SarandCommonVersion = DatabaseDefinitionGenerator.SarandCommonVersion.VS2019,
DotNetVersion = DatabaseDefinitionGenerator.DotNetVersion.Core3,
Database = database,
OutputDirectory = directory,
};
// Schema - Tables.
config.Schema.Tables_Included.AddRange(new String[] { "SaSecItem", "SaSecLink" });
config.Schema.Tables_Excluded.AddRange(new String[] { });
config.Schema.AddAlternativeTableName("SaSecItem", "SaSecurityItem");
config.Schema.AddAlternativeTableName("SaSecLink", "SaSecurityLink");
// Schema - Columns.
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
config.Schema.InsertOnlyColumns.Add("SaSecItem", "Code");
config.Schema.InsertOnlyColumns.Add("SaSecurityItem", "Code");
// Database Definition class.
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.Security";
config.DefinitionClass.Classname = "SaSecurityDbDfn";
// Table class.
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.Security.Internal";
config.TableClass.MandatoryConstructorDbInfo = true;
// Generate database definition.
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
return generator.Generate(config);
}
//-------------------------------------------------------------------
private static String GetOutputFolder()
{
String fn = nameof(SaSecurityDbDfnGenerator) + ".GetOutputFolder";
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
String directory = assemblyDirectory;
SaLogger.Debug(fn + " Assembly folder: " + directory);
// Locate the parent of the 'Workspace' solution root folder.
String projectFolder = "Workspace";
while (!String.IsNullOrEmpty(directory))
{
if (FileUtil.IsDirectory(directory + Path.DirectorySeparatorChar + projectFolder))
{
break;
}
directory = FileUtil.GetParentDirectory(directory);
}
if (String.IsNullOrEmpty(directory))
{
SaLogger.Error(fn + " Failed to find '" + projectFolder + "' solution root folder in assembly path:\n\t" + assemblyDirectory);
return String.Empty;
}
// Code files are generated to '..\Dbas\Generated\Security\' folder.
directory += Path.DirectorySeparatorChar + "Database" + Path.DirectorySeparatorChar + "Generated" + Path.DirectorySeparatorChar + "Security";
SaLogger.Debug(fn + " Output folder: " + directory);
if (!FileUtil.ValidateDirectory(directory, true))
{
SaLogger.Error(fn + " Output folder not found:\n\n" + directory);
return String.Empty;
}
return directory;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,13 @@
using Sarand.Net.Standard.Base.Security;
namespace Sarand.Net.Standard.Dbas.Security
{
internal static class SaSecurityInternal
{
internal static SaSecurityMgr CreateSecurityMgr (this SaSecurityConsole securityConsole)
{
if (!(securityConsole is SaSecurityConsole_Dbas)) return null;
return new SaSecurityMgr_Dbas((SaSecurityConsole_Dbas)securityConsole);
}
}
}

Some files were not shown because too many files have changed in this diff Show More