Extract paired business object projects
This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:12
|
||||
//---------------------------------------------------------------------------
|
||||
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.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"Id",
|
||||
"Code",
|
||||
"Name",
|
||||
"MaxCodeLen",
|
||||
"CodeFormat",
|
||||
"NextCode",
|
||||
"Notes",
|
||||
"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> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"CreateHost",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
|
||||
{
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"Code",
|
||||
"CodeTypeId",
|
||||
"Code",
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
internal SaCodeType_Db (IDatabaseInfo dbInfo) : 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,235 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:12
|
||||
//---------------------------------------------------------------------------
|
||||
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.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"Id",
|
||||
"CodeTypeId",
|
||||
"Code",
|
||||
"Description",
|
||||
"Seq",
|
||||
"Data",
|
||||
"Notes",
|
||||
"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> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"CreateHost",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
|
||||
{
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"CodeTypeId",
|
||||
"Code",
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
internal SaCode_Db (IDatabaseInfo dbInfo) : 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,617 @@
|
||||
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(ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
codeTypeMgr = new SaCodeTypeMgr_Dbas(this);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase 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
|
||||
//*******************************************************************
|
||||
|
||||
// Create Code Type.
|
||||
public override SaCodeType CreateCodeType(String code)
|
||||
{
|
||||
ClearErrorState();
|
||||
return codeTypeMgr.CreateCodeType(code);
|
||||
}
|
||||
|
||||
// Code Type exists.
|
||||
public override bool CodeTypeExistsById(SysId codeTypeId)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool exists = codeTypeMgr.CodeTypeExistsById(codeTypeId);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return exists;
|
||||
}
|
||||
public override bool CodeTypeExistsByCode(String codeTypeCode)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool exists = codeTypeMgr.CodeTypeExistsByCode(codeTypeCode);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return exists;
|
||||
}
|
||||
|
||||
// Code Type count.
|
||||
public override int GetCodeTypeCount(SaCodeType.Params prmCodeType)
|
||||
{
|
||||
ClearErrorState();
|
||||
int count = (int)codeTypeMgr.GetCodeTypeCount(prmCodeType);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return count;
|
||||
}
|
||||
public override int GetCodeTypeCountById(SysId codeTypeId)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!SysId.IsValid(codeTypeId)) return 0;
|
||||
SaCodeType.Params prmCodeType = new SaCodeType.Params();
|
||||
prmCodeType.IdsIncluded.AddId(codeTypeId);
|
||||
return GetCodeTypeCount(prmCodeType);
|
||||
}
|
||||
public override int GetCodeTypeCountByCode(String codeTypeCode)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (StringUtil.IsBlank(codeTypeCode)) return 0;
|
||||
SaCodeType.Params prmCodeType = new SaCodeType.Params();
|
||||
prmCodeType.Code = codeTypeCode;
|
||||
return GetCodeTypeCount(prmCodeType);
|
||||
}
|
||||
|
||||
// Get Code Type.
|
||||
public override SaCodeType GetCodeTypeById(SysId codeTypeId)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaCodeType codeType = codeTypeMgr.GetCodeTypeById(codeTypeId);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return codeType;
|
||||
}
|
||||
public override SaCodeType GetCodeTypeByCode(String codeTypeCode)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaCodeType codeType = codeTypeMgr.GetCodeTypeByCode(codeTypeCode);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return codeType;
|
||||
}
|
||||
|
||||
// Get name for Code Type.
|
||||
public override String GetNameForCodeType(String codeTypeCode)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaCodeType codeTypeData = codeTypeMgr.GetCodeTypeByCode(codeTypeCode);
|
||||
if (codeTypeData != null)
|
||||
return codeTypeData.Name;
|
||||
return base.GetNameForCodeType(codeTypeCode);
|
||||
}
|
||||
|
||||
// Get Code Types.
|
||||
public override List<SaCodeType> GetCodeTypeList(SaCodeType.Params prmCodeType)
|
||||
{
|
||||
ClearErrorState();
|
||||
return codeTypeMgr.GetCodeTypeList(prmCodeType);
|
||||
}
|
||||
|
||||
// Code Type columns.
|
||||
public override ColumnDfn GetCodeTypeColumnDfn(SaCodeType.Column columnId, String caption = "", int width = 0)
|
||||
{
|
||||
ClearErrorState();
|
||||
return codeTypeMgr.GetCodeTypeColumnDfn(columnId, caption, width);
|
||||
}
|
||||
|
||||
// Execute Code Type query.
|
||||
public override DbResultSet ExecuteCodeTypeQuery(List<ColumnDfn> columns, SaCodeType.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
return codeTypeMgr.ExecuteCodeTypeQuery(columns, prm);
|
||||
}
|
||||
|
||||
// Get Code Type data value.
|
||||
public override DataValue GetCodeTypeDataValue(ColumnDfn column, NamedValue.Map values)
|
||||
{
|
||||
ClearErrorState();
|
||||
return codeTypeMgr.GetCodeTypeDataValue(column, values);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Code Type updates.
|
||||
public override bool InsertCodeType(SaCodeType codeType, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool result = codeTypeMgr.InsertCodeType(codeType, dbUpdateInfo);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return result;
|
||||
}
|
||||
public override bool UpdateCodeType(SaCodeType codeType, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool result = codeTypeMgr.UpdateCodeType(codeType, dbUpdateInfo);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return result;
|
||||
}
|
||||
public override bool DeleteCodeType(SaCodeType codeType, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool result = codeTypeMgr.DeleteCodeType(codeType, dbUpdateInfo);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return result;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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
|
||||
//*******************************************************************
|
||||
|
||||
// Create code.
|
||||
public override SaCode CreateCode(SysId codeTypeId, String code)
|
||||
{
|
||||
return codeTypeMgr.CreateCode(codeTypeId, code);
|
||||
}
|
||||
|
||||
// Check whether code exists.
|
||||
|
||||
public override bool CodeTypeHasCodes(String codeTypeCode, bool activeOnly = true)
|
||||
{
|
||||
return GetCodeCountForCodeType(codeTypeCode, activeOnly) > 0;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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.
|
||||
|
||||
public override SaCode GetCodeById(SysId codeId)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaCode code = codeTypeMgr.GetCodeById(codeId);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return code;
|
||||
}
|
||||
|
||||
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);
|
||||
return codeTypeMgr.GetCode(prmCode);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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> GetCodesForCodeType(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>> GetCodes(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.IdsIncluded.UnionWith(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>>> GetCodesAsync(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.IdsIncluded.UnionWith(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;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Code updates.
|
||||
public override bool InsertCode(SaCode code, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool result = codeTypeMgr.InsertCode(code, dbUpdateInfo);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return result;
|
||||
}
|
||||
public override bool UpdateCode(SaCode code, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool result = codeTypeMgr.UpdateCode(code, dbUpdateInfo);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return result;
|
||||
}
|
||||
public override bool DeleteCode(SaCode code, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
bool result = codeTypeMgr.DeleteCode(code, dbUpdateInfo);
|
||||
SetErrorState(codeTypeMgr.ErrorStateMessage);
|
||||
return result;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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.Name = codeTypeDfn.Description;
|
||||
codeType.MaxCodeLen = codeTypeDfn.MaxCodeLen;
|
||||
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.Name = codeTypeDfn.Description;
|
||||
codeType.MaxCodeLen = codeTypeDfn.MaxCodeLen;
|
||||
if (codeTypeDfn.MaxCodeLen > 0)
|
||||
codeType.MaxCodeLen = codeTypeDfn.MaxCodeLen;
|
||||
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,121 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.IO;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Base;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.CodeType
|
||||
{
|
||||
//=======================================================================
|
||||
public static class SaCodeTypeDbDfnGenerator
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
private static String className = nameof(SaCodeTypeDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate Code Type database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = $"{className}.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, "generating Code Type database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "SaCodeType", "SaCode" });
|
||||
config.Schema.Tables_Excluded.UnionWith(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.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.CodeTypes";
|
||||
config.DefinitionClass.Classname = "SaCodeTypeDbDfn";
|
||||
// Table class.
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.App");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Core");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Utils");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Dbas");
|
||||
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.CodeTypes.Internal";
|
||||
config.TableClass.ClassName_DatabaseInfo = "IDatabaseInfo";
|
||||
config.TableClass.MandatoryConstructorDbInfo = true;
|
||||
|
||||
// Generate database definition.
|
||||
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
|
||||
return generator.Generate(config);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private static String GetOutputFolder()
|
||||
{
|
||||
String fn = $"{className}.GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug($"{fn} Assembly folder: {directory}");
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
|
||||
break;
|
||||
directory = FileUtil.GetParentDirectory(directory);
|
||||
}
|
||||
if (String.IsNullOrEmpty(directory))
|
||||
{
|
||||
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
|
||||
return String.Empty;
|
||||
}
|
||||
// Code files are generated to '..\Database\Generated\CodeTypes\' folder.
|
||||
directory = Path.Combine(directory, "Database", "Generated", "CodeTypes");
|
||||
SaLogger.Debug($"{fn} Output folder: {directory}");
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {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;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Diary;
|
||||
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 (ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase Database { get; set; }
|
||||
public override bool DatabaseIsValid { get { return true; } }
|
||||
public override bool CanUpdateDatabase { get { return true; } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:13
|
||||
//---------------------------------------------------------------------------
|
||||
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 ColumnDataInt32Nullable _ProcessStatusBy { get; } = new ColumnDataInt32Nullable("ProcessStatusBy");
|
||||
public ColumnDataDateTimeNullable _ProcessStatusAt { get; } = new ColumnDataDateTimeNullable("ProcessStatusAt");
|
||||
public ColumnDataString _ItemStatus { get; } = new ColumnDataString("ItemStatus");
|
||||
public ColumnDataInt32Nullable _ItemStatusBy { get; } = new ColumnDataInt32Nullable("ItemStatusBy");
|
||||
public ColumnDataDateTimeNullable _ItemStatusAt { get; } = new ColumnDataDateTimeNullable("ItemStatusAt");
|
||||
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
|
||||
public ColumnDataInt16Nullable _Flags { get; } = new ColumnDataInt16Nullable("Flags");
|
||||
public ColumnDataDateTimeNullable _CreateOn { get; } = new ColumnDataDateTimeNullable("CreateOn");
|
||||
public ColumnDataInt32Nullable _CreateBy { get; } = new ColumnDataInt32Nullable("CreateBy");
|
||||
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
|
||||
public ColumnDataDateTimeNullable _UpdateOn { get; } = new ColumnDataDateTimeNullable("UpdateOn");
|
||||
public ColumnDataInt32Nullable _UpdateBy { get; } = new ColumnDataInt32Nullable("UpdateBy");
|
||||
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
protected 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",
|
||||
};
|
||||
protected static List<String> fieldsId { get; } = new List<String>()
|
||||
{
|
||||
};
|
||||
protected static List<String> fieldsPrimary { get; } = new List<String>()
|
||||
{
|
||||
"Id",
|
||||
};
|
||||
protected static List<String> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"ExternalRef",
|
||||
"ProcessStatus",
|
||||
"ProcessStatusBy",
|
||||
"ProcessStatusAt",
|
||||
"ItemStatus",
|
||||
"ItemStatusBy",
|
||||
"ItemStatusAt",
|
||||
"Notes",
|
||||
"Flags",
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"UpdateOn",
|
||||
"UpdateBy",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = GetFieldInt32Nullable(dbDataReader, "ProcessStatusBy", _ProcessStatusBy);
|
||||
_ProcessStatusAt = GetFieldDateTimeNullable(dbDataReader, "ProcessStatusAt", _ProcessStatusAt);
|
||||
_ItemStatus = GetFieldString(dbDataReader, "ItemStatus", _ItemStatus);
|
||||
_ItemStatusBy = GetFieldInt32Nullable(dbDataReader, "ItemStatusBy", _ItemStatusBy);
|
||||
_ItemStatusAt = GetFieldDateTimeNullable(dbDataReader, "ItemStatusAt", _ItemStatusAt);
|
||||
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
|
||||
_Flags = GetFieldInt16Nullable(dbDataReader, "Flags", _Flags);
|
||||
_CreateOn = GetFieldDateTimeNullable(dbDataReader, "CreateOn", _CreateOn);
|
||||
_CreateBy = GetFieldInt32Nullable(dbDataReader, "CreateBy", _CreateBy);
|
||||
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
|
||||
_UpdateOn = GetFieldDateTimeNullable(dbDataReader, "UpdateOn", _UpdateOn);
|
||||
_UpdateBy = GetFieldInt32Nullable(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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,229 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:13
|
||||
//---------------------------------------------------------------------------
|
||||
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 ColumnDataInt16Nullable _Flags { get; } = new ColumnDataInt16Nullable("Flags");
|
||||
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
|
||||
public ColumnDataDateTimeNullable _CreateOn { get; } = new ColumnDataDateTimeNullable("CreateOn");
|
||||
public ColumnDataInt32Nullable _CreateBy { get; } = new ColumnDataInt32Nullable("CreateBy");
|
||||
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
|
||||
public ColumnDataDateTimeNullable _UpdateOn { get; } = new ColumnDataDateTimeNullable("UpdateOn");
|
||||
public ColumnDataInt32Nullable _UpdateBy { get; } = new ColumnDataInt32Nullable("UpdateBy");
|
||||
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"ProcessId",
|
||||
"InterfaceDataItemId",
|
||||
"ItemData",
|
||||
"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>()
|
||||
{
|
||||
"ProcessId",
|
||||
"InterfaceDataItemId",
|
||||
};
|
||||
protected static List<String> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"ItemData",
|
||||
"Flags",
|
||||
"Status",
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"UpdateOn",
|
||||
"UpdateBy",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = GetFieldInt16Nullable(dbDataReader, "Flags", _Flags);
|
||||
_Status = GetFieldString(dbDataReader, "Status", _Status);
|
||||
_CreateOn = GetFieldDateTimeNullable(dbDataReader, "CreateOn", _CreateOn);
|
||||
_CreateBy = GetFieldInt32Nullable(dbDataReader, "CreateBy", _CreateBy);
|
||||
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
|
||||
_UpdateOn = GetFieldDateTimeNullable(dbDataReader, "UpdateOn", _UpdateOn);
|
||||
_UpdateBy = GetFieldInt32Nullable(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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,261 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:13
|
||||
//---------------------------------------------------------------------------
|
||||
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 ColumnDataInt32Nullable _LineNumber { get; } = new ColumnDataInt32Nullable("LineNumber");
|
||||
public ColumnDataInt16Nullable _ItemType { get; } = new ColumnDataInt16Nullable("ItemType");
|
||||
public ColumnDataInt32Nullable _ItemId { get; } = new ColumnDataInt32Nullable("ItemId");
|
||||
public ColumnDataInt16Nullable _Flags { get; } = new ColumnDataInt16Nullable("Flags");
|
||||
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
|
||||
public ColumnDataDateTimeNullable _CreateOn { get; } = new ColumnDataDateTimeNullable("CreateOn");
|
||||
public ColumnDataInt32Nullable _CreateBy { get; } = new ColumnDataInt32Nullable("CreateBy");
|
||||
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
|
||||
public ColumnDataDateTimeNullable _UpdateOn { get; } = new ColumnDataDateTimeNullable("UpdateOn");
|
||||
public ColumnDataInt32Nullable _UpdateBy { get; } = new ColumnDataInt32Nullable("UpdateBy");
|
||||
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"Id",
|
||||
"ProcessId",
|
||||
"MsgType",
|
||||
"Msg",
|
||||
"FileName",
|
||||
"LineNumber",
|
||||
"ItemType",
|
||||
"ItemId",
|
||||
"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> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"MsgType",
|
||||
"Msg",
|
||||
"FileName",
|
||||
"LineNumber",
|
||||
"ItemType",
|
||||
"ItemId",
|
||||
"Flags",
|
||||
"Status",
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"UpdateOn",
|
||||
"UpdateBy",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = GetFieldInt32Nullable(dbDataReader, "LineNumber", _LineNumber);
|
||||
_ItemType = GetFieldInt16Nullable(dbDataReader, "ItemType", _ItemType);
|
||||
_ItemId = GetFieldInt32Nullable(dbDataReader, "ItemId", _ItemId);
|
||||
_Flags = GetFieldInt16Nullable(dbDataReader, "Flags", _Flags);
|
||||
_Status = GetFieldString(dbDataReader, "Status", _Status);
|
||||
_CreateOn = GetFieldDateTimeNullable(dbDataReader, "CreateOn", _CreateOn);
|
||||
_CreateBy = GetFieldInt32Nullable(dbDataReader, "CreateBy", _CreateBy);
|
||||
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
|
||||
_UpdateOn = GetFieldDateTimeNullable(dbDataReader, "UpdateOn", _UpdateOn);
|
||||
_UpdateBy = GetFieldInt32Nullable(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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,265 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:13
|
||||
//---------------------------------------------------------------------------
|
||||
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 ColumnDataInt32Nullable _ProcSeq { get; } = new ColumnDataInt32Nullable("ProcSeq");
|
||||
public ColumnDataDateTimeNullable _ProcessAt { get; } = new ColumnDataDateTimeNullable("ProcessAt");
|
||||
public ColumnDataDateTimeNullable _BatchAt { get; } = new ColumnDataDateTimeNullable("BatchAt");
|
||||
public ColumnDataInt32Nullable _ElapseSecs { get; } = new ColumnDataInt32Nullable("ElapseSecs");
|
||||
public ColumnDataInt32Nullable _ItemCount { get; } = new ColumnDataInt32Nullable("ItemCount");
|
||||
public ColumnDataInt16Nullable _Flags { get; } = new ColumnDataInt16Nullable("Flags");
|
||||
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
|
||||
public ColumnDataDateTimeNullable _CreateOn { get; } = new ColumnDataDateTimeNullable("CreateOn");
|
||||
public ColumnDataInt32Nullable _CreateBy { get; } = new ColumnDataInt32Nullable("CreateBy");
|
||||
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
|
||||
public ColumnDataDateTimeNullable _UpdateOn { get; } = new ColumnDataDateTimeNullable("UpdateOn");
|
||||
public ColumnDataInt32Nullable _UpdateBy { get; } = new ColumnDataInt32Nullable("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> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"ProcRef",
|
||||
"ProcSeq",
|
||||
"ProcessAt",
|
||||
"BatchAt",
|
||||
"ElapseSecs",
|
||||
"ItemCount",
|
||||
"Flags",
|
||||
"Status",
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"UpdateOn",
|
||||
"UpdateBy",
|
||||
"UpdateHost",
|
||||
};
|
||||
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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = GetFieldInt32Nullable(dbDataReader, "ProcSeq", _ProcSeq);
|
||||
_ProcessAt = GetFieldDateTimeNullable(dbDataReader, "ProcessAt", _ProcessAt);
|
||||
_BatchAt = GetFieldDateTimeNullable(dbDataReader, "BatchAt", _BatchAt);
|
||||
_ElapseSecs = GetFieldInt32Nullable(dbDataReader, "ElapseSecs", _ElapseSecs);
|
||||
_ItemCount = GetFieldInt32Nullable(dbDataReader, "ItemCount", _ItemCount);
|
||||
_Flags = GetFieldInt16Nullable(dbDataReader, "Flags", _Flags);
|
||||
_Status = GetFieldString(dbDataReader, "Status", _Status);
|
||||
_CreateOn = GetFieldDateTimeNullable(dbDataReader, "CreateOn", _CreateOn);
|
||||
_CreateBy = GetFieldInt32Nullable(dbDataReader, "CreateBy", _CreateBy);
|
||||
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
|
||||
_UpdateOn = GetFieldDateTimeNullable(dbDataReader, "UpdateOn", _UpdateOn);
|
||||
_UpdateBy = GetFieldInt32Nullable(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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,246 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:13
|
||||
//---------------------------------------------------------------------------
|
||||
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 ColumnDataInt16Nullable _Category { get; } = new ColumnDataInt16Nullable("Category");
|
||||
public ColumnDataInt16Nullable _Type { get; } = new ColumnDataInt16Nullable("Type");
|
||||
public ColumnDataString _Caption { get; } = new ColumnDataString("Caption");
|
||||
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
|
||||
public ColumnDataInt16Nullable _Flags { get; } = new ColumnDataInt16Nullable("Flags");
|
||||
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
|
||||
public ColumnDataDateTimeNullable _CreateOn { get; } = new ColumnDataDateTimeNullable("CreateOn");
|
||||
public ColumnDataInt32Nullable _CreateBy { get; } = new ColumnDataInt32Nullable("CreateBy");
|
||||
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
|
||||
public ColumnDataDateTimeNullable _UpdateOn { get; } = new ColumnDataDateTimeNullable("UpdateOn");
|
||||
public ColumnDataInt32Nullable _UpdateBy { get; } = new ColumnDataInt32Nullable("UpdateBy");
|
||||
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"Id",
|
||||
"Context",
|
||||
"Code",
|
||||
"Category",
|
||||
"Type",
|
||||
"Caption",
|
||||
"Notes",
|
||||
"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> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"Context",
|
||||
"Category",
|
||||
"Type",
|
||||
"Notes",
|
||||
"Flags",
|
||||
"Status",
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"UpdateOn",
|
||||
"UpdateBy",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = GetFieldInt16Nullable(dbDataReader, "Category", _Category);
|
||||
_Type = GetFieldInt16Nullable(dbDataReader, "Type", _Type);
|
||||
_Caption = GetFieldString(dbDataReader, "Caption", _Caption);
|
||||
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
|
||||
_Flags = GetFieldInt16Nullable(dbDataReader, "Flags", _Flags);
|
||||
_Status = GetFieldString(dbDataReader, "Status", _Status);
|
||||
_CreateOn = GetFieldDateTimeNullable(dbDataReader, "CreateOn", _CreateOn);
|
||||
_CreateBy = GetFieldInt32Nullable(dbDataReader, "CreateBy", _CreateBy);
|
||||
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
|
||||
_UpdateOn = GetFieldDateTimeNullable(dbDataReader, "UpdateOn", _UpdateOn);
|
||||
_UpdateBy = GetFieldInt32Nullable(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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,395 @@
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Interfaces;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
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(ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
interfaceMgr = new SaInterfaceMgr_Dbas(this);
|
||||
}
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
if (interfaceMgr != null) interfaceMgr.Dispose(); interfaceMgr = null;
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase 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;
|
||||
}
|
||||
public override bool UpdateInterface(SaInterface interfaceObj, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!interfaceMgr.UpdateInterface(interfaceObj, dbUpdateInfo))
|
||||
return SetErrorState(interfaceMgr.ErrorStateMessage);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Clear configuration options, data items, processes etc.
|
||||
public override bool ClearDependentData(SaInterface interfaceObj, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
throw new NotImplementedException();
|
||||
//return OK;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// 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 ColumnDfn GetInterfaceColumnDfn(SaInterface.Column columnId, string caption = "", int width = 0)
|
||||
{
|
||||
return interfaceMgr.GetInterfaceColumnDfn(columnId, caption, width);
|
||||
}
|
||||
public override long GetInterfaceCount(SaInterface.Params prmInterface)
|
||||
{
|
||||
return interfaceMgr.GetInterfaceCount(prmInterface);
|
||||
}
|
||||
public override List<SaInterface> GetInterfaceList(SaInterface.Params prmInterface)
|
||||
{
|
||||
return interfaceMgr.GetInterfaceList(prmInterface);
|
||||
}
|
||||
public override DbResultSet ExecuteInterfaceQuery(List<ColumnDfn> columns, SaInterface.Params prm)
|
||||
{
|
||||
return interfaceMgr.ExecuteInterfaceQuery(columns, prm);
|
||||
}
|
||||
public override DataValue GetInterfaceDataValue(ColumnDfn column, NamedValue.Map values)
|
||||
{
|
||||
return interfaceMgr.GetInterfaceDataValue(column, values);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// 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.InterfaceTypesIncluded.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 OK;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// 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 OK;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// 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.ItemIdsIncluded.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.ItemIdsIncluded.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.ItemIdsIncluded.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.ItemIdsIncluded.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.ItemIdsIncluded.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,130 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.IO;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Base;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Interface
|
||||
{
|
||||
//=======================================================================
|
||||
public static class SaInterfaceDbDfnGenerator
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
private static String className = nameof(SaInterfaceDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = $"{className}.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, "generating Interface database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "SaInterface", "SaInterfaceProcess", "SaInterfaceProcessMessage", "SaInterfaceDataItem", "SaInterfaceProcessDataItem" });
|
||||
config.Schema.Tables_Excluded.UnionWith(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.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.Interfaces";
|
||||
config.DefinitionClass.Classname = "SaInterfaceDbDfn";
|
||||
// Table class.
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.App");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Core");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Utils");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Dbas");
|
||||
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.Interfaces.Internal";
|
||||
config.TableClass.ClassName_DatabaseInfo = "IDatabaseInfo";
|
||||
config.TableClass.MandatoryConstructorDbInfo = true;
|
||||
|
||||
// Generate database definition.
|
||||
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
|
||||
return generator.Generate(config);
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
private static String GetOutputFolder()
|
||||
{
|
||||
String fn = $"{className}.GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug(fn + " Assembly folder: " + directory);
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(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.Combine(directory, "Database", "Generated", "Interfaces");
|
||||
SaLogger.Debug($"{fn} Output folder: {directory}");
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {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,621 @@
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 item.
|
||||
dbConnection.Open();
|
||||
SaInterfaceDataItem_Db dbInterfaceDataItem = new SaInterfaceDataItem_Db(DbInfo);
|
||||
dbInterfaceDataItem.PopulateFrom(dbCommand, aliasInterfaceDataItem, "Id=" + SysId.ToString(interfaceProcessDataItem.Id));
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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.IdsIncluded.Concat(",");
|
||||
if (!includedIds.IsEmpty())
|
||||
filter.Add(colSaInterfaceDataItem_Id + " IN (" + includedIds + ")");
|
||||
String excludedIds = prm.IdsExcluded.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.ItemIdsIncluded)
|
||||
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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaInterfaceDataItem.Column.Id))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Id, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.InterfaceId))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_InterfaceId, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.Direction) || columns.HasId(SaInterfaceDataItem.Column.Direction_Desc))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Direction, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ExternalReference))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ExternalRef, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ItemType) || columns.HasId(SaInterfaceDataItem.Column.ItemType_Desc) || columns.HasId(SaInterfaceDataItem.Column.Item_Caption))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemType, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ItemId) || columns.HasId(SaInterfaceDataItem.Column.Item_Caption))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemId, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ProcessStatus))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatus, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ProcessStatusBy) || columns.HasId(SaInterfaceDataItem.Column.ProcessStatusBy_Name))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ProcessStatusBy, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ProcessStatusAt) || columns.HasId(SaInterfaceDataItem.Column.ProcessStatusAt_Date) || columns.HasId(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(SaInterfaceDataItem.Column.ItemStatus))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatus, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ItemStatusBy) || columns.HasId(SaInterfaceDataItem.Column.ItemStatusBy_Name))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_ItemStatusBy, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.ItemStatusAt) || columns.HasId(SaInterfaceDataItem.Column.ItemStatusAt_Date) || columns.HasId(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(SaInterfaceDataItem.Column.Notes))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Notes, aliasInterfaceDataItem));
|
||||
/*
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.Status) || columns.HasId(SaInterfaceDataItem.Column.Status_Desc) || columns.HasId(SaInterfaceDataItem.Column.Status_Ind))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_Status, aliasInterfaceDataItem));
|
||||
*/
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_CreateOn, aliasInterfaceDataItem));
|
||||
if (columns.HasId(SaInterfaceDataItem.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceDataItem_UpdateOn, aliasInterfaceDataItem));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetInterfaceDataItemQueryFilter(prm));
|
||||
|
||||
if (prm.IdsIncluded.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,487 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Interfaces;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
SaInterfaceProcessMessage_Db dbInterfaceProcessMessage = new SaInterfaceProcessMessage_Db(DbInfo);
|
||||
dbInterfaceProcessMessage.PopulateFrom(dbCommand, aliasInterfaceProcessMessage, "Id=" + SysId.ToString(interfaceProcessMessage.Id));
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 ?? 0;
|
||||
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.IdsIncluded.Concat(",");
|
||||
if (!includedIds.IsEmpty())
|
||||
filter.Add(colId + " IN (" + includedIds + ")");
|
||||
String excludedIds = prm.IdsExcluded.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.ItemIdsIncluded)
|
||||
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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaInterfaceProcessMessage.Column.Id))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Id, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.ProcessId))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ProcessId, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.Level) || columns.HasId(SaInterfaceProcessMessage.Column.Level_Desc))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_MsgType, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.Message))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Msg, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.Filename))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_FileName, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.LineNumber))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_LineNumber, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.ItemType) || columns.HasId(SaInterfaceProcessMessage.Column.ItemType_Desc) || columns.HasId(SaInterfaceProcessMessage.Column.Item_Caption))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemType, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.ItemId) || columns.HasId(SaInterfaceProcessMessage.Column.Item_Caption))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_ItemId, aliasInterfaceProcessMessage));
|
||||
/*
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.Notes))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Notes, aliasInterfaceProcessMessage));
|
||||
*/
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.Status) || columns.HasId(SaInterfaceProcessMessage.Column.Status_Desc) || columns.HasId(SaInterfaceProcessMessage.Column.Status_Ind))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_Status, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_CreateOn, aliasInterfaceProcessMessage));
|
||||
if (columns.HasId(SaInterfaceProcessMessage.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcessMessage_UpdateOn, aliasInterfaceProcessMessage));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetInterfaceProcessMessageQueryFilter(prm));
|
||||
|
||||
if (prm.IdsIncluded.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,831 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Interfaces;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
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 ?? 0, (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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete Item.
|
||||
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 OK;
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
SaInterfaceProcess_Db dbInterfaceProcess = new SaInterfaceProcess_Db_Local(DbInfo);
|
||||
dbInterfaceProcess.PopulateFrom(dbCommand, aliasInterfaceProcess, "Id=" + SysId.ToString(interfaceProcess.Id));
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 ?? 0;
|
||||
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.IdsIncluded.Concat(",");
|
||||
if (!includedIds.IsEmpty())
|
||||
filter.Add(colInterfaceProcess_Id + " IN (" + includedIds + ")");
|
||||
String excludedIds = prm.IdsExcluded.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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaInterfaceProcess.Column.Id))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Id, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.InterfaceId))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_InterfaceId, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.ProcessDirection) || columns.HasId(SaInterfaceProcess.Column.ProcessDirection_Desc))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Direction, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.ProcessReference))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcRef, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.ProcessSequence))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ProcSeq, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.ProcessAt) || columns.HasId(SaInterfaceProcess.Column.ProcessAt_Date) || columns.HasId(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(SaInterfaceProcess.Column.BatchAt) || columns.HasId(SaInterfaceProcess.Column.BatchAt_Date) || columns.HasId(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(SaInterfaceProcess.Column.Elapsed_Secs) || columns.HasId(SaInterfaceProcess.Column.Elapsed_Fmt))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_ElapseSecs, aliasInterfaceProcess));
|
||||
/*
|
||||
if (columns.HasId(SaInterfaceProcess.Column.Notes))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Notes, aliasInterfaceProcess));
|
||||
*/
|
||||
if (columns.HasId(SaInterfaceProcess.Column.Status) || columns.HasId(SaInterfaceProcess.Column.Status_Desc) || columns.HasId(SaInterfaceProcess.Column.Status_Ind))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_Status, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_CreateOn, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_UpdateOn, aliasInterfaceProcess));
|
||||
if (columns.HasId(SaInterfaceProcess.Column.UpdateHost))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterfaceProcess_UpdateHost, aliasInterfaceProcess));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Interface properties.
|
||||
bool hasInterfaceCols =
|
||||
(columns.HasId(SaInterfaceProcess.Column.Interface_Context) ||
|
||||
columns.HasId(SaInterfaceProcess.Column.Interface_Category) ||
|
||||
columns.HasId(SaInterfaceProcess.Column.Interface_Category_Desc) ||
|
||||
columns.HasId(SaInterfaceProcess.Column.Interface_Type) ||
|
||||
columns.HasId(SaInterfaceProcess.Column.Interface_Type_Desc) ||
|
||||
columns.HasId(SaInterfaceProcess.Column.Interface_Code) ||
|
||||
columns.HasId(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(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(SaInterfaceProcess.Column.Message_Status_Desc) || columns.HasId(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(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.IdsIncluded.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,599 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Interfaces;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
using Sarand.Net.Standard.Dbas.Interfaces.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
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 ?? 0, (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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 item.
|
||||
dbConnection.Open();
|
||||
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
|
||||
dbInterface.PopulateFrom(dbCommand, aliasInterface, "Id=" + SysId.ToString(interfaceObj.Id));
|
||||
// Update item.
|
||||
PopulateTo(dbInterface, interfaceObj, dbUpdateInfo);
|
||||
dbInterface.ExecuteUpdateCommand(dbCommand);
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 item.
|
||||
dbConnection.Open();
|
||||
SaInterface_Db dbInterface = new SaInterface_Db(DbInfo);
|
||||
dbInterface.PopulateFrom(dbCommand, aliasInterface, "Id=" + SysId.ToString(interfaceObj.Id));
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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.IdsIncluded.Concat(",");
|
||||
if (!includedIds.IsEmpty())
|
||||
filter.Add(colId + " IN (" + includedIds + ")");
|
||||
String excludedIds = prm.IdsExcluded.Concat(",");
|
||||
if (!excludedIds.IsEmpty())
|
||||
filter.Add(colId + " NOT IN (" + excludedIds + ")");
|
||||
|
||||
String colContext = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Context, aliasInterface);
|
||||
String colCode = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, aliasInterface);
|
||||
String colCaption = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption, aliasInterface);
|
||||
String colNotes = SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Notes, aliasInterface);
|
||||
|
||||
// Generic search.
|
||||
if (!StringUtil.IsBlank(prm.Search))
|
||||
{
|
||||
foreach (String search in Regex.Split(prm.Search, "[\\s,;\\-+]+"))
|
||||
{
|
||||
if (StringUtil.IsBlank(search)) continue;
|
||||
String searchForLike = DbQuery.FormatForLike(search, true);
|
||||
List<String> searchFilter = new List<string>();
|
||||
searchFilter.Add($"{colContext} LIKE '%{searchForLike}%'");
|
||||
searchFilter.Add($"{colCode} LIKE '%{searchForLike}%'");
|
||||
searchFilter.Add($"{colCaption} LIKE '%{searchForLike}%'");
|
||||
searchFilter.Add($"{colNotes} LIKE '%{searchForLike}%'");
|
||||
filter.Add(searchFilter.Concat(" OR ", "(", ")"));
|
||||
}
|
||||
}
|
||||
|
||||
// Context.
|
||||
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.InterfaceTypesIncluded.Count > 0)
|
||||
filter.Add(colType + " In (" + String.Join(",", prm.InterfaceTypesIncluded) + ")");
|
||||
|
||||
// Code.
|
||||
if (!StringUtil.IsEmpty(prm.Code))
|
||||
filter.Add(colCode + "='" + DbQuery.FormatForCondition(prm.Code) + "'");
|
||||
|
||||
// Caption.
|
||||
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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaInterface.Column.Id))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Id, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Context) || columns.HasId(SaInterface.Column.Type_Desc))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Context, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Category) || columns.HasId(SaInterface.Column.Category_Desc) || columns.HasId(SaInterface.Column.Type_Desc))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Category, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Type) || columns.HasId(SaInterface.Column.Type_Desc))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Type, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Code))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Code, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Caption))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Caption, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Active_Y) || columns.HasId(SaInterface.Column.Active_TickCross) || columns.HasId(SaInterface.Column.Active_Ind))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Flags, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Notes))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Notes, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.Status) || columns.HasId(SaInterface.Column.Status_Desc) || columns.HasId(SaInterface.Column.Status_Ind))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_Status, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_CreateOn, aliasInterface));
|
||||
if (columns.HasId(SaInterface.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaInterfaceDbDfn.GetColumnNameQual(SaInterfaceDbDfn.ColumnIdx.SaInterface_UpdateOn, aliasInterface));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Process count.
|
||||
if (columns.HasId(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(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.IdsIncluded.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,82 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
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 ISacsDatabase 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,185 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
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 System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// 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)
|
||||
{
|
||||
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($"{SysUtil.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($"{SysUtil.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 ?? DateTime.MinValue));
|
||||
SacsDatabase.AddValuePair(columnValues, colNameProcTime, DateUtil.TimeToInt32(_ProcessAt ?? DateTime.MinValue));
|
||||
}
|
||||
if (colExists_BatchDate && colExists_BatchTime)
|
||||
{
|
||||
SacsDatabase.AddValuePair(columnValues, colNameBatchDate, DateUtil.DateToInt32(_BatchAt ?? DateTime.MinValue));
|
||||
SacsDatabase.AddValuePair(columnValues, colNameBatchTime, DateUtil.TimeToInt32(_BatchAt ?? DateTime.MinValue));
|
||||
}
|
||||
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 ?? DateTime.MinValue));
|
||||
SacsDatabase.AddValuePair(columnValues, colNameProcTime, DateUtil.TimeToInt32(_ProcessAt ?? DateTime.MinValue));
|
||||
}
|
||||
if (colExists_BatchDate && colExists_BatchTime)
|
||||
{
|
||||
SacsDatabase.AddValuePair(columnValues, colNameBatchDate, DateUtil.DateToInt32(_BatchAt ?? DateTime.MinValue));
|
||||
SacsDatabase.AddValuePair(columnValues, colNameBatchTime, DateUtil.TimeToInt32(_BatchAt ?? DateTime.MinValue));
|
||||
}
|
||||
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,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 (ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
itemDataMgr = new SaItemDataMgr_Dbas(this);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase 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 OK;
|
||||
}
|
||||
public override bool Remove (SaItemData itemData, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!itemDataMgr.DeleteItemData(itemData, dbUpdateInfo))
|
||||
return SetErrorState(itemDataMgr.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
public override bool ClearItemData (ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!itemDataMgr.ClearItemData(itemId, dbUpdateInfo))
|
||||
return SetErrorState(itemDataMgr.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
public override bool ClearItemData (ItemId itemId, String dataType, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!itemDataMgr.ClearItemData(itemId, dataType, dbUpdateInfo))
|
||||
return SetErrorState(itemDataMgr.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
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 className = nameof(SaItemDataDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = className + ".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, "generating database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "SaItemData" });
|
||||
config.Schema.Tables_Excluded.UnionWith(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 = className + ".GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug($"{fn} Assembly folder: {directory}");
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
|
||||
break;
|
||||
directory = FileUtil.GetParentDirectory(directory);
|
||||
}
|
||||
if (String.IsNullOrEmpty(directory))
|
||||
{
|
||||
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
|
||||
return String.Empty;
|
||||
}
|
||||
// Code files are generated to '..\Database\Generated\ItemData\' folder.
|
||||
directory = Path.Combine(directory, "Database", "Generated", "ItemData");
|
||||
SaLogger.Debug(fn + " Output folder: " + directory);
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {directory}");
|
||||
return String.Empty;
|
||||
}
|
||||
return directory;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,579 @@
|
||||
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 ISacsDatabase 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.ItemIdsIncluded.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.ItemIdsIncluded.Add(itemId);
|
||||
prmItemData.DataTypesIncluded.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.IdsIncluded.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.ItemIdsIncluded.Add(itemId);
|
||||
prmItemData.DataTypesIncluded.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.IdsIncluded.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.ItemIdsIncluded.Add(itemId);
|
||||
prmItemData.DataTypesIncluded.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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
||||
dbItemData.PopulateFrom(dbCommand, aliasItemData, aliasItemData + ".Id=" + SysId.ToString(itemData.Id));
|
||||
// Update item.
|
||||
PopulateTo(dbItemData, itemData, dbUpdateInfo);
|
||||
dbItemData.ExecuteUpdateCommand(dbCommand);
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
||||
dbItemData.PopulateFrom(dbCommand, aliasItemData, aliasItemData + ".Id=" + SysId.ToString(itemData.Id));
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
public override bool ClearItemData(ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return SetErrorState(ErrorMessage.ItemIdNotSpecified);
|
||||
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 OK;
|
||||
}
|
||||
public override bool ClearItemData(ItemId itemId, String dataType, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return SetErrorState(ErrorMessage.ItemIdNotSpecified);
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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.IdsIncluded.Concat(",");
|
||||
if (!includedIds.IsEmpty())
|
||||
filter.Add(colId + " IN (" + includedIds + ")");
|
||||
String excludedIds = prm.IdsExcluded.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.ItemIdsIncluded)
|
||||
{
|
||||
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.DataTypesIncluded)
|
||||
{
|
||||
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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaItemData.Column.Id))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Id, aliasItemData));
|
||||
if (columns.HasId(SaItemData.Column.ItemType) || columns.HasId(SaItemData.Column.ItemType_Desc))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasItemData));
|
||||
if (columns.HasId(SaItemData.Column.ItemId))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasItemData));
|
||||
if (columns.HasId(SaItemData.Column.DataType))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasItemData));
|
||||
if (columns.HasId(SaItemData.Column.ItemData))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemData, aliasItemData));
|
||||
if (columns.HasId(SaItemData.Column.Notes))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Notes, aliasItemData));
|
||||
if (columns.HasId(SaItemData.Column.Status) || columns.HasId(SaItemData.Column.Status_Desc) || columns.HasId(SaItemData.Column.Status_Ind))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Status, aliasItemData));
|
||||
if (columns.HasId(SaItemData.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_CreateOn, aliasItemData));
|
||||
if (columns.HasId(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,247 @@
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
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.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,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(ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
itemDocMgr = new SaItemDocMgr_Dbas(this);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase 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 OK;
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
public override bool ClearItemDocs(ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!itemDocMgr.ClearItemDocs(itemId, dbUpdateInfo))
|
||||
return SetErrorState(itemDocMgr.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
public override bool ClearItemDocs(ItemId itemId, Category category, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!itemDocMgr.ClearItemDocs(itemId, category, dbUpdateInfo))
|
||||
return SetErrorState(itemDocMgr.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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.ItemIdsIncluded.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.ItemIdsIncluded.UnionWith(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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,623 @@
|
||||
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 ISacsDatabase 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.ItemIdsIncluded.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.ItemIdsIncluded.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.IdsIncluded.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.IdsIncluded.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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
|
||||
dbItemDoc.PopulateFrom(dbCommand, aliasItemDoc, aliasItemDoc + ".Id=" + SysId.ToString(itemDoc.Id));
|
||||
// Update item.
|
||||
PopulateTo(dbItemDoc, itemDoc, dbUpdateInfo);
|
||||
dbItemDoc.ExecuteUpdateCommand(dbCommand);
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
SaItemDoc_Db dbItemDoc = new SaItemDoc_Db(DbInfo);
|
||||
dbItemDoc.PopulateFrom(dbCommand, aliasItemDoc, aliasItemDoc + ".Id=" + SysId.ToString(itemDoc.Id));
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
public override bool ClearItemDocs (ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return SetErrorState(ErrorMessage.ItemIdNotSpecified);
|
||||
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 OK;
|
||||
}
|
||||
public override bool ClearItemDocs (ItemId itemId, SaItemDocConsole.Category category, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return SetErrorState(ErrorMessage.ItemIdNotSpecified);
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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.IdsIncluded.Concat(",");
|
||||
if (!includedIds.IsEmpty())
|
||||
filter.Add(colId + " IN (" + includedIds + ")");
|
||||
String excludedIds = prm.IdsExcluded.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.ItemIdsIncluded)
|
||||
{
|
||||
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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaItemDoc.Column.Id))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Id, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.ItemType) || columns.HasId(SaItemDoc.Column.ItemType_Desc))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemType, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.ItemId))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_ItemId, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.Category) || columns.HasId(SaItemDoc.Column.Category_Desc))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Category, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.DocType) || columns.HasId(SaItemDoc.Column.DocType_Desc))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Type, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.DescBrief))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_DescBrief, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.Folder))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Folder, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.Filename))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Filename, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.MimeType))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_MimeType, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.Notes))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Notes, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.Status) || columns.HasId(SaItemDoc.Column.Status_Desc) || columns.HasId(SaItemDoc.Column.Status_Ind))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_Status, aliasItemDoc));
|
||||
if (columns.HasId(SaItemDoc.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaItemDocsDbDfn.GetColumnNameQual(SaItemDocsDbDfn.ColumnIdx.SaItemDoc_CreateOn, aliasItemDoc));
|
||||
if (columns.HasId(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,117 @@
|
||||
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 className = nameof(SaItemDocsDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = className + ".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, "generating database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "SaItemDoc" });
|
||||
config.Schema.Tables_Excluded.UnionWith(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.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.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 = className + ".GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug($"{fn} Assembly folder: " + directory);
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
|
||||
break;
|
||||
directory = FileUtil.GetParentDirectory(directory);
|
||||
}
|
||||
if (String.IsNullOrEmpty(directory))
|
||||
{
|
||||
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
|
||||
return String.Empty;
|
||||
}
|
||||
// Code files are generated to '..\Database\Generated\ItemDocs\' folder.
|
||||
directory = Path.Combine(directory, "Database", "Generated", "ItemDocs");
|
||||
SaLogger.Debug($"{fn} Output folder: {directory}");
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {directory}");
|
||||
return String.Empty;
|
||||
}
|
||||
return directory;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,236 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:12
|
||||
//---------------------------------------------------------------------------
|
||||
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.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"ItemType",
|
||||
"ItemId",
|
||||
"Name",
|
||||
"Context",
|
||||
"Value",
|
||||
"Notes",
|
||||
"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>()
|
||||
{
|
||||
"ItemType",
|
||||
"ItemId",
|
||||
"Name",
|
||||
"Context",
|
||||
};
|
||||
protected static List<String> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"CreateHost",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
|
||||
{
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"ItemType",
|
||||
"ItemId",
|
||||
"Name",
|
||||
"Context",
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
internal SaItemOption_Db (IDatabaseInfo dbInfo) : 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,187 @@
|
||||
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(ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
itemOptionMgr = new SaItemOptionMgr_Dbas(this);
|
||||
}
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
if (itemOptionMgr != null) itemOptionMgr.Dispose(); itemOptionMgr = null;
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase 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,567 @@
|
||||
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 ISacsDatabase 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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 item.
|
||||
dbConnection.Open();
|
||||
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
|
||||
dbItemOption.PopulateFrom(dbCommand, aliasItemOption, GetItemOptionFilter(itemOption));
|
||||
// Update item.
|
||||
PopulateTo(dbItemOption, itemOption, dbUpdateInfo);
|
||||
dbItemOption.ExecuteUpdateCommand(dbCommand);
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 item.
|
||||
dbConnection.Open();
|
||||
SaItemOption_Db dbItemOption = new SaItemOption_Db(DbInfo);
|
||||
dbItemOption.PopulateFrom(dbCommand, aliasItemOption, GetItemOptionFilter(itemOption));
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
public override bool ClearItemOptionsForItem (ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return SetErrorState(ErrorMessage.ItemIdNotSpecified);
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaItemOption.Column.ItemType) || columns.HasId(SaItemOption.Column.ItemType_Desc))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemType, aliasItemOption));
|
||||
if (columns.HasId(SaItemOption.Column.ItemId))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_ItemId, aliasItemOption));
|
||||
if (columns.HasId(SaItemOption.Column.Name) || columns.HasId(SaItemOption.Column.Name))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Name, aliasItemOption));
|
||||
if (columns.HasId(SaItemOption.Column.Context) || columns.HasId(SaItemOption.Column.Context))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Context, aliasItemOption));
|
||||
if (columns.HasId(SaItemOption.Column.Value) || columns.HasId(SaItemOption.Column.Value_Display))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Value, aliasItemOption));
|
||||
if (columns.HasId(SaItemOption.Column.Notes))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Notes, aliasItemOption));
|
||||
if (columns.HasId(SaItemOption.Column.Status) || columns.HasId(SaItemOption.Column.Status_Desc) || columns.HasId(SaItemOption.Column.Status_Ind))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_Status, aliasItemOption));
|
||||
if (columns.HasId(SaItemOption.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaItemOptionDbDfn.GetColumnNameQual(SaItemOptionDbDfn.ColumnIdx.SaItemOption_CreateOn, aliasItemOption));
|
||||
if (columns.HasId(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,119 @@
|
||||
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 className = nameof(SaItemOptionsDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = className + ".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, "generating database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "SaItemOption" });
|
||||
config.Schema.Tables_Excluded.UnionWith(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.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.ItemOptions";
|
||||
config.DefinitionClass.Classname = "SaItemOptionDbDfn";
|
||||
// Table class.
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.App");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Core");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Utils");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Dbas");
|
||||
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.ItemOptions.Internal";
|
||||
config.TableClass.ClassName_DatabaseInfo = "IDatabaseInfo";
|
||||
config.TableClass.MandatoryConstructorDbInfo = true;
|
||||
|
||||
// Generate database definition.
|
||||
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
|
||||
return generator.Generate(config);
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
private static String GetOutputFolder()
|
||||
{
|
||||
String fn = className + ".GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug($"{fn} Assembly folder: {directory}");
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
|
||||
break;
|
||||
directory = FileUtil.GetParentDirectory(directory);
|
||||
}
|
||||
if (String.IsNullOrEmpty(directory))
|
||||
{
|
||||
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
|
||||
return String.Empty;
|
||||
}
|
||||
// Code files are generated to '..\Database\Generated\ItemOptions\' folder.
|
||||
directory = Path.Combine(directory, "Database", "Generated", "ItemOptions");
|
||||
SaLogger.Debug($"{fn} Output folder: {directory}");
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {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 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,206 @@
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
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.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,211 @@
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
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.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);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
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.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,272 @@
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
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.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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data console - Currencies.
|
||||
//=======================================================================
|
||||
partial class SaReferenceDataConsole_Dbas
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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 Item.
|
||||
public override SaCurrency GetCurrency(SaCurrency.Params prmCurrency)
|
||||
{
|
||||
return referenceDataMgr.GetCurrency(prmCurrency);
|
||||
}
|
||||
|
||||
// Item 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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data console - Languages.
|
||||
//=======================================================================
|
||||
partial class SaReferenceDataConsole_Dbas
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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 Item.
|
||||
public override SaLanguage GetLanguage(SaLanguage.Params prmLanguage)
|
||||
{
|
||||
return referenceDataMgr.GetLanguage(prmLanguage);
|
||||
}
|
||||
|
||||
// Item 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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data console - Regions.
|
||||
//=======================================================================
|
||||
partial class SaReferenceDataConsole_Dbas
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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 Item.
|
||||
public override SaRegion GetRegion(SaRegion.Params prmRegion)
|
||||
{
|
||||
return referenceDataMgr.GetRegion(prmRegion);
|
||||
}
|
||||
|
||||
// Item 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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data console - Tax Codes.
|
||||
//=======================================================================
|
||||
partial class SaReferenceDataConsole_Dbas
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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 Item.
|
||||
public override SaTaxCode GetTaxCode (SaTaxCode.Params prmTaxCode)
|
||||
{
|
||||
return referenceDataMgr.GetTaxCode(prmTaxCode);
|
||||
}
|
||||
|
||||
// Item 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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data console - Units of Measure.
|
||||
//=======================================================================
|
||||
partial class SaReferenceDataConsole_Dbas
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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 Item.
|
||||
public override SaUnitMeasure GetUnitMeasure(SaUnitMeasure.Params prmUnitMeasure)
|
||||
{
|
||||
return referenceDataMgr.GetUnitMeasure(prmUnitMeasure);
|
||||
}
|
||||
|
||||
// Item 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,92 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.ReferenceData;
|
||||
using Sarand.Net.Standard.Dbas.Base;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.ReferenceData
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data console.
|
||||
//=======================================================================
|
||||
public abstract partial class SaReferenceDataConsole_Dbas : SaReferenceDataConsole
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Definitions.
|
||||
private SaReferenceDataMgr_Dbas referenceDataMgr = null;
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Static initialisation.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
protected SaReferenceDataConsole_Dbas(ISacsDatabase database) :
|
||||
base()
|
||||
{
|
||||
Database = database;
|
||||
referenceDataMgr = new SaReferenceDataMgr_Dbas(this);
|
||||
}
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase 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 (interactive applicaton only, eg. desktop) - 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 virtual MaintainReferenceDataFunction MaintainReferenceDataFn => null;
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Initialisation data - default population.
|
||||
|
||||
public List<RegionInitData> GetRegionInitialisationList()
|
||||
{
|
||||
List<RegionInitData> regions = new List<RegionInitData>();
|
||||
List<TypeCodeDesc> currencyCodes = GetReferenceDataCodes(ReferenceDataSystemCode.CurrencyCode);
|
||||
|
||||
// Europe.
|
||||
regions.Add(new RegionInitData()
|
||||
{
|
||||
Type = SaRegionType.Continent,
|
||||
Name = "Europe"
|
||||
});
|
||||
|
||||
// United Kingdom.
|
||||
regions.Add(new RegionInitData()
|
||||
{
|
||||
Type = SaRegionType.Country,
|
||||
Name = "United Kingdom",
|
||||
CurrencyCode = currencyCodes.GetCodeForType(SaCurrencyCode.Sterling),
|
||||
ParentType = SaRegionType.Continent,
|
||||
ParentName = "Europe"
|
||||
});
|
||||
|
||||
return regions;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
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 className = nameof(SaReferenceDataDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = className + ".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, "generating database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "Language", "Region", "Currency", "TaxCode", "UnitMeasure" });
|
||||
config.Schema.Tables_Excluded.UnionWith(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 = className + ".GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug($"{fn} Assembly folder: {directory}");
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
|
||||
break;
|
||||
directory = FileUtil.GetParentDirectory(directory);
|
||||
}
|
||||
if (String.IsNullOrEmpty(directory))
|
||||
{
|
||||
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
|
||||
return String.Empty;
|
||||
}
|
||||
// Code files are generated to '..\Dbas\Generated\ReferenceData\' folder.
|
||||
directory = Path.Combine(directory, "Database", "Generated", "ReferenceData");
|
||||
SaLogger.Debug($"{fn} Output folder: {directory}");
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data manager - Currencies.
|
||||
//=======================================================================
|
||||
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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(ErrorMessage.MultipleItemsFound);
|
||||
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(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
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 item.
|
||||
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 item.
|
||||
PopulateTo(dbCurrency, currency, dbUpdateInfo);
|
||||
dbCurrency.ExecuteUpdateCommand(dbCommand);
|
||||
// Record updates.
|
||||
updateLogMonitor.RecordUpdatedValues(currency);
|
||||
updateLogMonitor.LogUpdates();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
Currency_Db dbCurrency = new Currency_Db(DbInfo);
|
||||
dbCurrency.PopulateFrom(dbCommand, aliasCurrency, "Id=" + currency.Id.ToString());
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = (short)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 = (ushort)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);
|
||||
if (prm.IdsIncluded.HasValidIds())
|
||||
filter.Add($"{colCurrency_Id} IN ({prm.IdsIncluded.Concat(",")})");
|
||||
if (prm.IdsExcluded.HasValidIds())
|
||||
filter.Add($"{colCurrency_Id} NOT IN ({prm.IdsExcluded.Concat(",")})");
|
||||
|
||||
// Code.
|
||||
String colCurrency_Code = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Code, aliasCurrency);
|
||||
if (!StringUtil.IsBlank(prm.Code))
|
||||
filter.Add($"{colCurrency_Code}='{DbQuery.FormatForCondition(prm.Code)}'");
|
||||
else if (!StringUtil.IsBlank(prm.CodePartial))
|
||||
filter.Add($"{colCurrency_Code} LIKE '%{DbQuery.FormatForLike(prm.CodePartial)}%'");
|
||||
|
||||
// Name.
|
||||
String colCurrency_Name = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Currency_Name, aliasCurrency);
|
||||
if (!StringUtil.IsBlank(prm.Name))
|
||||
filter.Add($"{colCurrency_Name}='{DbQuery.FormatForCondition(prm.Name)}'");
|
||||
else if (!StringUtil.IsBlank(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.ToLong(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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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.IdsIncluded.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,525 @@
|
||||
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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data manager - Languages.
|
||||
//=======================================================================
|
||||
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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(ErrorMessage.MultipleItemsFound);
|
||||
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(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 item.
|
||||
public override bool IsValidLanguageData(SaLanguage.Data data, SaLanguage.ErrField errField)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.IsValidLanguageData(data, errField)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Insert item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
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 item.
|
||||
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 item.
|
||||
PopulateTo(dbLanguage, language, dbUpdateInfo);
|
||||
dbLanguage.ExecuteUpdateCommand(dbCommand);
|
||||
// Record updates.
|
||||
updateLogMonitor.RecordUpdatedValues(language);
|
||||
updateLogMonitor.LogUpdates();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
Language_Db dbLanguage = new Language_Db(DbInfo);
|
||||
dbLanguage.PopulateFrom(dbCommand, aliasLanguage, "Id=" + language.Id.ToString());
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 colId = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage);
|
||||
if (prm.IdsIncluded.HasValidIds())
|
||||
filter.Add($"{colId} IN ({prm.IdsIncluded.Concat(",")})");
|
||||
if (prm.IdsExcluded.HasValidIds())
|
||||
filter.Add($"{colId} NOT IN ({prm.IdsExcluded.Concat(",")})");
|
||||
|
||||
// Code.
|
||||
String colCode = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage);
|
||||
if (!StringUtil.IsBlank(prm.Code))
|
||||
filter.Add($"{colCode}='{DbQuery.FormatForCondition(prm.Code)}'");
|
||||
else if (!StringUtil.IsBlank(prm.CodePartial))
|
||||
filter.Add($"{colCode} LIKE '%{DbQuery.FormatForLike(prm.CodePartial)}%'");
|
||||
|
||||
// Name.
|
||||
String colName = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage);
|
||||
if (!StringUtil.IsBlank(prm.Name))
|
||||
filter.Add($"{colName}='{DbQuery.FormatForCondition(prm.Name)}'");
|
||||
else if (!StringUtil.IsBlank(prm.NamePartial))
|
||||
filter.Add($"{colName} LIKE '%{DbQuery.FormatForLike(prm.NamePartial)}%'");
|
||||
|
||||
// Lang Primary Id.
|
||||
if (SysId.IsValid(prm.LanguageIdPrimary))
|
||||
filter.Add($"{SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Primary, aliasLanguage)}={SysId.ToLong(prm.LanguageIdPrimary)}");
|
||||
|
||||
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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaLanguage.Column.Id))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Id, aliasLanguage));
|
||||
if (columns.HasId(SaLanguage.Column.Code))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Code, aliasLanguage));
|
||||
if (columns.HasId(SaLanguage.Column.Name))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Name, aliasLanguage));
|
||||
if (columns.HasId(SaLanguage.Column.LanguageIdPrimary))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Primary, aliasLanguage));
|
||||
if (columns.HasId(SaLanguage.Column.Unicode))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Unicode, aliasLanguage));
|
||||
if (columns.HasId(SaLanguage.Column.Translation))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Translation, aliasLanguage));
|
||||
|
||||
//Common Properties.
|
||||
/*
|
||||
if (columns.HasId(SaLanguage.Column.Notes))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Notes, aliasLanguage));
|
||||
if (columns.HasId(SaLanguage.Column.Status) || columns.HasId(SaLanguage.Column.Status_Desc) || columns.HasId(SaLanguage.Column.Status_Ind))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_Status, aliasLanguage));
|
||||
*/
|
||||
if (columns.HasId(SaLanguage.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_CreateOn, aliasLanguage));
|
||||
if (columns.HasId(SaLanguage.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Language_UpdateOn, aliasLanguage));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetLanguageQueryFilter(prm));
|
||||
|
||||
if (prm.IdsIncluded.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,496 @@
|
||||
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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data manager - Regions.
|
||||
//=======================================================================
|
||||
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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(ErrorMessage.MultipleItemsFound);
|
||||
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(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 item.
|
||||
public override bool IsValidRegionData(SaRegion.Data data, SaRegion.ErrField errField)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.IsValidRegionData(data, errField)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Insert item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
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 item.
|
||||
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 item.
|
||||
PopulateTo(dbRegion, region, dbUpdateInfo);
|
||||
dbRegion.ExecuteUpdateCommand(dbCommand);
|
||||
// Record updates.
|
||||
updateLogMonitor.RecordUpdatedValues(region);
|
||||
updateLogMonitor.LogUpdates();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
Region_Db dbRegion = new Region_Db(DbInfo);
|
||||
dbRegion.PopulateFrom(dbCommand, aliasRegion, "Id=" + region.Id.ToString());
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = "aRgn";
|
||||
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 colId = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Id, aliasRegion);
|
||||
if (prm.IdsIncluded.HasValidIds())
|
||||
filter.Add($"{colId} IN ({prm.IdsIncluded.Concat(",")})");
|
||||
if (prm.IdsExcluded.HasValidIds())
|
||||
filter.Add($"{colId} NOT IN ({prm.IdsExcluded.Concat(",")})");
|
||||
|
||||
// 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, aliasRegion)}={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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaRegion.Column.Id))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Id, aliasRegion));
|
||||
if (columns.HasId(SaRegion.Column.Type))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Type, aliasRegion));
|
||||
if (columns.HasId(SaRegion.Column.Name))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Name, aliasRegion));
|
||||
if (columns.HasId(SaRegion.Column.Parent))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Parent, aliasRegion));
|
||||
|
||||
// Common Properties
|
||||
if (columns.HasId(SaRegion.Column.Notes))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Notes, aliasRegion));
|
||||
if (columns.HasId(SaRegion.Column.Status) || columns.HasId(SaRegion.Column.Status_Desc) || columns.HasId(SaRegion.Column.Status_Ind))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_Status, aliasRegion));
|
||||
if (columns.HasId(SaRegion.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_CreateOn, aliasRegion));
|
||||
if (columns.HasId(SaRegion.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.Region_UpdateOn, aliasRegion));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetRegionQueryFilter(prm));
|
||||
|
||||
if (prm.IdsIncluded.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,551 @@
|
||||
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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data manager - Tax Codes.
|
||||
//=======================================================================
|
||||
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Create Item.
|
||||
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);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Item 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 Item.
|
||||
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(ErrorMessage.MultipleItemsFound);
|
||||
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(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 Item.
|
||||
public override bool IsValidTaxCodeData(SaTaxCode.Data data, SaTaxCode.ErrField errField)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.IsValidTaxCodeData(data, errField)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Insert Item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update Item.
|
||||
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 item.
|
||||
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 item.
|
||||
PopulateTo(dbTaxCode, taxCode, dbUpdateInfo);
|
||||
dbTaxCode.ExecuteUpdateCommand(dbCommand);
|
||||
// Record updates.
|
||||
updateLogMonitor.RecordUpdatedValues(taxCode);
|
||||
updateLogMonitor.LogUpdates();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete Item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
TaxCode_Db dbTaxCode = new TaxCode_Db(DbInfo);
|
||||
dbTaxCode.PopulateFrom(dbCommand, aliasTaxCode, "Id=" + taxCode.Id.ToString());
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Copy Item 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();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Item 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);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Item 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;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Item query filter.
|
||||
public override List<string> GetTaxCodeQueryFilter(SaTaxCode.Params prm)
|
||||
{
|
||||
List<String> filter = new List<String>();
|
||||
|
||||
// TaxCode Id.
|
||||
String colId = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Id, aliasTaxCode);
|
||||
if (prm.IdsIncluded.HasValidIds())
|
||||
filter.Add($"{colId} IN ({prm.IdsIncluded.Concat(",")})");
|
||||
if (prm.IdsExcluded.HasValidIds())
|
||||
filter.Add($"{colId} NOT IN ({prm.IdsExcluded.Concat(",")})");
|
||||
|
||||
// Code.
|
||||
String colCode = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, aliasTaxCode);
|
||||
if (!StringUtil.IsBlank(prm.Code))
|
||||
filter.Add($"{colCode}='{DbQuery.FormatForCondition(prm.Code)}'");
|
||||
if (!StringUtil.IsBlank(prm.CodePartial))
|
||||
filter.Add($"{colCode} LIKE '%{DbQuery.FormatForLike(prm.CodePartial)}%'");
|
||||
|
||||
// Code Alt 1.
|
||||
if (!StringUtil.IsBlank(prm.CodeAlt1))
|
||||
filter.Add($"{SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt1, aliasTaxCode)}='{DbQuery.FormatForCondition(prm.CodeAlt1)}'");
|
||||
|
||||
// Code Alt 2.
|
||||
if (!StringUtil.IsBlank(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)}");
|
||||
|
||||
// Effect On.
|
||||
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.IsBlank(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;
|
||||
}
|
||||
// Item 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;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Item 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 ", "(", ")"));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Item list.
|
||||
public override List<SaTaxCode> GetTaxCodeList(SaTaxCode.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
return taxCodes;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
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(SaTaxCode.Column.Id))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Id, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.Code))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Code, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.CodeAlt1))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt1, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.CodeAlt2))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CodeAlt2, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.Description))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Description, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.RegionId))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_RegionId, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.EffectFrom))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectFrom, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.EffectTo))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_EffectTo, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.TaxRate))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRate, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.TaxRatePrev))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxRatePrev, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.TaxCodeIdLink))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_TaxCodeIdLink, aliasTaxCode));
|
||||
|
||||
// Common Properties.
|
||||
if (columns.HasId(SaTaxCode.Column.Notes))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Notes, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.Status) || columns.HasId(SaTaxCode.Column.Status_Desc) || columns.HasId(SaTaxCode.Column.Status_Ind))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_Status, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_CreateOn, aliasTaxCode));
|
||||
if (columns.HasId(SaTaxCode.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.TaxCode_UpdateOn, aliasTaxCode));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetTaxCodeQueryFilter(prm));
|
||||
|
||||
if (prm.IdsIncluded.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,557 @@
|
||||
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
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data manager - Units of Measure.
|
||||
//=======================================================================
|
||||
internal partial class SaReferenceDataMgr_Dbas : SaReferenceDataMgr
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// 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(ErrorMessage.MultipleItemsFound);
|
||||
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(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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 item.
|
||||
public override bool IsValidUnitMeasureData(SaUnitMeasure.Data data, SaUnitMeasure.ErrField errField)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.IsValidUnitMeasureData(data, errField)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Insert item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
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 item.
|
||||
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 item.
|
||||
PopulateTo(dbUnitMeasure, unitMeasure, dbUpdateInfo);
|
||||
dbUnitMeasure.ExecuteUpdateCommand(dbCommand);
|
||||
// Record updates.
|
||||
updateLogMonitor.RecordUpdatedValues(unitMeasure);
|
||||
updateLogMonitor.LogUpdates();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
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 item.
|
||||
dbConnection.Open();
|
||||
UnitMeasure_Db dbUnitMeasure = new UnitMeasure_Db(DbInfo);
|
||||
dbUnitMeasure.PopulateFrom(dbCommand, aliasUnitMeasure, "Id=" + unitMeasure.Id.ToString());
|
||||
// Delete item.
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 colId = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Id, aliasUnitMeasure);
|
||||
if (prm.IdsIncluded.HasValidIds())
|
||||
filter.Add($"{colId} IN ({prm.IdsIncluded.Concat(",")})");
|
||||
if (prm.IdsExcluded.HasValidIds())
|
||||
filter.Add($"{colId} NOT IN ({prm.IdsExcluded.Concat(",")})");
|
||||
|
||||
// Category.
|
||||
if (prm.Category > 0)
|
||||
filter.Add($"{SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Category, aliasUnitMeasure)}={(int)prm.Category}");
|
||||
|
||||
// Unit Type.
|
||||
if (prm.UnitType > 0)
|
||||
filter.Add($"{SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UnitType, aliasUnitMeasure)}={(int)prm.UnitType}");
|
||||
|
||||
// Code.
|
||||
String colCode = SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, aliasUnitMeasure);
|
||||
if (!StringUtil.IsBlank(prm.Code))
|
||||
filter.Add($"{colCode}='{DbQuery.FormatForCondition(prm.Code)}'");
|
||||
else if (!StringUtil.IsBlank(prm.CodePartial))
|
||||
filter.Add($"{colCode} LIKE '%{DbQuery.FormatForLike(prm.CodePartial)}%'");
|
||||
|
||||
// Notes.
|
||||
if (!StringUtil.IsBlank(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)
|
||||
{
|
||||
ClearErrorState();
|
||||
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)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
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(SaUnitMeasure.Column.Id))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Id, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.Category))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Category, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.UnitType))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UnitType, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.Code))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Code, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.Abbr))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Abbr, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.Single))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Single, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.Multiple))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Multiple, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.EquivalencyValue))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquValue, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.UomIdEquivalency))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdEqu, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.EquivalencyAlgorythm))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_EquAlgorythm, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.UomIdRef1))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef1, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.UomIdRef2))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef2, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.UomIdRef3))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UomIdRef3, aliasUnitMeasure));
|
||||
|
||||
// Common Properties.
|
||||
if (columns.HasId(SaUnitMeasure.Column.Notes))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Notes, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.Status) || columns.HasId(SaUnitMeasure.Column.Status_Desc) || columns.HasId(SaUnitMeasure.Column.Status_Ind))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_Status, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_CreateOn, aliasUnitMeasure));
|
||||
if (columns.HasId(SaUnitMeasure.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaReferenceDataDbDfn.GetColumnNameQual(SaReferenceDataDbDfn.ColumnIdx.UnitMeasure_UpdateOn, aliasUnitMeasure));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetUnitMeasureQueryFilter(prm));
|
||||
|
||||
if (prm.IdsIncluded.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,48 @@
|
||||
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;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.ReferenceData
|
||||
{
|
||||
//=======================================================================
|
||||
// Reference Data manager.
|
||||
//=======================================================================
|
||||
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 ISacsDatabase 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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,302 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:12
|
||||
//---------------------------------------------------------------------------
|
||||
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 ColumnDataInt16 _DataItemType { get; } = new ColumnDataInt16("DataItemType");
|
||||
public ColumnDataString _EncPword { get; } = new ColumnDataString("EncPword");
|
||||
public ColumnDataString _PwordSalt { get; } = new ColumnDataString("PwordSalt");
|
||||
public ColumnDataString _PwordHash { get; } = new ColumnDataString("PwordHash");
|
||||
public ColumnDataString _PasswordToken { get; } = new ColumnDataString("PasswordToken");
|
||||
public ColumnDataString _PasswordHistory { get; } = new ColumnDataString("PasswordHistory");
|
||||
public ColumnDataDateTimeNullable _PasswordChangedAt { get; } = new ColumnDataDateTimeNullable("PasswordChangedAt");
|
||||
public ColumnDataDateTimeNullable _LastLogin { get; } = new ColumnDataDateTimeNullable("LastLogin");
|
||||
public ColumnDataDateTimeNullable _LastInvalidLoginAt { get; } = new ColumnDataDateTimeNullable("LastInvalidLoginAt");
|
||||
public ColumnDataInt16 _InvalidLoginCount { get; } = new ColumnDataInt16("InvalidLoginCount");
|
||||
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.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"Id",
|
||||
"Code",
|
||||
"Description",
|
||||
"Type",
|
||||
"EmailAddress",
|
||||
"Location",
|
||||
"DataItemType",
|
||||
"EncPword",
|
||||
"PwordSalt",
|
||||
"PwordHash",
|
||||
"PasswordToken",
|
||||
"PasswordHistory",
|
||||
"PasswordChangedAt",
|
||||
"LastLogin",
|
||||
"LastInvalidLoginAt",
|
||||
"InvalidLoginCount",
|
||||
"Notes",
|
||||
"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> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"EncPword",
|
||||
"PwordSalt",
|
||||
"PwordHash",
|
||||
"PasswordToken",
|
||||
"PasswordHistory",
|
||||
"PasswordChangedAt",
|
||||
"LastLogin",
|
||||
"LastInvalidLoginAt",
|
||||
};
|
||||
protected 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 Int16 _DataItemType { get { return Cols._DataItemType.Value; } set { Cols._DataItemType.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 String _PasswordToken { get { return Cols._PasswordToken.Value; } set { Cols._PasswordToken.Value = value; } }
|
||||
public String _PasswordHistory { get { return Cols._PasswordHistory.Value; } set { Cols._PasswordHistory.Value = value; } }
|
||||
public DateTime? _PasswordChangedAt { get { return Cols._PasswordChangedAt.Value; } set { Cols._PasswordChangedAt.Value = value; } }
|
||||
public DateTime? _LastLogin { get { return Cols._LastLogin.Value; } set { Cols._LastLogin.Value = value; } }
|
||||
public DateTime? _LastInvalidLoginAt { get { return Cols._LastInvalidLoginAt.Value; } set { Cols._LastInvalidLoginAt.Value = value; } }
|
||||
public Int16 _InvalidLoginCount { get { return Cols._InvalidLoginCount.Value; } set { Cols._InvalidLoginCount.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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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);
|
||||
_DataItemType = GetFieldInt16(dbDataReader, "DataItemType", _DataItemType);
|
||||
_EncPword = GetFieldString(dbDataReader, "EncPword", _EncPword);
|
||||
_PwordSalt = GetFieldString(dbDataReader, "PwordSalt", _PwordSalt);
|
||||
_PwordHash = GetFieldString(dbDataReader, "PwordHash", _PwordHash);
|
||||
_PasswordToken = GetFieldString(dbDataReader, "PasswordToken", _PasswordToken);
|
||||
_PasswordHistory = GetFieldString(dbDataReader, "PasswordHistory", _PasswordHistory);
|
||||
_PasswordChangedAt = GetFieldDateTimeNullable(dbDataReader, "PasswordChangedAt", _PasswordChangedAt);
|
||||
_LastLogin = GetFieldDateTimeNullable(dbDataReader, "LastLogin", _LastLogin);
|
||||
_LastInvalidLoginAt = GetFieldDateTimeNullable(dbDataReader, "LastInvalidLoginAt", _LastInvalidLoginAt);
|
||||
_InvalidLoginCount = GetFieldInt16(dbDataReader, "InvalidLoginCount", _InvalidLoginCount);
|
||||
_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("DataItemType")) AddCommandParameter(dbCommand, "@DataItemType", _DataItemType);
|
||||
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("PasswordToken")) AddCommandParameter(dbCommand, "@PasswordToken", _PasswordToken);
|
||||
if (columnNames.ContainsCI("PasswordHistory")) AddCommandParameter(dbCommand, "@PasswordHistory", _PasswordHistory);
|
||||
if (columnNames.ContainsCI("PasswordChangedAt")) AddCommandParameter(dbCommand, "@PasswordChangedAt", _PasswordChangedAt);
|
||||
if (columnNames.ContainsCI("LastLogin")) AddCommandParameter(dbCommand, "@LastLogin", _LastLogin);
|
||||
if (columnNames.ContainsCI("LastInvalidLoginAt")) AddCommandParameter(dbCommand, "@LastInvalidLoginAt", _LastInvalidLoginAt);
|
||||
if (columnNames.ContainsCI("InvalidLoginCount")) AddCommandParameter(dbCommand, "@InvalidLoginCount", _InvalidLoginCount);
|
||||
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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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("DataItemType")) AddCommandParameter(dbCommand, "@DataItemType", _DataItemType);
|
||||
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("PasswordToken")) AddCommandParameter(dbCommand, "@PasswordToken", _PasswordToken);
|
||||
if (columnNames.ContainsCI("PasswordHistory")) AddCommandParameter(dbCommand, "@PasswordHistory", _PasswordHistory);
|
||||
if (columnNames.ContainsCI("PasswordChangedAt")) AddCommandParameter(dbCommand, "@PasswordChangedAt", _PasswordChangedAt);
|
||||
if (columnNames.ContainsCI("LastLogin")) AddCommandParameter(dbCommand, "@LastLogin", _LastLogin);
|
||||
if (columnNames.ContainsCI("LastInvalidLoginAt")) AddCommandParameter(dbCommand, "@LastInvalidLoginAt", _LastInvalidLoginAt);
|
||||
if (columnNames.ContainsCI("InvalidLoginCount")) AddCommandParameter(dbCommand, "@InvalidLoginCount", _InvalidLoginCount);
|
||||
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,241 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
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.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Linq;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 30-Oct-2025 11:28:12
|
||||
//---------------------------------------------------------------------------
|
||||
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 ColumnDataInt32Nullable _DateApplicFrom { get; } = new ColumnDataInt32Nullable("DateApplicFrom");
|
||||
public ColumnDataInt32Nullable _DateApplicTo { get; } = new ColumnDataInt32Nullable("DateApplicTo");
|
||||
public ColumnDataInt16Nullable _Flags { get; } = new ColumnDataInt16Nullable("Flags");
|
||||
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
|
||||
public ColumnDataDateTimeNullable _CreateOn { get; } = new ColumnDataDateTimeNullable("CreateOn");
|
||||
public ColumnDataInt32Nullable _CreateBy { get; } = new ColumnDataInt32Nullable("CreateBy");
|
||||
public ColumnDataString _CreateHost { get; } = new ColumnDataString("CreateHost");
|
||||
public ColumnDataDateTimeNullable _UpdateOn { get; } = new ColumnDataDateTimeNullable("UpdateOn");
|
||||
public ColumnDataInt32Nullable _UpdateBy { get; } = new ColumnDataInt32Nullable("UpdateBy");
|
||||
public ColumnDataString _UpdateHost { get; } = new ColumnDataString("UpdateHost");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
protected static List<String> fields { get; } = new List<String>()
|
||||
{
|
||||
"ItemOwner",
|
||||
"ItemTarget",
|
||||
"ItemContext",
|
||||
"DayApplic",
|
||||
"DateApplicFrom",
|
||||
"DateApplicTo",
|
||||
"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>()
|
||||
{
|
||||
"ItemOwner",
|
||||
"ItemTarget",
|
||||
"ItemContext",
|
||||
};
|
||||
protected static List<String> fieldsNullable { get; } = new List<String>()
|
||||
{
|
||||
"DayApplic",
|
||||
"DateApplicFrom",
|
||||
"DateApplicTo",
|
||||
"Flags",
|
||||
"Status",
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"UpdateOn",
|
||||
"UpdateBy",
|
||||
"UpdateHost",
|
||||
};
|
||||
protected 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); } }
|
||||
public List<String> UpdatableColumns { get { return ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList(); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 = GetFieldInt32Nullable(dbDataReader, "DateApplicFrom", _DateApplicFrom);
|
||||
_DateApplicTo = GetFieldInt32Nullable(dbDataReader, "DateApplicTo", _DateApplicTo);
|
||||
_Flags = GetFieldInt16Nullable(dbDataReader, "Flags", _Flags);
|
||||
_Status = GetFieldString(dbDataReader, "Status", _Status);
|
||||
_CreateOn = GetFieldDateTimeNullable(dbDataReader, "CreateOn", _CreateOn);
|
||||
_CreateBy = GetFieldInt32Nullable(dbDataReader, "CreateBy", _CreateBy);
|
||||
_CreateHost = GetFieldString(dbDataReader, "CreateHost", _CreateHost);
|
||||
_UpdateOn = GetFieldDateTimeNullable(dbDataReader, "UpdateOn", _UpdateOn);
|
||||
_UpdateBy = GetFieldInt32Nullable(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, List<String> columnsToUpdate = null)
|
||||
{
|
||||
// Columns to update.
|
||||
List<String> columnNames = (columnsToUpdate?.Any() ?? false ? columnsToUpdate : UpdatableColumns).Where(col => UpdatableColumns.ContainsCI(col)).ToList();
|
||||
if (!columnNames.Any())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} No columns to update. [{GetType().Name}]");
|
||||
return false;
|
||||
}
|
||||
// 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,690 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
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(ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
// Initialise security manager.
|
||||
securityMgr = new SaSecurityMgr_Dbas(this);
|
||||
}
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
if (securityMgr != null) securityMgr.Dispose(); securityMgr = null;
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Database properties.
|
||||
internal ISacsDatabase 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;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Password utilities.
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
/// <summary>Store the password against against the user.</summary>
|
||||
public override bool SetPassword(SaSecurityItem securityItemUser, String password)
|
||||
{
|
||||
return securityMgr.SetPassword(securityItemUser, password);
|
||||
}
|
||||
|
||||
/// <summary>Does the password match that currently defined against the user.</summary>
|
||||
public override bool PasswordMatches(SaSecurityItem securityItemUser, String password, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
return securityMgr.PasswordMatches(securityItemUser, password, dbUpdateInfo);
|
||||
}
|
||||
|
||||
/// <summary>Is the password currently defined against the user blank.</summary>
|
||||
public override bool PasswordIsBlank(SaSecurityItem securityItemUser)
|
||||
{
|
||||
return securityMgr.PasswordIsBlank(securityItemUser);
|
||||
}
|
||||
|
||||
/// <summary>Change Password form - desktop only.</summary>
|
||||
public override bool ShowChangePasswordForm(DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <summary>Generate password hash using the specified method.</summary>
|
||||
public override String EncodePassword_Hex(String password, SaSecurity.PasswordHashMethod method = SaSecurity.PasswordHashMethod.MsSql)
|
||||
{
|
||||
return securityMgr.EncodePassword_Hex(password, method);
|
||||
}
|
||||
|
||||
/// <summary>Compare password to hashed value using the specified method.</summary>
|
||||
public override bool ComparePassword_Hex(String password, String passwordHashHex, SaSecurity.PasswordHashMethod method = SaSecurity.PasswordHashMethod.MsSql)
|
||||
{
|
||||
return securityMgr.ComparePassword_Hex(password, passwordHashHex, method);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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 (RegisteredRights.Count == 0) return false;
|
||||
foreach (SaSecurityRight securityRight in RegisteredRights)
|
||||
{
|
||||
if (!securityMgr.SecurityItemExistsByTypeCode(SaSecurity.ItemType.Right, securityRight.Code))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public override bool PopulateSecurityRights(DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (RegisteredRights.Count == 0) return false;
|
||||
|
||||
foreach (SaSecurityRight securityRight in RegisteredRights)
|
||||
{
|
||||
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 OK;
|
||||
}
|
||||
private bool PopulateSuperGroup(DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaSecurityItem superGroup = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.Group, GroupCode_Super);
|
||||
if (superGroup == null)
|
||||
{
|
||||
superGroup = securityMgr.CreateSecurityItem(SaSecurity.ItemType.Group);
|
||||
superGroup.Code = GroupCode_Super;
|
||||
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 OK;
|
||||
}
|
||||
private bool PopulateAdminUser(DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaSecurityItem user = null;
|
||||
if (!securityMgr.SecurityItemExistsByTypeCode(SaSecurity.ItemType.User, UserCode_Admin))
|
||||
{
|
||||
// Create the admin user.
|
||||
user = securityMgr.CreateSecurityItem(SaSecurity.ItemType.User);
|
||||
user.Code = UserCode_Admin;
|
||||
user.Description = "<Admin>";
|
||||
user.Location = "<System>";
|
||||
securityMgr.SetPassword(user, UserCode_Admin);
|
||||
if (!securityMgr.InsertSecurityItem(user, dbUpdateInfo))
|
||||
return SetErrorState(securityMgr.ErrorStateMessage);
|
||||
}
|
||||
// Retrieve the user (even if just created).
|
||||
user = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.User, UserCode_Admin);
|
||||
if (user != null)
|
||||
{
|
||||
// Give this user superuser rights.
|
||||
SaSecurityItem superGroup = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.Group, GroupCode_Super);
|
||||
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 OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaSecurityItem secItemUser = securityMgr.GetSecurityItemById(userId);
|
||||
if (secItemUser == null || secItemUser.ItemType != SaSecurity.ItemType.User || !secItemUser.IsStatusEnabled)
|
||||
{
|
||||
SaLogger.Error($"{SysUtil.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($"{SysUtil.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()
|
||||
{
|
||||
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($"{SysUtil.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($"{SysUtil.Fn}Failed to create user '{userCode}' - {securityMgr.ErrorStateMessage}", true);
|
||||
secItem = null;
|
||||
}
|
||||
}
|
||||
OnLogin(secItem != null ? secItem.Id : null);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <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)
|
||||
{
|
||||
if (secItem == null || !SysId.IsValid(secItem.Id)) return null;
|
||||
if (LogSecurityProfile) SaLogger.Info($"{SysUtil.Fn}Populating security profile for user {secItem.Code} '{secItem.Description}'");
|
||||
|
||||
// Retrieve Group links associated with the Item.
|
||||
SaSecurityLink.Params prmSecLinkGroups = new SaSecurityLink.Params();
|
||||
prmSecLinkGroups.ItemIdsOwnerIncluded.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.ItemIdsOwnerIncluded.Add(secItem.Id);
|
||||
prmSecLinkRights.ItemIdsOwnerIncluded.UnionWith(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.IdsIncluded.UnionWith(groupLinks.GetTargetItemIds());
|
||||
prmSecItem.IdsIncluded.UnionWith(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($"{SysUtil.Fn}Failed to retrieve security group. Id: {SysId.ToString(secGroupLink.ItemIdTarget)}.");
|
||||
continue;
|
||||
}
|
||||
if (LogSecurityProfile) SaLogger.Info($"{SysUtil.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($"{SysUtil.Fn}Failed to retrieve security group right. Id: {SysId.ToString(secRightLink.ItemIdTarget)}.");
|
||||
continue;
|
||||
}
|
||||
bool rightGranted = (secRightLink.Status == SaStatus.Granted);
|
||||
if (LogSecurityProfile) SaLogger.Info($"{SysUtil.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($"{SysUtil.Fn} {exc.Message}"); }
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
SaSecurityProfile.GroupData groupData = new SaSecurityProfile.GroupData(secGroup, profileGroupRights);
|
||||
profileGroups.Add(groupData);
|
||||
}
|
||||
catch (Exception exc) { SaLogger.Warn($"{SysUtil.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($"{SysUtil.Fn}Failed to retrieve security right. Id: {SysId.ToString(secRightLink.ItemIdTarget)}.");
|
||||
continue;
|
||||
}
|
||||
bool rightGranted = (secRightLink.Status == SaStatus.Granted);
|
||||
if (LogSecurityProfile) SaLogger.Info($"{SysUtil.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($"{SysUtil.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 GetUserByEmail(String emailAddress)
|
||||
{
|
||||
return securityMgr.GetSecurityItemByTypeEmail(SaSecurity.ItemType.User, emailAddress);
|
||||
}
|
||||
public override SaSecurityItem GetSecurityItemById(SaSecurity.ItemType securityItemType, SysId id)
|
||||
{
|
||||
return securityMgr.GetSecurityItemByTypeId(securityItemType, id);
|
||||
}
|
||||
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))
|
||||
{
|
||||
while (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(ErrorMessage.ItemIdNotSpecified);
|
||||
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.IdsIncluded.Add(itemId);
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
if (securityMgr.GetSecurityItemCount(prmSecItem) != 1) return null;
|
||||
|
||||
// Execute query.
|
||||
using (DbResultSet dbResultSet = securityMgr.ExecuteSecurityItemQuery(columns, prmSecItem))
|
||||
{
|
||||
while (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(SacsItemMgr.ErrorMessage.ItemIdNotSpecified);
|
||||
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.IdsIncluded.Add(itemId);
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
if (securityMgr.GetSecurityItemCount(prmSecItem) != 1) return null;
|
||||
|
||||
// Execute query.
|
||||
using (DbResultSet dbResultSet = securityMgr.ExecuteSecurityItemQuery(columns, prmSecItem))
|
||||
{
|
||||
while (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.IdsIncluded.UnionWith(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.
|
||||
private bool CreateSecurityItem(SaSecurity.ItemType securityItemType, String itemTypeCaption, string code, string name, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (StringUtil.IsBlank(code) || StringUtil.IsBlank(name))
|
||||
return SetErrorState($"{itemTypeCaption} code and name must be supplied");
|
||||
if (SecurityItemCodeExists(securityItemType, code))
|
||||
return SetErrorState($"{itemTypeCaption} code already exists");
|
||||
|
||||
// Create Security Item.
|
||||
SaSecurityItem secItem = securityMgr.CreateSecurityItem(securityItemType);
|
||||
secItem.Code = code;
|
||||
secItem.Description = name;
|
||||
|
||||
// Insert on database.
|
||||
if (!securityMgr.InsertSecurityItem(secItem, dbUpdateInfo))
|
||||
return SetErrorState(securityMgr.ErrorStateMessage);
|
||||
|
||||
return OK;
|
||||
}
|
||||
public override bool CreateUser(string code, string name, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
return CreateSecurityItem(SaSecurity.ItemType.User, "User", code, name, dbUpdateInfo);
|
||||
}
|
||||
public override bool CreateGroup(string code, string name, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
return CreateSecurityItem(SaSecurity.ItemType.Group, "Group", code, name, dbUpdateInfo);
|
||||
}
|
||||
public override bool AssignUserToGroup(string userCode, string groupCode, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
// Validate environment.
|
||||
if (securityMgr == null) return SetErrorState("security manager is not available");
|
||||
if (!securityMgr.DatabaseIsValid) return SetErrorState("database has an invalid security profile");
|
||||
// User security item.
|
||||
SaSecurityItem securityItemUser = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.User, userCode);
|
||||
if (securityItemUser == null) return SetErrorState(("user does not exist"));
|
||||
// Group security item.
|
||||
SysId securityGroupId = GetIdForItemCode(SaSecurity.ItemType.Group, groupCode);
|
||||
if (!SysId.IsValid(securityGroupId)) return SetErrorState(("invalid group code"));
|
||||
if (!ItemsAreLinked(securityItemUser.Id, securityGroupId))
|
||||
{
|
||||
SaSecurityLink securityLinkUserGroup = securityMgr.CreateSecurityLink(securityItemUser.Id, securityGroupId, new SysId());
|
||||
if (securityLinkUserGroup == null) return SetErrorState($"failed to create group-user ({securityMgr.ErrorStateMessage})");
|
||||
if (!securityMgr.InsertSecurityLink(securityLinkUserGroup, dbUpdateInfo))
|
||||
return SetErrorState($"failed to add user to group ({securityMgr.ErrorStateMessage})");
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
public override bool AssignRightToGroup(string rightCode, string groupCode, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
// Validate environment.
|
||||
if (securityMgr == null) return SetErrorState("security manager is not available");
|
||||
if (!securityMgr.DatabaseIsValid) return SetErrorState("database has an invalid security profile");
|
||||
// Right security item.
|
||||
SaSecurityItem securityItemRight = securityMgr.GetSecurityItemByTypeCode(SaSecurity.ItemType.Right, rightCode);
|
||||
if (securityItemRight == null) return SetErrorState(("right does not exist"));
|
||||
// Group security item.
|
||||
SysId securityGroupId = GetIdForItemCode(SaSecurity.ItemType.Group, groupCode);
|
||||
if (!SysId.IsValid(securityGroupId)) return SetErrorState(("invalid group code"));
|
||||
if (!ItemsAreLinked(securityItemRight.Id, securityGroupId))
|
||||
{
|
||||
SaSecurityLink securityLinkRightGroup = securityMgr.CreateSecurityLink(securityItemRight.Id, securityGroupId, new SysId());
|
||||
if (securityLinkRightGroup == null) return SetErrorState($"failed to create group-right ({securityMgr.ErrorStateMessage})");
|
||||
if (!securityMgr.InsertSecurityLink(securityLinkRightGroup, dbUpdateInfo))
|
||||
return SetErrorState($"failed to add right to group ({securityMgr.ErrorStateMessage})");
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
public override bool UpdateSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!securityMgr.UpdateSecurityItem(securityItem, dbUpdateInfo))
|
||||
return SetErrorState(securityMgr.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// 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.ItemIdsOwnerIncluded.Add(itemId1);
|
||||
prmSecLink.ItemIdsTargetIncluded.Add(itemId2);
|
||||
prmSecLink.StatusCat = SaSecurityLink.StatusCat.Any;
|
||||
if (securityMgr.GetSecurityLinkCount(prmSecLink) > 0)
|
||||
return true;
|
||||
|
||||
// To-From.
|
||||
prmSecLink = new SaSecurityLink.Params();
|
||||
prmSecLink.ItemIdsOwnerIncluded.Add(itemId2);
|
||||
prmSecLink.ItemIdsTargetIncluded.Add(itemId1);
|
||||
prmSecLink.StatusCat = SaSecurityLink.StatusCat.Any;
|
||||
if (securityMgr.GetSecurityLinkCount(prmSecLink) > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.IO;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Base;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
public static class SaSecurityDbDfnGenerator
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
private static string className = nameof(SaSecurityDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate Security database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = className + ".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, "generating Security database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "SaSecItem", "SaSecLink" });
|
||||
config.Schema.Tables_Excluded.UnionWith(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.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.Security";
|
||||
config.DefinitionClass.Classname = "SaSecurityDbDfn";
|
||||
// Table class.
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.App");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Core");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Utils");
|
||||
config.TableClass.Usings.Add("Sarand.Net.Standard.Base.Dbas");
|
||||
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.Security.Internal";
|
||||
config.TableClass.ClassName_DatabaseInfo = "IDatabaseInfo";
|
||||
config.TableClass.MandatoryConstructorDbInfo = true;
|
||||
|
||||
// Generate database definition.
|
||||
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
|
||||
return generator.Generate(config);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private static String GetOutputFolder()
|
||||
{
|
||||
String fn = className + ".GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug($"{fn} Assembly folder: {directory}");
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
|
||||
break;
|
||||
directory = FileUtil.GetParentDirectory(directory);
|
||||
}
|
||||
if (String.IsNullOrEmpty(directory))
|
||||
{
|
||||
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
|
||||
return String.Empty;
|
||||
}
|
||||
// Code files are generated to '..\Database\Generated\Security\' folder.
|
||||
directory = Path.Combine(directory, "Database", "Generated", "Security");
|
||||
SaLogger.Debug($"{fn} Output folder: {directory}");
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
using System;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
class SaSecurityItem_Dbas : SaSecurityItem
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public SaSecurityItem_Dbas (SysId id, SaSecurity.ItemType securityItemType, ushort flags) :
|
||||
base(id, securityItemType)
|
||||
{
|
||||
Flags = flags;
|
||||
}
|
||||
|
||||
public void SetPasswordSalt(String passwordSalt)
|
||||
{
|
||||
base.PasswordSalt = passwordSalt;
|
||||
}
|
||||
public void SetPasswordHash(String passwordHash)
|
||||
{
|
||||
base.PasswordHash = passwordHash;
|
||||
}
|
||||
[Obsolete("Avoid using the original C++ password encryption - switch to hashed password instead.")]
|
||||
public void SetPasswordEncrypted(String passwordEncrypted)
|
||||
{
|
||||
base.PasswordEncrypted = passwordEncrypted;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
class SaSecurityLink_Dbas : SaSecurityLink
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public SaSecurityLink_Dbas (SysId itemIdOwner, SysId itemIdTarget, SysId itemIdContext, ushort flags) :
|
||||
base(itemIdOwner,itemIdTarget,itemIdContext)
|
||||
{
|
||||
Flags = flags;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,689 @@
|
||||
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.Data;
|
||||
using Sarand.Net.Standard.Dbas.Security.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.Text;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
partial class SaSecurityMgr_Dbas
|
||||
{
|
||||
//*******************************************************************
|
||||
// S e c u r i t y I t e m
|
||||
//*******************************************************************
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Utilities.
|
||||
private List<StringPair> GetLogProperties(SaSecurityItem securityItem)
|
||||
{
|
||||
return new List<StringPair>()
|
||||
{
|
||||
new StringPair("Id",SysId.ToString(securityItem.Id)),
|
||||
new StringPair("Code",securityItem.Code),
|
||||
new StringPair("Description",securityItem.Description),
|
||||
new StringPair("Status",securityItem.StatusCode)
|
||||
};
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Associated data.
|
||||
public override bool SecurityItemIsSourceOfLinks(SysId securityItemId)
|
||||
{
|
||||
String filter = SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner) + "=" + SysId.ToString(securityItemId);
|
||||
return (Database.GetRowCount(TableName_SecLink, filter) > 0);
|
||||
}
|
||||
public override bool SecurityItemIsTargetOfLinks(SysId securityItemId)
|
||||
{
|
||||
String filter = SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget) + "=" + SysId.ToString(securityItemId);
|
||||
return (Database.GetRowCount(TableName_SecLink, filter) > 0);
|
||||
}
|
||||
public override bool SecurityItemHasLinksWith(SysId securityItemIdOwner, SysId securityItemIdTarget)
|
||||
{
|
||||
SaSecurityLink.Params prmSecLink = new SaSecurityLink.Params();
|
||||
prmSecLink.ItemIdsOwnerIncluded.Add(securityItemIdOwner);
|
||||
prmSecLink.ItemIdsTargetIncluded.Add(securityItemIdTarget);
|
||||
prmSecLink.StatusCat = SaSecurityLink.StatusCat.Any;
|
||||
return (GetSecurityLinkCount(prmSecLink) > 0);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Security Item exists.
|
||||
public override bool SecurityItemExistsById(SysId id)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!SysId.IsValid(id)) return false;
|
||||
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
|
||||
prmSecItem.IdsIncluded.Add(id);
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
return GetSecurityItemCount(prmSecItem) == 1;
|
||||
}
|
||||
public override bool SecurityItemExistsByTypeCode(SaSecurity.ItemType securityItemType, string code)
|
||||
{
|
||||
ClearErrorState();
|
||||
if ((int)securityItemType < 1 || StringUtil.IsEmpty(code)) return false;
|
||||
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
|
||||
prmSecItem.SecurityItemType = securityItemType;
|
||||
prmSecItem.Code = code;
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
return GetSecurityItemCount(prmSecItem) == 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get SecurityItem.
|
||||
public override SaSecurityItem GetSecurityItem(SaSecurityItem.Params prmSecItem)
|
||||
{
|
||||
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
private SaSecurityItem GetSecurityItem(String filter)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (GetSecurityItemCount(filter) != 1) return null;
|
||||
SaSecurityItem securityItem = null;
|
||||
// Query data.
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
dbConnection.Open();
|
||||
SaSecItem_Db dbSecurityItem = new SaSecItem_Db(DbInfo);
|
||||
dbSecurityItem.PopulateFrom(dbCommand, aliasSecurityItem, filter);
|
||||
securityItem = CreateSecurityItem(dbSecurityItem);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
return securityItem;
|
||||
}
|
||||
public override SaSecurityItem GetSecurityItemById(SysId id)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!SysId.IsValid(id)) return null;
|
||||
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
|
||||
prmSecItem.IdsIncluded.Add(id);
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
public override SaSecurityItem GetSecurityItemByTypeId(SaSecurity.ItemType securityItemType, SysId id)
|
||||
{
|
||||
ClearErrorState();
|
||||
if ((int)securityItemType < 1 || !SysId.IsValid(id)) return null;
|
||||
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
|
||||
prmSecItem.IdsIncluded.Add(id);
|
||||
prmSecItem.SecurityItemType = securityItemType;
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
public override SaSecurityItem GetSecurityItemByTypeEmail(SaSecurity.ItemType securityItemType, string emailAddress)
|
||||
{
|
||||
ClearErrorState();
|
||||
if ((int)securityItemType < 1 || StringUtil.IsEmpty(emailAddress)) return null;
|
||||
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
|
||||
prmSecItem.SecurityItemType = securityItemType;
|
||||
prmSecItem.EmailAddress = emailAddress;
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
public override SaSecurityItem GetSecurityItemByTypeCode(SaSecurity.ItemType securityItemType, string code)
|
||||
{
|
||||
ClearErrorState();
|
||||
if ((int)securityItemType < 1 || StringUtil.IsEmpty(code)) return null;
|
||||
SaSecurityItem.Params prmSecItem = new SaSecurityItem.Params();
|
||||
prmSecItem.SecurityItemType = securityItemType;
|
||||
prmSecItem.Code = code;
|
||||
prmSecItem.StatusCat = SaSecurityItem.StatusCat.Any;
|
||||
return GetSecurityItem(GetSecurityItemQueryFilter(prmSecItem).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Create item.
|
||||
public override SaSecurityItem CreateSecurityItem(SaSecurity.ItemType securityItemType)
|
||||
{
|
||||
ClearErrorState();
|
||||
return new SaSecurityItem_Dbas(null, securityItemType, 0);
|
||||
}
|
||||
public SaSecurityItem CreateSecurityItem(SaSecItem_Db dbSecurityItem)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaSecurityItem_Dbas securityItem = new SaSecurityItem_Dbas(new SysId(dbSecurityItem._Id), (SaSecurity.ItemType)dbSecurityItem._Type, (ushort)dbSecurityItem._Flags);
|
||||
PopulateFrom(dbSecurityItem, securityItem);
|
||||
return securityItem;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Validate item.
|
||||
public override bool IsValidSecurityItemData(SaSecurityItem.Data securityItemData, SaSecurityItem.ErrField errField)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.IsValidSecurityItemData(securityItemData, errField)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Insert item.
|
||||
public override bool InsertSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!IsValidSecurityItem(securityItem)) return false;
|
||||
if (SysId.IsValid(securityItem.Id)) return SetErrorState(ErrorMessage.ValidItemId);
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
dbConnection.Open();
|
||||
SaSecItem_Db dbSecurityItem = new SaSecItem_Db(DbInfo);
|
||||
PopulateTo(dbSecurityItem, securityItem, dbUpdateInfo);
|
||||
if (SaSecItem_Db.FieldsNonId.Contains("Id"))
|
||||
{
|
||||
// Generate next Id.
|
||||
dbSecurityItem._Id = SysId.ToInt(Database.GetNextId("SaSecItem", dbUpdateInfo));
|
||||
}
|
||||
dbSecurityItem.ExecuteInsertCommand(dbCommand);
|
||||
securityItem.Id = new SysId(dbSecurityItem._Id);
|
||||
securityItem.Changed = false;
|
||||
if (SacsSystem.DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. {GetLogProperties(securityItem).Concat(": ").Concat("", "\n\t")}");
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
public override bool UpdateSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!IsValidSecurityItem(securityItem)) return false;
|
||||
if (!SysId.IsValid(securityItem.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
|
||||
if (!securityItem.Changed)
|
||||
{
|
||||
if (SacsSystem.DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. {GetLogProperties(securityItem).Concat(": ").Concat("", "\n\t")}");
|
||||
return true;
|
||||
}
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
// Retrieve item.
|
||||
dbConnection.Open();
|
||||
SaSecItem_Db dbSecurityItem = new SaSecItem_Db(DbInfo);
|
||||
dbSecurityItem.PopulateFrom(dbCommand, aliasSecurityItem, "Id=" + SysId.ToString(securityItem.Id));
|
||||
SaUpdateLogItemMonitor_SecurityItem updateLogMonitor = new SaUpdateLogItemMonitor_SecurityItem(SecurityConsole, CreateSecurityItem(dbSecurityItem), dbUpdateInfo);
|
||||
// Update item.
|
||||
PopulateTo(dbSecurityItem, securityItem, dbUpdateInfo);
|
||||
dbSecurityItem.ExecuteUpdateCommand(dbCommand);
|
||||
securityItem.Changed = false;
|
||||
if (SacsSystem.DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. {GetLogProperties(securityItem).Concat(": ").Concat("", "\n\t")}");
|
||||
// Record updates.
|
||||
updateLogMonitor.RecordUpdatedValues(securityItem);
|
||||
updateLogMonitor.LogUpdates();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
public override bool SecurityItemCanBeDeleted(SaSecurityItem securityItem)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.SecurityItemCanBeDeleted(securityItem)) return false;
|
||||
return true;
|
||||
}
|
||||
public override bool DeleteSecurityItem(SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!SecurityItemCanBeDeleted(securityItem)) return false;
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
// Retrieve item.
|
||||
dbConnection.Open();
|
||||
SaSecItem_Db dbSecurityItem = new SaSecItem_Db(DbInfo);
|
||||
dbSecurityItem.PopulateFrom(dbCommand, aliasSecurityItem, "Id=" + SysId.ToString(securityItem.Id));
|
||||
// Delete item.
|
||||
dbCommand.CommandType = System.Data.CommandType.Text;
|
||||
dbCommand.CommandText = "DELETE FROM " + TableName_SecItem + " WHERE Id=" + SysId.ToString(securityItem.Id) + ";";
|
||||
dbCommand.ExecuteNonQuery();
|
||||
if (SacsSystem.DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. {GetLogProperties(securityItem).Concat(": ").Concat("", "\n\t")}");
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Copy data properties to and from database.
|
||||
private void PopulateTo(SaSecItem_Db dbSecurityItem, SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
dbSecurityItem._Id = securityItem.Id.ToInt();
|
||||
dbSecurityItem._Type = (byte)securityItem.ItemType;
|
||||
dbSecurityItem._Code = securityItem.Code;
|
||||
dbSecurityItem._EmailAddress = securityItem.EmailAddress;
|
||||
dbSecurityItem._Description = securityItem.Description;
|
||||
dbSecurityItem._Location = securityItem.Location;
|
||||
dbSecurityItem._DataItemType = (short)securityItem.DataItemType;
|
||||
// Security.
|
||||
dbSecurityItem._PwordSalt = securityItem.PasswordSalt;
|
||||
dbSecurityItem._PwordHash = securityItem.PasswordHash;
|
||||
#pragma warning disable CS0618 // Deprecated property
|
||||
dbSecurityItem._EncPword = securityItem.PasswordEncrypted;
|
||||
#pragma warning restore CS0618 // Deprecated property
|
||||
//dbSecurityItem._PasswordHistory = securityItem.PasswordHistory;
|
||||
dbSecurityItem._PasswordToken = securityItem.PasswordToken;
|
||||
dbSecurityItem._PasswordChangedAt = securityItem.PasswordChangedAt;
|
||||
// Login.
|
||||
dbSecurityItem._LastLogin = securityItem.LastLogin;
|
||||
dbSecurityItem._LastInvalidLoginAt = securityItem.LastInvalidLoginAt;
|
||||
dbSecurityItem._InvalidLoginCount = securityItem.InvalidLoginCount;
|
||||
// Common properties.
|
||||
dbSecurityItem._Notes = securityItem.Notes;
|
||||
dbSecurityItem._Status = SacsSystem.GetStatusCode(securityItem.Status);
|
||||
dbSecurityItem._Flags = (short)securityItem.Flags;
|
||||
if (!SysId.IsValid(securityItem.Id))
|
||||
{
|
||||
dbSecurityItem._CreateOn = DateTime.Now;
|
||||
dbSecurityItem._CreateBy = dbUpdateInfo.UserId.ToInt();
|
||||
dbSecurityItem._CreateHost = dbUpdateInfo.Host;
|
||||
}
|
||||
dbSecurityItem._UpdateOn = DateTime.Now;
|
||||
dbSecurityItem._UpdateBy = dbUpdateInfo.UserId.ToInt();
|
||||
dbSecurityItem._UpdateHost = dbUpdateInfo.Host;
|
||||
}
|
||||
private void PopulateFrom(SaSecItem_Db dbSecurityItem, SaSecurityItem_Dbas securityItem)
|
||||
{
|
||||
//securityItem.Id = new SysId(dbSecurityItem._Id);
|
||||
securityItem.Code = dbSecurityItem._Code;
|
||||
securityItem.EmailAddress = dbSecurityItem._EmailAddress;
|
||||
securityItem.Description = dbSecurityItem._Description;
|
||||
securityItem.Location = dbSecurityItem._Location;
|
||||
securityItem.DataItemType = dbSecurityItem._DataItemType;
|
||||
// Security.
|
||||
securityItem.SetPasswordSalt(dbSecurityItem._PwordSalt);
|
||||
securityItem.SetPasswordHash(dbSecurityItem._PwordHash);
|
||||
#pragma warning disable CS0618 // Deprecated property
|
||||
securityItem.SetPasswordEncrypted(dbSecurityItem._EncPword);
|
||||
#pragma warning restore CS0618 // Deprecated property
|
||||
//securityItem.PasswordHistory = dbSecurityItem._PasswordHistory;
|
||||
securityItem.PasswordToken = dbSecurityItem._PasswordToken;
|
||||
securityItem.PasswordChangedAt = dbSecurityItem._PasswordChangedAt;
|
||||
// Login.
|
||||
securityItem.LastLogin = dbSecurityItem._LastLogin;
|
||||
securityItem.LastInvalidLoginAt = dbSecurityItem._LastInvalidLoginAt;
|
||||
securityItem.InvalidLoginCount = dbSecurityItem._InvalidLoginCount;
|
||||
// Common properties.
|
||||
securityItem.Notes = dbSecurityItem._Notes;
|
||||
securityItem.Status = SacsSystem.GetStatusForCode(dbSecurityItem._Status);
|
||||
securityItem.SetCreateStamp(dbSecurityItem._CreateOn, new SysId(dbSecurityItem._CreateBy), dbSecurityItem._CreateHost);
|
||||
securityItem.SetUpdateStamp(dbSecurityItem._UpdateOn, new SysId(dbSecurityItem._UpdateBy), dbSecurityItem._UpdateHost);
|
||||
securityItem.AcceptChanges();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// SecurityItem column definitions.
|
||||
private static readonly String aliasSecurityItem = "aSecItm";
|
||||
private static readonly String colOwnerLinkCount = "OwnerLinkCount";
|
||||
private static readonly String colTargetLinkCount = "TargetLinkCount";
|
||||
private static readonly String colTargetLinkCount_Groups = "TargetLinkCount_Groups";
|
||||
private static readonly String colTargetLinkCount_Rights = "TargetLinkCount_Right";
|
||||
private void SetSecurityItemColDfn
|
||||
(ColumnDfn col, String caption, int width, SaSecurityDbDfn.ColumnIdx dbCol,
|
||||
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
|
||||
String alias = "", String prefix = "")
|
||||
{
|
||||
if (String.IsNullOrEmpty(alias) && SaSecurityDbDfn.GetTableForColumn(dbCol) == SaSecurityDbDfn.TableIdx.SaSecItem)
|
||||
alias = aliasSecurityItem;
|
||||
col.Set(caption, width, (int)dbCol, prefix + SaSecurityDbDfn.GetColumnName(dbCol, false), SaSecurityDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
|
||||
}
|
||||
public override ColumnDfn GetSecurityItemColumnDfn(SaSecurityItem.Column columnId, string caption = "", int width = 0)
|
||||
{
|
||||
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
|
||||
switch (columnId)
|
||||
{
|
||||
case SaSecurityItem.Column.Pos:
|
||||
SetSecurityItemColDfn(columnDfn, "Pos", 45, SaSecurityDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
|
||||
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
|
||||
columnDfn.ReadOnly = true;
|
||||
columnDfn.Resizable = false;
|
||||
break;
|
||||
case SaSecurityItem.Column.Id:
|
||||
SetSecurityItemColDfn(columnDfn, "Id", 60, SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, ColumnAlignment.Right, DataValue.DataType.Long);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaSecurityItem.Column.ItemType:
|
||||
SetSecurityItemColDfn(columnDfn, "Type", 60, SaSecurityDbDfn.ColumnIdx.SaSecItem_Type, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
break;
|
||||
case SaSecurityItem.Column.ItemType_Desc:
|
||||
SetSecurityItemColDfn(columnDfn, "Type", 100, SaSecurityDbDfn.ColumnIdx.SaSecItem_Type, ColumnAlignment.Center);
|
||||
break;
|
||||
case SaSecurityItem.Column.Code:
|
||||
SetSecurityItemColDfn(columnDfn, "Code", 100, SaSecurityDbDfn.ColumnIdx.SaSecItem_Code);
|
||||
break;
|
||||
case SaSecurityItem.Column.Description:
|
||||
SetSecurityItemColDfn(columnDfn, "Caption", 120, SaSecurityDbDfn.ColumnIdx.SaSecItem_Description);
|
||||
break;
|
||||
case SaSecurityItem.Column.Location:
|
||||
SetSecurityItemColDfn(columnDfn, "Location", 100, SaSecurityDbDfn.ColumnIdx.SaSecItem_Location);
|
||||
columnDfn.NumDecimals = 3;
|
||||
break;
|
||||
case SaSecurityItem.Column.LastLogin_Date:
|
||||
SetSecurityItemColDfn(columnDfn, "Last login", 90, SaSecurityDbDfn.ColumnIdx.SaSecItem_LastLogin, ColumnAlignment.Center, DataValue.DataType.Date);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaSecurityItem.Column.OwnerLinkCount:
|
||||
SetSecurityItemColDfn(columnDfn, "Owner links", 90, SaSecurityDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
columnDfn.DataName = colTargetLinkCount_Rights;
|
||||
break;
|
||||
case SaSecurityItem.Column.TargetLinkCount:
|
||||
SetSecurityItemColDfn(columnDfn, "Target links", 90, SaSecurityDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
columnDfn.DataName = colTargetLinkCount;
|
||||
break;
|
||||
case SaSecurityItem.Column.TargetLinkCount_Groups:
|
||||
SetSecurityItemColDfn(columnDfn, "Groups", 80, SaSecurityDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
columnDfn.DataName = colTargetLinkCount_Groups;
|
||||
break;
|
||||
case SaSecurityItem.Column.OwnerLinkCount_Rights:
|
||||
SetSecurityItemColDfn(columnDfn, "Rights", 80, SaSecurityDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
columnDfn.DataName = colTargetLinkCount_Rights;
|
||||
break;
|
||||
case SaSecurityItem.Column.Notes:
|
||||
SetSecurityItemColDfn(columnDfn, "Notes", 240, SaSecurityDbDfn.ColumnIdx.SaSecItem_Notes);
|
||||
break;
|
||||
case SaSecurityItem.Column.Status:
|
||||
SetSecurityItemColDfn(columnDfn, "Status", 80, SaSecurityDbDfn.ColumnIdx.SaSecItem_Status, ColumnAlignment.Center);
|
||||
break;
|
||||
case SaSecurityItem.Column.Status_Desc:
|
||||
SetSecurityItemColDfn(columnDfn, "Status", 90, SaSecurityDbDfn.ColumnIdx.SaSecItem_Status, ColumnAlignment.Center);
|
||||
break;
|
||||
case SaSecurityItem.Column.Status_Ind:
|
||||
SetSecurityItemColDfn(columnDfn, "Status", 80, SaSecurityDbDfn.ColumnIdx.SaSecItem_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
|
||||
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
|
||||
break;
|
||||
case SaSecurityItem.Column.CreateOn_Date:
|
||||
SetSecurityItemColDfn(columnDfn, "Created", 80, SaSecurityDbDfn.ColumnIdx.SaSecItem_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaSecurityItem.Column.UpdateOn_Date:
|
||||
SetSecurityItemColDfn(columnDfn, "Updated", 80, SaSecurityDbDfn.ColumnIdx.SaSecItem_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;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// SecurityItem query filter.
|
||||
public override List<string> GetSecurityItemQueryFilter(SaSecurityItem.Params prm)
|
||||
{
|
||||
List<String> filter = new List<String>();
|
||||
|
||||
// Security Item Id.
|
||||
String colId = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecurityItem);
|
||||
if (prm.IdsIncluded.HasValidIds())
|
||||
filter.Add($"{colId} IN ({prm.IdsIncluded.Concat(",")})");
|
||||
if (prm.IdsExcluded.HasValidIds())
|
||||
filter.Add($"{colId} NOT IN ({prm.IdsExcluded.Concat(",")})");
|
||||
|
||||
// Item type.
|
||||
String colType = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Type, aliasSecurityItem);
|
||||
if (prm.SecurityItemType > 0)
|
||||
filter.Add($"{colType}={(int)prm.SecurityItemType}");
|
||||
|
||||
// Code.
|
||||
String colCode = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, aliasSecurityItem);
|
||||
if (!StringUtil.IsEmpty(prm.Code))
|
||||
filter.Add($"{colCode}='{DbQuery.FormatForCondition(prm.Code)}'");
|
||||
else if (!StringUtil.IsEmpty(prm.CodePartial))
|
||||
filter.Add($"{colCode} LIKE '%{DbQuery.FormatForLike(prm.CodePartial)}%'");
|
||||
|
||||
// Email address.
|
||||
String colEmailAddress = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress, aliasSecurityItem);
|
||||
if (!StringUtil.IsEmpty(prm.EmailAddress))
|
||||
filter.Add($"{colEmailAddress}='{DbQuery.FormatForCondition(prm.EmailAddress)}'");
|
||||
else if (!StringUtil.IsEmpty(prm.EmailAddressPartial))
|
||||
filter.Add($"{colEmailAddress} LIKE '%{DbQuery.FormatForLike(prm.EmailAddressPartial)}%'");
|
||||
|
||||
// Description.
|
||||
String colDesc = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Description, aliasSecurityItem);
|
||||
if (!StringUtil.IsEmpty(prm.Description))
|
||||
filter.Add($"{colDesc}='{DbQuery.FormatForCondition(prm.Description)}'");
|
||||
if (!StringUtil.IsEmpty(prm.DescriptionPartial))
|
||||
filter.Add($"{colDesc} LIKE '%{DbQuery.FormatForLike(prm.DescriptionPartial)}%'");
|
||||
|
||||
// Security Groups.
|
||||
String includedGroupIds = prm.GroupIdsIncluded.Concat(",");
|
||||
if (!includedGroupIds.IsEmpty())
|
||||
filter.Add($"{colId} IN " +
|
||||
"(Select " + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner) +
|
||||
" FROM " + SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.TableIdx.SaSecLink) +
|
||||
" WHERE " + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget) + " IN (" + includedGroupIds + "))");
|
||||
|
||||
// Status.
|
||||
String colStatus = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Status, aliasSecurityItem);
|
||||
if (prm.StatusCat == SaSecurityItem.StatusCat.EnabledOnly)
|
||||
filter.Add($"{colStatus}='{SacsSystem.GetStatusCode(SaStatus.Enabled)}'");
|
||||
else if (prm.StatusCat == SaSecurityItem.StatusCat.DisabledOnly)
|
||||
filter.Add($"{colStatus}='{SacsSystem.GetStatusCode(SaStatus.Disabled)}'");
|
||||
|
||||
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
|
||||
return filter;
|
||||
}
|
||||
// SecurityItem sort columns.
|
||||
public List<String> GetSecurityItemSortColumns(SaSecurityItem.Params prm)
|
||||
{
|
||||
// Sort sequence:
|
||||
List<String> sortColumnNames = new List<String>();
|
||||
foreach (var columnDfn in prm.SortColumns)
|
||||
{
|
||||
// Need to ensure correct alias used for SecurityItem columns in case of conflict.
|
||||
String sortCol = String.Empty;
|
||||
if (SaSecurityDbDfn.GetTableForColumn((SaSecurityDbDfn.ColumnIdx)columnDfn.DbColumn) == SaSecurityDbDfn.TableIdx.SaSecItem)
|
||||
{
|
||||
sortCol = SaSecurityDbDfn.GetColumnNameQual((SaSecurityDbDfn.ColumnIdx)columnDfn.DbColumn, aliasSecurityItem);
|
||||
}
|
||||
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(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Description, aliasSecurityItem) + " ASC");
|
||||
}
|
||||
return sortColumnNames;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// SecurityItem count.
|
||||
private long GetSecurityItemCount(String filter)
|
||||
{
|
||||
ClearErrorState();
|
||||
return Database.GetRowCount($"{TableName_SecItem} As {aliasSecurityItem}", filter);
|
||||
}
|
||||
public override long GetSecurityItemCount(SaSecurityItem.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
return GetSecurityItemCount(GetSecurityItemQueryFilter(prm).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Security Item list.
|
||||
public override List<SaSecurityItem> GetSecurityItemList(SaSecurityItem.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
List<SaSecurityItem> secItems = new List<SaSecurityItem>();
|
||||
DbQuery qry = new DbQuery(Database.DbmsType);
|
||||
qry.Tables.Add(TableName_SecItem, aliasSecurityItem);
|
||||
SaSecItem_Db dbSecurityItem = new SaSecItem_Db(DbInfo);
|
||||
qry.Columns.AddRange(dbSecurityItem.ExistingColumnNames);
|
||||
qry.Filters.AddRange(GetSecurityItemQueryFilter(prm));
|
||||
qry.OrderBy.AddRange(GetSecurityItemSortColumns(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())
|
||||
{
|
||||
dbSecurityItem = new SaSecItem_Db(DbInfo);
|
||||
dbSecurityItem.PopulateFrom(dbDataReader);
|
||||
SaSecurityItem secItem = CreateSecurityItem(dbSecurityItem);
|
||||
secItems.Add(secItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
return secItems;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Security Item Query.
|
||||
public override DbResultSet ExecuteSecurityItemQuery(List<ColumnDfn> columns, SaSecurityItem.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Construct query.
|
||||
DbQuery query = new DbQuery(Database.DbmsType);
|
||||
query.Tables.Add(TableName_SecItem, aliasSecurityItem);
|
||||
|
||||
// Add columns as defined in query list.
|
||||
if (columns.HasId(SaSecurityItem.Column.Id))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.ItemType) || columns.HasId(SaSecurityItem.Column.ItemType_Desc))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Type, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.Code))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.Description))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Description, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.Location))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Location, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.LastLogin_Date))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_LastLogin, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.Notes))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Notes, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.Status) || columns.HasId(SaSecurityItem.Column.Status_Desc) || columns.HasId(SaSecurityItem.Column.Status_Ind))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Status, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_CreateOn, aliasSecurityItem));
|
||||
if (columns.HasId(SaSecurityItem.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_UpdateOn, aliasSecurityItem));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Owner link count.
|
||||
if (columns.HasId(SaSecurityItem.Column.OwnerLinkCount))
|
||||
{
|
||||
String aliasSecLink = "SecLnk";
|
||||
DbQuery querySecLink = new DbQuery(Database.DbmsType);
|
||||
querySecLink.Tables.Add(TableName_SecLink, aliasSecLink);
|
||||
querySecLink.Columns.Add("Count(*)");
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, aliasSecLink) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecurityItem));
|
||||
query.Columns.Add("(" + querySecLink.BuildQuery() + ")", colOwnerLinkCount);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Target link count.
|
||||
if (columns.HasId(SaSecurityItem.Column.TargetLinkCount))
|
||||
{
|
||||
String aliasSecLink = "SecLnk";
|
||||
DbQuery querySecLink = new DbQuery(Database.DbmsType);
|
||||
querySecLink.Tables.Add(TableName_SecLink, aliasSecLink);
|
||||
querySecLink.Columns.Add("Count(*)");
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecLink) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecurityItem));
|
||||
query.Columns.Add("(" + querySecLink.BuildQuery() + ")", colTargetLinkCount);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Target link count - Groups.
|
||||
if (columns.HasId(SaSecurityItem.Column.TargetLinkCount_Groups))
|
||||
{
|
||||
// TODO Users 'own' Group items - should be otehr way around!
|
||||
String aliasSecLink = "SecLnk";
|
||||
String aliasSecLink_Item = "SecItmItm";
|
||||
DbQuery querySecLink = new DbQuery(Database.DbmsType);
|
||||
querySecLink.Tables.Add(TableName_SecLink, aliasSecLink);
|
||||
querySecLink.Tables.Add(TableName_SecItem, aliasSecLink_Item);
|
||||
querySecLink.Columns.Add("Count(*)");
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, aliasSecLink) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecurityItem));
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecLink_Item) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecLink));
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Type, aliasSecLink_Item) + "=" + (int)SaSecurity.ItemType.Group);
|
||||
query.Columns.Add("(" + querySecLink.BuildQuery() + ")", colTargetLinkCount_Groups);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Target link count - Rights.
|
||||
if (columns.HasId(SaSecurityItem.Column.OwnerLinkCount_Rights))
|
||||
{
|
||||
String aliasSecLink = "SecLnk";
|
||||
String aliasSecLink_Item = "SecItmItm";
|
||||
DbQuery querySecLink = new DbQuery(Database.DbmsType);
|
||||
querySecLink.Tables.Add(TableName_SecLink, aliasSecLink);
|
||||
querySecLink.Tables.Add(TableName_SecItem, aliasSecLink_Item);
|
||||
querySecLink.Columns.Add("Count(*)");
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, aliasSecLink) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecurityItem));
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasSecLink_Item) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecLink));
|
||||
querySecLink.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Type, aliasSecLink_Item) + "=" + (int)SaSecurity.ItemType.Right);
|
||||
query.Columns.Add("(" + querySecLink.BuildQuery() + ")", colTargetLinkCount_Rights);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetSecurityItemQueryFilter(prm));
|
||||
|
||||
if (prm.IdsIncluded.Count != 1)
|
||||
{
|
||||
// Configure sort sequence.
|
||||
foreach (String sortColumn in GetSecurityItemSortColumns(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,508 @@
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
using Sarand.Net.Standard.Dbas.Security.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
partial class SaSecurityMgr_Dbas
|
||||
{
|
||||
//*******************************************************************
|
||||
// S e c u r i t y L i n k s
|
||||
//*******************************************************************
|
||||
// Security Link exists.
|
||||
private String GetSecurityLinkFilter(SysId itemIdOwner, SysId itemIdTarget, SysId itemIdContext)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaSecurityLink.Params prm = new SaSecurityLink.Params();
|
||||
prm.ItemIdsOwnerIncluded.Add(itemIdOwner);
|
||||
prm.ItemIdsTargetIncluded.Add(itemIdTarget);
|
||||
prm.ItemIdsContextIncluded.Add(itemIdContext);
|
||||
prm.StatusCat = SaSecurityLink.StatusCat.Any;
|
||||
return GetSecurityLinkQueryFilter(prm).Concat(" AND ", "(", ")");
|
||||
}
|
||||
public override bool SecurityLinkExistsByItemsIds(SysId itemIdOwner, SysId itemIdTarget, SysId itemIdContext)
|
||||
{
|
||||
ClearErrorState();
|
||||
return GetSecurityItemCount(GetSecurityLinkFilter(itemIdOwner, itemIdTarget, itemIdContext)) == 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get Security Link.
|
||||
private SaSecurityLink GetSecurityLink(String filter)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (GetSecurityLinkCount(filter) != 1) return null;
|
||||
SaSecurityLink securityLink = null;
|
||||
// Query data.
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
dbConnection.Open();
|
||||
SaSecLink_Db dbSecurityLink = new SaSecLink_Db(DbInfo);
|
||||
dbSecurityLink.PopulateFrom(dbCommand, aliasSecurityLink, filter);
|
||||
securityLink = CreateSecurityLink(dbSecurityLink);
|
||||
PopulateFrom(dbSecurityLink, securityLink);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
return securityLink;
|
||||
}
|
||||
public override SaSecurityLink GetSecurityLinkByItemsIds(SysId itemIdOwner, SysId itemIdTarget, SysId itemIdContext)
|
||||
{
|
||||
ClearErrorState();
|
||||
return GetSecurityLink(GetSecurityLinkFilter(itemIdOwner, itemIdTarget, itemIdContext));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Create item.
|
||||
public override SaSecurityLink CreateSecurityLink(SysId itemIdOwner, SysId itemIdTarget, SysId itemIdContext)
|
||||
{
|
||||
ClearErrorState();
|
||||
return new SaSecurityLink_Dbas(itemIdOwner, itemIdTarget, itemIdContext, 0);
|
||||
}
|
||||
private SaSecurityLink CreateSecurityLink(SaSecLink_Db dbSecLink)
|
||||
{
|
||||
ClearErrorState();
|
||||
return new SaSecurityLink_Dbas(new SysId(dbSecLink._ItemOwner), new SysId(dbSecLink._ItemTarget), new SysId(dbSecLink._ItemContext), (ushort)dbSecLink._Flags);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Validate item.
|
||||
public override bool IsValidSecurityLinkData(SaSecurityLink.Data securityLinkData, SaSecurityLink.ErrField errField)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.IsValidSecurityLinkData(securityLinkData, errField)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Insert item.
|
||||
public override bool InsertSecurityLink(SaSecurityLink securityLink, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!IsValidSecurityLink(securityLink)) return false;
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
dbConnection.Open();
|
||||
SaSecLink_Db dbSecurityLink = new SaSecLink_Db(DbInfo);
|
||||
PopulateTo(dbSecurityLink, securityLink, dbUpdateInfo);
|
||||
dbSecurityLink.ExecuteInsertCommand(dbCommand);
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
public override bool UpdateSecurityLink(SaSecurityLink securityLink, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!IsValidSecurityLink(securityLink)) return false;
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
// Retrieve item.
|
||||
dbConnection.Open();
|
||||
SaSecLink_Db dbSecurityLink = new SaSecLink_Db(DbInfo);
|
||||
dbSecurityLink.PopulateFrom(dbCommand, aliasSecurityLink, GetSecurityLinkFilter(securityLink.ItemIdOwner, securityLink.ItemIdTarget, securityLink.ItemIdContext));
|
||||
// TODO SlmUpdateLogItemMonitor_SecurityLink updateLogMonitor = new SlmUpdateLogItemMonitor_SecurityLink(prsAssMov, dbUpdateInfo);
|
||||
// Update item.
|
||||
PopulateTo(dbSecurityLink, securityLink, dbUpdateInfo);
|
||||
dbSecurityLink.ExecuteUpdateCommand(dbCommand);
|
||||
// TODO updateLogMonitor.RecordUpdatedValues(pAssMov);
|
||||
// TODO updateLogMonitor.LogUpdates();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
public override bool SecurityLinkCanBeDeleted(SaSecurityLink securityLink)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.SecurityLinkCanBeDeleted(securityLink)) return false;
|
||||
return true;
|
||||
}
|
||||
public override bool DeleteSecurityLink(SaSecurityLink securityLink, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
// Retrieve item.
|
||||
dbConnection.Open();
|
||||
SaSecLink_Db dbSecurityLink = new SaSecLink_Db(DbInfo);
|
||||
dbSecurityLink.PopulateFrom(dbCommand, aliasSecurityLink, GetSecurityLinkFilter(securityLink.ItemIdOwner, securityLink.ItemIdTarget, securityLink.ItemIdContext));
|
||||
// Delete item.
|
||||
dbCommand.CommandType = System.Data.CommandType.Text;
|
||||
dbCommand.CommandText =
|
||||
"DELETE " + aliasSecurityLink + " FROM " + TableName_SecLink + " AS " + aliasSecurityLink +
|
||||
" WHERE " + GetSecurityLinkFilter(securityLink.ItemIdOwner, securityLink.ItemIdTarget, securityLink.ItemIdContext) + ";";
|
||||
dbCommand.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Copy data properties to and from database.
|
||||
private void PopulateTo(SaSecLink_Db dbSecurityLink, SaSecurityLink securityLink, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
dbSecurityLink._ItemOwner = SysId.ToInt(securityLink.ItemIdOwner);
|
||||
dbSecurityLink._ItemTarget = SysId.ToInt(securityLink.ItemIdTarget);
|
||||
dbSecurityLink._ItemContext = SysId.ToInt(securityLink.ItemIdContext);
|
||||
dbSecurityLink._DayApplic = securityLink.DayApplicability;
|
||||
dbSecurityLink._DateApplicFrom = DateUtil.DateToInt32(securityLink.ApplicableFrom ?? DateTime.MinValue);
|
||||
dbSecurityLink._DateApplicTo = DateUtil.DateToInt32(securityLink.ApplicableTo ?? DateTime.MinValue);
|
||||
dbSecurityLink._Status = SacsSystem.GetStatusCode(securityLink.Status);
|
||||
dbSecurityLink._Flags = (short)securityLink.Flags;
|
||||
if (dbSecurityLink._CreateOn == DateTime.MinValue)
|
||||
{
|
||||
dbSecurityLink._CreateOn = DateTime.Now;
|
||||
dbSecurityLink._CreateBy = dbUpdateInfo.UserId.ToInt();
|
||||
dbSecurityLink._CreateHost = dbUpdateInfo.Host;
|
||||
}
|
||||
dbSecurityLink._UpdateOn = DateTime.Now;
|
||||
dbSecurityLink._UpdateBy = dbUpdateInfo.UserId.ToInt();
|
||||
dbSecurityLink._UpdateHost = dbUpdateInfo.Host;
|
||||
}
|
||||
private void PopulateFrom(SaSecLink_Db dbSecurityLink, SaSecurityLink securityLink)
|
||||
{
|
||||
//securityLink.Id = new SysId(dbSecurityLink._Id);
|
||||
//securityLink.ItemIdOwner = new SysId(dbSecurityLink._ItemOwner);
|
||||
//securityLink.ItemIdTarget = new SysId(dbSecurityLink._ItemTarget);
|
||||
//securityLink.ItemIdContext = new SysId(dbSecurityLink._ItemContext);
|
||||
securityLink.DayApplicability = dbSecurityLink._DayApplic;
|
||||
securityLink.ApplicableFrom = DateUtil.Int32ToDate(dbSecurityLink._DateApplicFrom ?? 0);
|
||||
securityLink.ApplicableTo = DateUtil.Int32ToDate(dbSecurityLink._DateApplicTo ?? 0);
|
||||
securityLink.Status = SacsSystem.GetStatusForCode(dbSecurityLink._Status);
|
||||
securityLink.SetCreateStamp(dbSecurityLink._CreateOn, new SysId(dbSecurityLink._CreateBy), dbSecurityLink._CreateHost);
|
||||
securityLink.SetUpdateStamp(dbSecurityLink._UpdateOn, new SysId(dbSecurityLink._UpdateBy), dbSecurityLink._UpdateHost);
|
||||
securityLink.AcceptChanges();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// SecurityLink column definitions.
|
||||
private static readonly String aliasSecurityLink = "aSecLnk";
|
||||
private static readonly String aliasSecLnk_ItemOwner = "aSitOwn";
|
||||
private static readonly String aliasSecLnk_ItemTarget = "aSitTgt";
|
||||
private static readonly String colPrefixSecLnk_ItemOwner = "SitOwn_";
|
||||
private static readonly String colPrefixSecLnk_ItemTarget = "SitTgt_";
|
||||
private void SetSecurityLinkColDfn
|
||||
(ColumnDfn col, String caption, int width, SaSecurityDbDfn.ColumnIdx dbCol,
|
||||
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
|
||||
String alias = "", String prefix = "")
|
||||
{
|
||||
if (String.IsNullOrEmpty(alias) && SaSecurityDbDfn.GetTableForColumn(dbCol) == SaSecurityDbDfn.TableIdx.SaSecLink)
|
||||
alias = aliasSecurityLink;
|
||||
col.Set(caption, width, (int)dbCol, prefix + SaSecurityDbDfn.GetColumnName(dbCol, false), SaSecurityDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
|
||||
}
|
||||
public override ColumnDfn GetSecurityLinkColumnDfn(SaSecurityLink.Column columnId, string caption = "", int width = 0)
|
||||
{
|
||||
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
|
||||
switch (columnId)
|
||||
{
|
||||
case SaSecurityLink.Column.Pos:
|
||||
SetSecurityLinkColDfn(columnDfn, "Pos", 45, SaSecurityDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
|
||||
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
|
||||
columnDfn.ReadOnly = true;
|
||||
columnDfn.Resizable = false;
|
||||
break;
|
||||
// Owner item.
|
||||
case SaSecurityLink.Column.ItemIdOwner:
|
||||
SetSecurityLinkColDfn(columnDfn, "Owner Id", 75, SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, ColumnAlignment.Right, DataValue.DataType.Long);
|
||||
break;
|
||||
case SaSecurityLink.Column.ItemOwner_Code:
|
||||
SetSecurityLinkColDfn(columnDfn, "Owner code", 80, SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasSecLnk_ItemOwner, colPrefixSecLnk_ItemOwner);
|
||||
break;
|
||||
case SaSecurityLink.Column.ItemOwner_Desc:
|
||||
SetSecurityLinkColDfn(columnDfn, "Owner desc", 100, SaSecurityDbDfn.ColumnIdx.SaSecItem_Description, ColumnAlignment.Left, DataValue.DataType.String, aliasSecLnk_ItemOwner, colPrefixSecLnk_ItemOwner);
|
||||
break;
|
||||
// Target item.
|
||||
case SaSecurityLink.Column.ItemIdTarget:
|
||||
SetSecurityLinkColDfn(columnDfn, "Target Id", 75, SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, ColumnAlignment.Right, DataValue.DataType.Long);
|
||||
break;
|
||||
case SaSecurityLink.Column.ItemTarget_Code:
|
||||
SetSecurityLinkColDfn(columnDfn, "Target code", 80, SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasSecLnk_ItemTarget, colPrefixSecLnk_ItemTarget);
|
||||
break;
|
||||
case SaSecurityLink.Column.ItemTarget_Desc:
|
||||
SetSecurityLinkColDfn(columnDfn, "Target desc", 100, SaSecurityDbDfn.ColumnIdx.SaSecItem_Description, ColumnAlignment.Left, DataValue.DataType.String, aliasSecLnk_ItemTarget, colPrefixSecLnk_ItemTarget);
|
||||
break;
|
||||
// Context item.
|
||||
case SaSecurityLink.Column.ItemIdContext:
|
||||
SetSecurityLinkColDfn(columnDfn, "Context Id", 75, SaSecurityDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Long);
|
||||
break;
|
||||
case SaSecurityLink.Column.ItemContext_Desc:
|
||||
SetSecurityLinkColDfn(columnDfn, "Context item", 120, SaSecurityDbDfn.ColumnIdx.Unknown);
|
||||
break;
|
||||
case SaSecurityLink.Column.DaysApplicable:
|
||||
SetSecurityLinkColDfn(columnDfn, "Days applicable", 100, SaSecurityDbDfn.ColumnIdx.SaSecLink_DayApplic, ColumnAlignment.Center, DataValue.DataType.String);
|
||||
break;
|
||||
case SaSecurityLink.Column.DateApplicableFrom:
|
||||
SetSecurityLinkColDfn(columnDfn, "Applic from", 90, SaSecurityDbDfn.ColumnIdx.SaSecLink_DateApplicFrom, ColumnAlignment.Center, DataValue.DataType.Date);
|
||||
break;
|
||||
case SaSecurityLink.Column.DateApplicableTo:
|
||||
SetSecurityLinkColDfn(columnDfn, "Applic To", 90, SaSecurityDbDfn.ColumnIdx.SaSecLink_DateApplicTo, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
break;
|
||||
case SaSecurityLink.Column.Granted_Y:
|
||||
SetSecurityLinkColDfn(columnDfn, "Granted", 80, SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, ColumnAlignment.Center);
|
||||
break;
|
||||
case SaSecurityLink.Column.Denied_X:
|
||||
SetSecurityLinkColDfn(columnDfn, "Denied", 80, SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, ColumnAlignment.Center);
|
||||
break;
|
||||
case SaSecurityLink.Column.Status:
|
||||
SetSecurityLinkColDfn(columnDfn, "Status", 80, SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, ColumnAlignment.Center);
|
||||
break;
|
||||
case SaSecurityLink.Column.Status_Desc:
|
||||
SetSecurityLinkColDfn(columnDfn, "Status", 90, SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, ColumnAlignment.Center);
|
||||
break;
|
||||
case SaSecurityLink.Column.Status_Ind:
|
||||
SetSecurityLinkColDfn(columnDfn, "Status", 80, SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
|
||||
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
|
||||
break;
|
||||
case SaSecurityLink.Column.CreateOn_Date:
|
||||
SetSecurityLinkColDfn(columnDfn, "Created", 80, SaSecurityDbDfn.ColumnIdx.SaSecLink_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaSecurityLink.Column.UpdateOn_Date:
|
||||
SetSecurityLinkColDfn(columnDfn, "Updated", 80, SaSecurityDbDfn.ColumnIdx.SaSecLink_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;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// SecurityLink query filter.
|
||||
public override List<string> GetSecurityLinkQueryFilter(SaSecurityLink.Params prm)
|
||||
{
|
||||
List<String> filter = new List<String>();
|
||||
|
||||
// Force DBMS type.
|
||||
DbQuery qry = new DbQuery(Database.DbmsType);
|
||||
|
||||
// Owner Item Ids.
|
||||
String colItemOwner = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, aliasSecurityLink);
|
||||
String ownerItemIds = prm.ItemIdsOwnerIncluded.Concat(",");
|
||||
if (!ownerItemIds.IsEmpty())
|
||||
filter.Add(colItemOwner + " IN (" + ownerItemIds + ")");
|
||||
|
||||
// Owner item type.
|
||||
if ((int)prm.OwnerItemType > 0)
|
||||
filter.Add(colItemOwner + " IN (SELECT " + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id) + " FROM " + TableName_SecItem + " WHERE " + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Type) + "=" + ((int)prm.OwnerItemType).ToString() + ")");
|
||||
|
||||
// Target Item Ids.
|
||||
String colItemTarget = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecurityLink);
|
||||
String targetItemIds = prm.ItemIdsTargetIncluded.Concat(",");
|
||||
if (!targetItemIds.IsEmpty())
|
||||
filter.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecurityLink) + " IN (" + targetItemIds + ")");
|
||||
|
||||
// Taregt item type.
|
||||
if ((int)prm.TargetItemType > 0)
|
||||
filter.Add(colItemTarget + " IN (SELECT " + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id) + " FROM " + TableName_SecItem + " WHERE " + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Type) + "=" + ((int)prm.TargetItemType).ToString() + ")");
|
||||
|
||||
// Context Item Ids.
|
||||
String contextItemIds = prm.ItemIdsContextIncluded.Concat(",");
|
||||
if (!contextItemIds.IsEmpty())
|
||||
filter.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemContext, aliasSecurityLink) + " IN (" + contextItemIds + ")");
|
||||
|
||||
// Status.
|
||||
String colStatus = SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, aliasSecurityLink);
|
||||
if (prm.StatusCat == SaSecurityLink.StatusCat.GrantedOnly)
|
||||
filter.Add(colStatus + "='" + SacsSystem.GetStatusCode(SaStatus.Granted) + "'");
|
||||
else if (prm.StatusCat == SaSecurityLink.StatusCat.DeniedOnly)
|
||||
filter.Add(colStatus + "='" + SacsSystem.GetStatusCode(SaStatus.Denied) + "'");
|
||||
|
||||
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
|
||||
return filter;
|
||||
}
|
||||
// Security Link sort columns.
|
||||
public List<String> GetSecurityLinkSortColumns(SaSecurityLink.Params prm)
|
||||
{
|
||||
// Sort sequence:
|
||||
List<String> sortColumnNames = new List<String>();
|
||||
foreach (var columnDfn in prm.SortColumns)
|
||||
{
|
||||
// Need to ensure correct alias used for SecurityLink columns in case of conflict.
|
||||
String sortCol = String.Empty;
|
||||
if (SaSecurityDbDfn.GetTableForColumn((SaSecurityDbDfn.ColumnIdx)columnDfn.DbColumn) == SaSecurityDbDfn.TableIdx.SaSecLink)
|
||||
{
|
||||
sortCol = SaSecurityDbDfn.GetColumnNameQual((SaSecurityDbDfn.ColumnIdx)columnDfn.DbColumn, aliasSecurityLink);
|
||||
}
|
||||
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(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, aliasSecurityLink) + " ASC");
|
||||
sortColumnNames.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecurityLink) + " ASC");
|
||||
}
|
||||
return sortColumnNames;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// SecurityLink count.
|
||||
private long GetSecurityLinkCount(String filter)
|
||||
{
|
||||
ClearErrorState();
|
||||
return Database.GetRowCount($"{TableName_SecLink} As {aliasSecurityLink}", filter);
|
||||
}
|
||||
public override long GetSecurityLinkCount(SaSecurityLink.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
return GetSecurityLinkCount(GetSecurityLinkQueryFilter(prm).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Security Link list.
|
||||
public override List<SaSecurityLink> GetSecurityLinkList(SaSecurityLink.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
List<SaSecurityLink> secLinks = new List<SaSecurityLink>();
|
||||
DbQuery qry = new DbQuery(Database.DbmsType);
|
||||
qry.Tables.Add(TableName_SecLink, aliasSecurityLink);
|
||||
SaSecLink_Db dbSecurityLink = new SaSecLink_Db(DbInfo);
|
||||
qry.Columns.AddRange(dbSecurityLink.ExistingColumnNames);
|
||||
qry.Filters.AddRange(GetSecurityLinkQueryFilter(prm));
|
||||
qry.OrderBy.AddRange(GetSecurityLinkSortColumns(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())
|
||||
{
|
||||
dbSecurityLink = new SaSecLink_Db(DbInfo);
|
||||
dbSecurityLink.PopulateFrom(dbDataReader);
|
||||
SaSecurityLink secLink = CreateSecurityLink(dbSecurityLink);
|
||||
PopulateFrom(dbSecurityLink, secLink);
|
||||
secLinks.Add(secLink);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
return secLinks;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Security Link query.
|
||||
public override DbResultSet ExecuteSecurityLinkQuery(List<ColumnDfn> columns, SaSecurityLink.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Construct query.
|
||||
DbQuery query = new DbQuery(Database.DbmsType);
|
||||
query.Tables.Add(TableName_SecLink, aliasSecurityLink);
|
||||
if (columns.HasId(SaSecurityLink.Column.ItemIdOwner))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.ItemIdTarget))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.ItemIdContext) || columns.HasId(SaSecurityLink.Column.ItemContext_Desc))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemContext, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.DaysApplicable))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_DayApplic, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.DateApplicableFrom))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_DateApplicFrom, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.DateApplicableTo))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_DateApplicTo, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.Status) || columns.HasId(SaSecurityLink.Column.Status_Desc) || columns.HasId(SaSecurityLink.Column.Status_Ind) || columns.HasId(SaSecurityLink.Column.Granted_Y) || columns.HasId(SaSecurityLink.Column.Denied_X))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_CreateOn, aliasSecurityLink));
|
||||
if (columns.HasId(SaSecurityLink.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_UpdateOn, aliasSecurityLink));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Owner item.
|
||||
if (columns.HasId(SaSecurityLink.Column.ItemOwner_Code) || columns.HasId(SaSecurityLink.Column.ItemOwner_Desc))
|
||||
{
|
||||
String aliasItemOwner = "aItmOwn";
|
||||
DbQueryJoin joinItmOwn = new DbQueryJoin(DbJoinType.LeftOuter);
|
||||
joinItmOwn.Table = new StringPair(TableName_SecItem, aliasItemOwner);
|
||||
joinItmOwn.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasItemOwner) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, aliasSecurityLink));
|
||||
query.Joins.Add(joinItmOwn);
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, aliasItemOwner), colPrefixSecLnk_ItemOwner + SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_Code));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Target item.
|
||||
if (columns.HasId(SaSecurityLink.Column.ItemTarget_Code) || columns.HasId(SaSecurityLink.Column.ItemTarget_Desc))
|
||||
{
|
||||
String aliasItemTarget = "aItmTgt";
|
||||
DbQueryJoin joinItmTgt = new DbQueryJoin(DbJoinType.LeftOuter);
|
||||
joinItmTgt.Table = new StringPair(TableName_SecItem, aliasItemTarget);
|
||||
joinItmTgt.Filters.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Id, aliasItemTarget) + "=" + SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, aliasSecurityLink));
|
||||
query.Joins.Add(joinItmTgt);
|
||||
query.Columns.Add(SaSecurityDbDfn.GetColumnNameQual(SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, aliasItemTarget), colPrefixSecLnk_ItemTarget + SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_Code));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetSecurityLinkQueryFilter(prm));
|
||||
|
||||
// Configure sort sequence.
|
||||
foreach (String sortColumn in GetSecurityLinkSortColumns(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,241 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
internal partial class SaSecurityMgr_Dbas : SaSecurityMgr
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
internal SaSecurityMgr_Dbas(SaSecurityConsole_Dbas securityConsole) : base()
|
||||
{
|
||||
SecurityConsole = securityConsole;
|
||||
DbInfo = new DbDataItem.DatabaseInfo(securityConsole.Database);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal SaSecurityConsole_Dbas SecurityConsole { get; }
|
||||
internal ISacsDatabase Database { get { return SecurityConsole.Database; } }
|
||||
private DbDataItem.DatabaseInfo DbInfo { get; }
|
||||
public String TableName_SecItem { get { return SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.TableIdx.SaSecItem); } }
|
||||
public String TableName_SecLink { get { return SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.TableIdx.SaSecLink); } }
|
||||
public override bool DatabaseIsValid { get { return (Database != null && Database.GetTableNames().Contains(TableName_SecItem) && Database.GetTableNames().Contains(TableName_SecLink)); } }
|
||||
public override bool CanUpdateDatabase { get { return DatabaseIsValid; } }
|
||||
|
||||
// Database utilities.
|
||||
public override bool ColumnExists(SaSecurityDbDfn.ColumnIdx columnIdx)
|
||||
{
|
||||
String tableName = SaSecurityDbDfn.GetTableName(SaSecurityDbDfn.GetTableForColumn(columnIdx), false);
|
||||
String columnName = SaSecurityDbDfn.GetColumnName(columnIdx, false);
|
||||
return Database.ColumnExists(tableName, columnName);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Password utilities.
|
||||
|
||||
/// <summary>Store the password against against the user.</summary>
|
||||
public override bool SetPassword(SaSecurityItem securityItemUser, String password)
|
||||
{
|
||||
SaSecurity.PasswordStorageMethod method = SaSecurity.PasswordStorageMethod.Legacy;
|
||||
|
||||
// If the Password Salt/Hash columns exist, attempt to encode password using non-legacy method.
|
||||
if (ColumnExists(SaSecurityDbDfn.ColumnIdx.SaSecItem_PwordSalt) && ColumnExists(SaSecurityDbDfn.ColumnIdx.SaSecItem_PwordHash))
|
||||
{
|
||||
// NB Do not use Microsoft.AspNetCore.Identity.PasswordHasher.HashPassword() while legacy (C++) desktop application still in use.
|
||||
// Encode password using MS SQL utilities.
|
||||
String passwordHashHex_MsSql = EncodePassword_Hex(password, SaSecurity.PasswordHashMethod.MsSql);
|
||||
if (!StringUtil.IsBlank(passwordHashHex_MsSql) && ComparePassword_Hex(password, passwordHashHex_MsSql, SaSecurity.PasswordHashMethod.MsSql))
|
||||
{
|
||||
// MS SQL encoded password is valid.
|
||||
securityItemUser.SetEncodedPassword(SaSecurity.PasswordStorageMethod.MsSql, passwordHashHex_MsSql);
|
||||
method = SaSecurity.PasswordStorageMethod.MsSql;
|
||||
}
|
||||
}
|
||||
|
||||
if (method == SaSecurity.PasswordStorageMethod.Legacy)
|
||||
{
|
||||
// Default to legacy method.
|
||||
securityItemUser.SetEncodedPassword(SaSecurity.PasswordStorageMethod.Legacy, EncodePassword_Legacy(password));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>Is the password currently defined against the user blank.</summary>
|
||||
public override bool PasswordIsBlank(SaSecurityItem securityItemUser)
|
||||
{
|
||||
return PasswordMatches(securityItemUser, "", null);
|
||||
}
|
||||
|
||||
/// <summary>Does the password match that currently defined against the user.</summary>
|
||||
public override bool PasswordMatches(SaSecurityItem securityItemUser, String password, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
if (securityItemUser == null) return false;
|
||||
SaSecurity.PasswordStorageMethod method = securityItemUser.GetPasswordMethod();
|
||||
if (method == SaSecurity.PasswordStorageMethod.MsSql)
|
||||
{
|
||||
// MsSql method.
|
||||
return ComparePassword_Hex(password, securityItemUser.PasswordHash, SaSecurity.PasswordHashMethod.MsSql);
|
||||
}
|
||||
|
||||
// Legacy method.
|
||||
#pragma warning disable CS0618 // Deprecated property
|
||||
bool matches = (EncodePassword_Legacy(password).Equals(securityItemUser.PasswordEncrypted));
|
||||
#pragma warning restore CS0618 // Deprecated property
|
||||
if (matches && !StringUtil.IsBlank(password))
|
||||
{
|
||||
SetPassword(securityItemUser, password);
|
||||
if (securityItemUser.GetPasswordMethod() != SaSecurity.PasswordStorageMethod.Legacy)
|
||||
UpdateSecurityItem(securityItemUser, dbUpdateInfo);
|
||||
}
|
||||
return matches;
|
||||
}
|
||||
|
||||
internal static String EncodePassword_Legacy(String password)
|
||||
{
|
||||
// We know this is not very water-tight, but it at least
|
||||
// hides the contents of the password from prying eyes.
|
||||
String toBeEncrypted = password;
|
||||
// Password length goes in as first character:
|
||||
toBeEncrypted = ByteToString((byte)(128 - password.Length)) + toBeEncrypted;
|
||||
toBeEncrypted = string.Concat(toBeEncrypted.Reverse());
|
||||
// Pad out to fixed length (minimum 16, multiples of 8):
|
||||
int fixedLength = 16;
|
||||
if (password.Length / 8 > 2) fixedLength = 8 * (int)(password.Length / 8);
|
||||
while (toBeEncrypted.Length < fixedLength)
|
||||
{
|
||||
char charToAdd = (char)(password.Length > 0 ? password[(toBeEncrypted.Length % password.Length)] : 'A' + (toBeEncrypted.Length * 13) % 23);
|
||||
if (toBeEncrypted.Length % 2 != 0)
|
||||
toBeEncrypted += charToAdd;
|
||||
else toBeEncrypted = charToAdd + toBeEncrypted;
|
||||
}
|
||||
|
||||
// Now perform a simple algorythm on each character to hide its true value:
|
||||
byte[] encryptedChars = new byte[toBeEncrypted.Length];
|
||||
for (int i = 0; i < toBeEncrypted.Length; i++)
|
||||
{
|
||||
int iData = toBeEncrypted[i];
|
||||
iData += 17 + i;
|
||||
if (iData > 255) iData -= (255 + 32);
|
||||
encryptedChars[i] = (byte)iData;
|
||||
}
|
||||
String result = Encoding_Ansi1252.GetString(encryptedChars);
|
||||
#if DEBUG
|
||||
// Password: mgbgt
|
||||
// To encrypt: tbmggtgbgm{btggm
|
||||
// Encrypted: 133, 116, 128, 123, 124, 138, 126, 122, 128, 135, 150, 126, 145, 133, 134, 141
|
||||
//Logger.Info(fn + "\n\tPassword: " + password + "\n\tTo encrypt: " + toBeEncrypted + "\n\tEncrypted: " + encryptedChars.Select(i => i.ToString()).ToList().Concat(", "));
|
||||
//Logger.Debug(password + ": " + result);
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
private static byte[] PasswordStringToBytes(String value)
|
||||
{
|
||||
byte[] values = new byte[value.Length];
|
||||
for (int idx = 0; idx < value.Length; idx++)
|
||||
{
|
||||
char c = value[idx];
|
||||
UInt32 ui = Convert.ToUInt32(c);
|
||||
SaLogger.Info(idx + ". " + ui.ToString("x8"));
|
||||
values[idx] = (byte)(c);
|
||||
}
|
||||
return values;
|
||||
}
|
||||
private static readonly Encoding Encoding_Ansi1252 = Encoding.GetEncoding(1252);
|
||||
private static String ByteToString(byte value)
|
||||
{
|
||||
return Encoding_Ansi1252.GetString(new[] { value });
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Password Database utilities.
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate password hash using the specified method.
|
||||
/// <para>- Returns hex notation as a string.</para>
|
||||
/// </summary>
|
||||
/// <param name="password"></param>
|
||||
/// <returns>String of hex digits corresponding to encrypted password.</returns>
|
||||
public override String EncodePassword_Hex(String password, SaSecurity.PasswordHashMethod method = SaSecurity.PasswordHashMethod.MsSql)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (method == SaSecurity.PasswordHashMethod.MsSql)
|
||||
{
|
||||
if (Database.DbmsType == DbmsType.MsSql)
|
||||
{
|
||||
try
|
||||
{
|
||||
String colAlias = "DataValue";
|
||||
String query = $"Select {colAlias}=Convert(VarChar(2000),PwdEncrypt('{DbQuery.FormatForCondition(password)}'),2);";
|
||||
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, query))
|
||||
{
|
||||
if (dbResultSet.NextRecord())
|
||||
return dbResultSet.GetRecordValues().GetValue(colAlias).ToString();
|
||||
else if (dbResultSet.HasErrorState())
|
||||
SetErrorState(dbResultSet.ErrorStateMessage);
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc, "hashing password")}", true);
|
||||
SetErrorState(exc.Message);
|
||||
}
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to encode password by method 'SQL'. Database is '{Database.DbmsType}'.");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to encode password. Unrecognised method: '{method}'.");
|
||||
return "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compare the password to the encrypted hash using the specified method.
|
||||
/// </summary>
|
||||
/// <param name="password"></param>
|
||||
/// <param name="passwordHashHex"></param>
|
||||
/// <returns>True if the password matches the encrypted hash value.</returns>
|
||||
public override bool ComparePassword_Hex(String password, String passwordHashHex, SaSecurity.PasswordHashMethod method = SaSecurity.PasswordHashMethod.MsSql)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (method == SaSecurity.PasswordHashMethod.MsSql)
|
||||
{
|
||||
if (Database.DbmsType == DbmsType.MsSql)
|
||||
{
|
||||
try
|
||||
{
|
||||
String colAlias = "PwdCompare";
|
||||
String query = $"Select {colAlias}=PwdCompare('{DbQuery.FormatForCondition(password)}', Convert(VarBinary(1000),'{DbQuery.FormatForCondition(passwordHashHex)}',2));";
|
||||
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, query))
|
||||
{
|
||||
if (dbResultSet.NextRecord())
|
||||
return StringUtil.ToBool(dbResultSet.GetRecordValues().GetValue(colAlias).ToString());
|
||||
else if (dbResultSet.HasErrorState())
|
||||
SetErrorState(dbResultSet.ErrorStateMessage);
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SaLogger.Error($"{SysUtil.Fn} {ExceptionUtil.GetLogMessage(exc, "comparing password")}", true);
|
||||
SetErrorState(exc.Message);
|
||||
}
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to compare password by method 'SQL'. Database is '{Database.DbmsType}'.");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to compare password. Unrecognised method: '{method}'.");
|
||||
return false;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
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.Base.UpdateLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
public class SaUpdateLogItemMonitor_SecurityItem : SaUpdateLogItemMonitor
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Configuration.
|
||||
public new class Config : SaUpdateLogItemMonitor.Config
|
||||
{
|
||||
public Config (SaUpdateLogConsole updateLogConsole, SysId itemId, DbUpdateInfo dbUpdateInfo) :
|
||||
base(updateLogConsole, dbUpdateInfo)
|
||||
{
|
||||
ItemType = (short)SaDataItemType.SecurityItem;
|
||||
ItemId = itemId;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
private readonly List<TypeCodeDesc> securityItemTypes;
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public SaUpdateLogItemMonitor_SecurityItem (SaSecurityConsole securityConsole, SaSecurityItem securityItem, DbUpdateInfo dbUpdateInfo) :
|
||||
base(new Config(securityConsole.UpdateLogConsole, securityItem.Id, dbUpdateInfo))
|
||||
{
|
||||
securityItemTypes = SaSecurityConsole.SecurityItemTypes;
|
||||
RecordAttrValues(securityItem, false);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Record attribute values.
|
||||
public bool RecordUpdatedValues (SaSecurityItem securityItem)
|
||||
{
|
||||
return RecordAttrValues(securityItem, true);
|
||||
}
|
||||
private bool RecordAttrValues (SaSecurityItem securityItem, bool newValues)
|
||||
{
|
||||
ClearErrorState();
|
||||
|
||||
// Security Item Properties - record values that may require logging.
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_Type, false), securityItemTypes.GetCodeForType(securityItem.ItemType, securityItem.ItemType.ToString()), newValues);
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_Code, false), securityItem.Code, newValues);
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_EmailAddress, false), securityItem.EmailAddress, newValues);
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_Description, false), securityItem.Description, newValues);
|
||||
// Common properties.
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_Notes, false), securityItem.Notes, newValues);
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecItem_Status, false), securityItem.StatusCode, newValues);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
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.Base.UpdateLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.Security
|
||||
{
|
||||
//=======================================================================
|
||||
public class SaUpdateLogItemMonitor_SecurityLink : SaUpdateLogItemMonitor
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Configuration.
|
||||
public new class Config : SaUpdateLogItemMonitor.Config
|
||||
{
|
||||
public Config (SaUpdateLogConsole updateLogConsole, SysId itemId, DbUpdateInfo dbUpdateInfo) :
|
||||
base(updateLogConsole, dbUpdateInfo)
|
||||
{
|
||||
ItemType = (short)SaDataItemType.SecurityItem;
|
||||
ItemId = itemId;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public SaUpdateLogItemMonitor_SecurityLink (SaSecurityConsole securityConsole, SaSecurityLink securityLink, DbUpdateInfo dbUpdateInfo) :
|
||||
base(new Config(securityConsole.UpdateLogConsole, securityLink.Id, dbUpdateInfo))
|
||||
{
|
||||
RecordAttrValues(securityLink, false);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Record attribute values.
|
||||
public bool RecordUpdatedValues (SaSecurityLink securityLink)
|
||||
{
|
||||
return RecordAttrValues(securityLink, true);
|
||||
}
|
||||
private bool RecordAttrValues (SaSecurityLink securityLink, bool newValues)
|
||||
{
|
||||
ClearErrorState();
|
||||
|
||||
// Security Item Properties - record values that may require logging.
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemOwner, false), SysId.ToInt(securityLink.ItemIdOwner), newValues);
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemTarget, false), SysId.ToInt(securityLink.ItemIdTarget), newValues);
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_ItemContext, false), SysId.ToInt(securityLink.ItemIdContext), newValues);
|
||||
// Common properties.
|
||||
RecordAttrValue(SaSecurityDbDfn.GetColumnName(SaSecurityDbDfn.ColumnIdx.SaSecLink_Status, false), securityLink.StatusCode, newValues);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,230 @@
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
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.Utils;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Code generated by Sarand Database Utilities Thu 3-Oct-2019 15:11:05
|
||||
//---------------------------------------------------------------------------
|
||||
namespace Sarand.Net.Standard.Dbas.UpdateLog.Internal
|
||||
{
|
||||
internal class SaAttrUpdate_Db : DbDataItem
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Column definitions.
|
||||
public class ColumnsData
|
||||
{
|
||||
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
|
||||
public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId");
|
||||
public ColumnDataDateTime _Logged { get; } = new ColumnDataDateTime("Logged");
|
||||
public ColumnDataString _Attribute { get; } = new ColumnDataString("Attribute");
|
||||
public ColumnDataString _DataBefore { get; } = new ColumnDataString("DataBefore");
|
||||
public ColumnDataString _DataAfter { get; } = new ColumnDataString("DataAfter");
|
||||
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",
|
||||
"Logged",
|
||||
"Attribute",
|
||||
"DataBefore",
|
||||
"DataAfter",
|
||||
"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",
|
||||
"Logged",
|
||||
"Attribute",
|
||||
};
|
||||
private static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
|
||||
{
|
||||
"CreateOn",
|
||||
"CreateBy",
|
||||
"CreateHost",
|
||||
"ItemType",
|
||||
"ItemId",
|
||||
"Logged",
|
||||
"Attribute",
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
internal SaAttrUpdate_Db (IDatabaseInfo dbInfo = null) : base(dbInfo)
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
public override String SchemaName { get; } = "dbo";
|
||||
public override String TableName { get; } = "SaAttrUpdate";
|
||||
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 DateTime _Logged { get { return Cols._Logged.Value; } set { Cols._Logged.Value = value; } }
|
||||
public String _Attribute { get { return Cols._Attribute.Value; } set { Cols._Attribute.Value = value; } }
|
||||
public String _DataBefore { get { return Cols._DataBefore.Value; } set { Cols._DataBefore.Value = value; } }
|
||||
public String _DataAfter { get { return Cols._DataAfter.Value; } set { Cols._DataAfter.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);
|
||||
_Logged = GetFieldDateTime(dbDataReader, "Logged", _Logged);
|
||||
_Attribute = GetFieldString(dbDataReader, "Attribute", _Attribute);
|
||||
_DataBefore = GetFieldString(dbDataReader, "DataBefore", _DataBefore);
|
||||
_DataAfter = GetFieldString(dbDataReader, "DataAfter", _DataAfter);
|
||||
_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("Logged")) AddCommandParameter(dbCommand, "@Logged", _Logged);
|
||||
if (columnNames.ContainsCI("Attribute")) AddCommandParameter(dbCommand, "@Attribute", _Attribute);
|
||||
if (columnNames.ContainsCI("DataBefore")) AddCommandParameter(dbCommand, "@DataBefore", _DataBefore);
|
||||
if (columnNames.ContainsCI("DataAfter")) AddCommandParameter(dbCommand, "@DataAfter", _DataAfter);
|
||||
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 Logged=@Logged AND Attribute=@Attribute;";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += columnNames.Concat(", ", "", "=?") + " ";
|
||||
query += "WHERE ItemType=? AND ItemId=? AND Logged=? AND Attribute=?;";
|
||||
}
|
||||
dbCommand.CommandText = query;
|
||||
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
|
||||
// Populate parameters.
|
||||
dbCommand.Parameters.Clear();
|
||||
if (columnNames.ContainsCI("DataBefore")) AddCommandParameter(dbCommand, "@DataBefore", _DataBefore);
|
||||
if (columnNames.ContainsCI("DataAfter")) AddCommandParameter(dbCommand, "@DataAfter", _DataAfter);
|
||||
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, "@Logged", _Logged);
|
||||
AddCommandParameter(dbCommand, "@Attribute", _Attribute);
|
||||
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
|
||||
return (executeNonQueryResult == 1);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.UpdateLog;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.UpdateLog
|
||||
{
|
||||
//=======================================================================
|
||||
public abstract class SaUpdateLogConsole_Dbas : SaUpdateLogConsole
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
private SaUpdateLogMgr_Dbas updateLogMgr = null;
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Static initialisation.
|
||||
static SaUpdateLogConsole_Dbas ()
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
protected SaUpdateLogConsole_Dbas (ISacsDatabase database)
|
||||
{
|
||||
Database = database;
|
||||
updateLogMgr = new SaUpdateLogMgr_Dbas(this);
|
||||
}
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
if (updateLogMgr != null) updateLogMgr.Dispose(); updateLogMgr = null;
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
internal ISacsDatabase Database { get; set; }
|
||||
public override bool DatabaseIsValid { get { return updateLogMgr.DatabaseIsValid; } }
|
||||
public override bool CanUpdateDatabase { get { return updateLogMgr.CanUpdateDatabase; } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update Log form.
|
||||
public override bool ShowUpdateLogDialog (ShowUpdateLogConfig config)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (ShowUpdateLogDialogFn != null)
|
||||
ShowUpdateLogDialogFn(this, config);
|
||||
return false;
|
||||
}
|
||||
// Method to display Update Log dialog.
|
||||
protected delegate bool ShowUpdateLogDialogFunction (SaUpdateLogConsole codeTypeConsole, ShowUpdateLogConfig config);
|
||||
protected abstract ShowUpdateLogDialogFunction ShowUpdateLogDialogFn { get; }
|
||||
|
||||
//*******************************************************************
|
||||
// U p d a t e L o g E n t r i e s
|
||||
//*******************************************************************
|
||||
// Log updates.
|
||||
public override bool LogUpdates (SaUpdateLogItemMonitor updateLogItemMonitor)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!updateLogMgr.LogUpdates(updateLogItemMonitor, updateLogItemMonitor.DbUpdateInfo))
|
||||
SetErrorState(updateLogMgr.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Retrieve list of updates that match the specified params:
|
||||
public override bool ItemHasLogEntries (ItemId itemId)
|
||||
{
|
||||
ClearErrorState();
|
||||
SaUpdateLogEntry.Params prmUpdateLog = new SaUpdateLogEntry.Params();
|
||||
prmUpdateLog.IncludedItemIds.Add(itemId);
|
||||
return LogEntriesExist(prmUpdateLog);
|
||||
}
|
||||
public override bool LogEntriesExist (SaUpdateLogEntry.Params prmUpdateLog)
|
||||
{
|
||||
ClearErrorState();
|
||||
return (updateLogMgr.GetLogEntryCount(prmUpdateLog) > 0);
|
||||
}
|
||||
public override long GetLogEntryCount (SaUpdateLogEntry.Params prmUpdateLog)
|
||||
{
|
||||
ClearErrorState();
|
||||
return updateLogMgr.GetLogEntryCount(prmUpdateLog);
|
||||
}
|
||||
public override SaUpdateLogEntry GetLogEntry (ItemId itemId, String attrName, DateTime loggedAt)
|
||||
{
|
||||
ClearErrorState();
|
||||
return updateLogMgr.GetLogEntry(itemId, attrName, loggedAt);
|
||||
}
|
||||
public override List<SaUpdateLogEntry> GetLogEntries (SaUpdateLogEntry.Params prmUpdateLog)
|
||||
{
|
||||
ClearErrorState();
|
||||
return updateLogMgr.GetLogEntryList(prmUpdateLog);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Create a new item data.
|
||||
public override SaUpdateLogEntry CreateLogEntry (ItemId itemId, String attrName)
|
||||
{
|
||||
ClearErrorState();
|
||||
return updateLogMgr.CreateLogEntry(itemId, attrName);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Store item data.
|
||||
public override bool StoreLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (updateLogMgr.LogEntryExists(logEntry))
|
||||
{
|
||||
if (!updateLogMgr.InsertLogEntry(logEntry, dbUpdateInfo))
|
||||
SetErrorState(updateLogMgr.ErrorStateMessage);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!updateLogMgr.UpdateLogEntry(logEntry, dbUpdateInfo))
|
||||
SetErrorState(updateLogMgr.ErrorStateMessage);
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
public override bool RemoveLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
throw new NotSupportedException("Update Log Entries can not be removed");
|
||||
}
|
||||
public override bool ClearLogEntriesForItem (ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!updateLogMgr.ClearLogEntriesForItem(itemId, dbUpdateInfo))
|
||||
SetErrorState(updateLogMgr.ErrorStateMessage);
|
||||
return !HasErrorState ();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
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.UpdateLog
|
||||
{
|
||||
//=======================================================================
|
||||
public static class SaUpdateLogDbDfnGenerator
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
private static string className = nameof(SaUpdateLogDbDfnGenerator);
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Generate database definitions.
|
||||
/// </summary>
|
||||
public static bool Generate(String connectionString)
|
||||
{
|
||||
String fn = className + ".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, "generating database definition")}");
|
||||
}
|
||||
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.UnionWith(new String[] { "SaAttrUpdate" });
|
||||
config.Schema.Tables_Excluded.UnionWith(new String[] { });
|
||||
// SChema - Columns.
|
||||
config.Schema.InsertOnlyColumns.Add(".*", "CreateOn,CreateBy,CreateHost");
|
||||
config.Schema.InsertOnlyColumns.Add("SaAttrUpdate", "ItemType,ItemId,Logged,Attribute");
|
||||
// Database Definition class.
|
||||
config.DefinitionClass.Namespace = "Sarand.Net.Standard.Base.UpdateLog";
|
||||
config.DefinitionClass.Classname = "SaUpdateLogDbDfn";
|
||||
// Table class.
|
||||
config.TableClass.Namespace = "Sarand.Net.Standard.Dbas.UpdateLog.Internal";
|
||||
|
||||
// Generate database definition.
|
||||
DatabaseDefinitionGenerator generator = new DatabaseDefinitionGenerator();
|
||||
return generator.Generate(config);
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
private static String GetOutputFolder()
|
||||
{
|
||||
String fn = className + ".GetOutputFolder";
|
||||
String assemblyDirectory = FileUtil.GetParentDirectory((Assembly.GetAssembly(typeof(DatabaseDefinitionGenerator)).Location));
|
||||
String directory = assemblyDirectory;
|
||||
SaLogger.Debug($"{fn} Assembly folder: " + directory);
|
||||
// Locate the parent of the 'Workspace' solution root folder.
|
||||
String projectFolder = "Workspace";
|
||||
while (!String.IsNullOrEmpty(directory))
|
||||
{
|
||||
if (FileUtil.IsDirectory(Path.Combine(directory, projectFolder)))
|
||||
break;
|
||||
directory = FileUtil.GetParentDirectory(directory);
|
||||
}
|
||||
if (String.IsNullOrEmpty(directory))
|
||||
{
|
||||
SaLogger.Error($"{fn} Failed to find '{projectFolder}' solution root folder in assembly path: {assemblyDirectory}");
|
||||
return String.Empty;
|
||||
}
|
||||
// Code files are generated to '..\Dbas\Generated\UpdateLog\' folder.
|
||||
directory = Path.Combine(directory, "Database", "Generated", "UpdateLog");
|
||||
SaLogger.Debug($"{fn} Output folder: {directory}");
|
||||
if (!FileUtil.ValidateDirectory(directory, true))
|
||||
{
|
||||
SaLogger.Error($"{fn} Output folder not found: {directory}");
|
||||
return String.Empty;
|
||||
}
|
||||
return directory;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.UpdateLog;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.UpdateLog
|
||||
{
|
||||
//=======================================================================
|
||||
public class SaUpdateLogEntry_Dbas : SaUpdateLogEntry
|
||||
{
|
||||
public SaUpdateLogEntry_Dbas(ItemId itemId, String attribute, DateTime logged, ushort flags) :
|
||||
base(itemId, attribute, logged)
|
||||
{
|
||||
Flags = flags;
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using Sarand.Net.Standard.Base.UpdateLog;
|
||||
|
||||
[assembly: InternalsVisibleTo("SacsWinForms")]
|
||||
namespace Sarand.Net.Standard.Dbas.UpdateLog
|
||||
{
|
||||
internal static class SaUpdateLogInternal
|
||||
{
|
||||
internal static SaUpdateLogMgr CreateUpdateLogMgr (this SaUpdateLogConsole updateLogConsole)
|
||||
{
|
||||
if (!(updateLogConsole is SaUpdateLogConsole_Dbas)) return null;
|
||||
return new SaUpdateLogMgr_Dbas((SaUpdateLogConsole_Dbas)updateLogConsole);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,652 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
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.UpdateLog;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Dbas.Base;
|
||||
using Sarand.Net.Standard.Dbas.UpdateLog.Internal;
|
||||
using System.Data.Common;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
|
||||
namespace Sarand.Net.Standard.Dbas.UpdateLog
|
||||
{
|
||||
//=======================================================================
|
||||
internal class SaUpdateLogMgr_Dbas : SaUpdateLogMgr
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Static initialisation.
|
||||
static SaUpdateLogMgr_Dbas ()
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
internal SaUpdateLogMgr_Dbas (SaUpdateLogConsole_Dbas updateLogConsole) :
|
||||
base(updateLogConsole)
|
||||
{
|
||||
Database = updateLogConsole.Database;
|
||||
DbInfo = new DbDataItem.DatabaseInfo(updateLogConsole.Database);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
public String TableName_UpdateLog { get { return SaUpdateLogDbDfn.GetTableName(SaUpdateLogDbDfn.TableIdx.SaAttrUpdate); } }
|
||||
internal ISacsDatabase Database { get; }
|
||||
private DbDataItem.DatabaseInfo DbInfo { get; }
|
||||
public override bool DatabaseIsValid { get { return (Database != null && Database.GetTableNames().Contains(TableName_UpdateLog)); } }
|
||||
public override bool CanUpdateDatabase { get { return DatabaseIsValid; } }
|
||||
|
||||
//*******************************************************************
|
||||
// U p d a t e L o g E n t r i e s
|
||||
//*******************************************************************
|
||||
// Utilities.
|
||||
private String GetUpdateLogEntryFilter (SaUpdateLogEntry updateLogEntry)
|
||||
{
|
||||
return GetUpdateLogEntryFilter(updateLogEntry.ItemId, updateLogEntry.Attribute, updateLogEntry.Logged);
|
||||
}
|
||||
private String GetUpdateLogEntryFilter (ItemId itemId, String attribute, DateTime logged)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return "1=0";
|
||||
if (StringUtil.IsEmpty(attribute)) return "1=0";
|
||||
// Update Log Entry identifying values.
|
||||
SaUpdateLogEntry.Params prmLogEntry = new SaUpdateLogEntry.Params();
|
||||
prmLogEntry.IncludedItemIds.Add(itemId);
|
||||
prmLogEntry.IncludedAttributes.Add(attribute);
|
||||
prmLogEntry.Logged = logged;
|
||||
return GetLogEntryQueryFilter(prmLogEntry).Concat(" And ", "(", ")");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update Log Entry exists.
|
||||
public override bool LogEntryExists (SaUpdateLogEntry updateLogEntry)
|
||||
{
|
||||
return LogEntryExists(updateLogEntry.ItemId, updateLogEntry.Attribute, updateLogEntry.Logged);
|
||||
}
|
||||
public override bool LogEntryExists (ItemId itemId, String attribute, DateTime logged)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return false;
|
||||
if (StringUtil.IsEmpty(attribute)) return false;
|
||||
return GetUpdateLogEntryCount(GetUpdateLogEntryFilter(itemId, attribute, logged)) == 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get Log Entry.
|
||||
private SaUpdateLogEntry GetUpdateLogEntry (String filter)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (GetUpdateLogEntryCount(filter) != 1) return null;
|
||||
SaUpdateLogEntry logEntry = null;
|
||||
// Query data.
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
dbConnection.Open();
|
||||
SaAttrUpdate_Db dbUpdateLog = new SaAttrUpdate_Db(DbInfo);
|
||||
dbUpdateLog.PopulateFrom(dbCommand, aliasUpdateLog, filter);
|
||||
logEntry = CreateLogEntry(new ItemId(dbUpdateLog._ItemType, new SysId(dbUpdateLog._ItemId)), dbUpdateLog._Attribute);
|
||||
PopulateFrom(dbUpdateLog, logEntry);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
return logEntry;
|
||||
}
|
||||
public override SaUpdateLogEntry GetLogEntry (ItemId itemId, String attribute, DateTime logged)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return null;
|
||||
if (StringUtil.IsEmpty(attribute)) return null;
|
||||
return GetUpdateLogEntry(GetUpdateLogEntryFilter(itemId, attribute, logged));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Create UpdateLog.
|
||||
public override SaUpdateLogEntry CreateLogEntry (ItemId itemId, String attribute)
|
||||
{
|
||||
ClearErrorState();
|
||||
return new SaUpdateLogEntry_Dbas(itemId, attribute, DateTime.Now, 0);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Validate UpdateLog.
|
||||
public override bool IsValidLogEntryData (SaUpdateLogEntry.Data logEntryData, SaUpdateLogEntry.ErrField errField)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.IsValidLogEntryData(logEntryData, errField)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Log updates.
|
||||
public override bool LogUpdates (SaUpdateLogItemMonitor updateLogItemMonitor, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (updateLogItemMonitor == null) return SetErrorState("Invalid item update monitor");
|
||||
if (updateLogItemMonitor.ItemType < 1) return SetErrorState("Invalid item type");
|
||||
if (!SysId.IsValid(updateLogItemMonitor.ItemId)) return SetErrorState("Invalid item Id");
|
||||
if (!DatabaseIsValid) return SetErrorState("Update Log is not supported");
|
||||
if (!CanUpdateDatabase) return SetErrorState("Database cannot be updated");
|
||||
|
||||
// Force initialisation of SaDbQuery DBMS type.
|
||||
DbQuery dbQry = new DbQuery(Database.DbmsType);
|
||||
|
||||
// Retrieve list of attribute updates to be recorded:
|
||||
List<SaUpdateLogItemMonitor.AttrData> updatedAttributes = updateLogItemMonitor.AttrUpdates;
|
||||
if (updatedAttributes.Count < 1) return true;
|
||||
DateTime now = DateTime.Now;
|
||||
DateTime logged = DateTime.Now;
|
||||
|
||||
// Build query details to insert new entries in update log:
|
||||
List<String> updateLogQueries = new List<string>();
|
||||
String qryPrefix = "INSERT INTO "+TableName_UpdateLog;
|
||||
|
||||
// Add the column names:
|
||||
List<String> columnNames = new List<string>();
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemType, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemId, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Attribute, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Logged, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataBefore, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataAfter, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Notes, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Flags, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Status, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_CreateOn, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_CreateBy, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_CreateHost, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_UpdateOn, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_UpdateBy, false));
|
||||
columnNames.Add(SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_UpdateHost, false));
|
||||
qryPrefix += " (" + columnNames.Concat(",") + ")";
|
||||
|
||||
// Add the column values.
|
||||
foreach (SaUpdateLogItemMonitor.AttrData attrData in updatedAttributes)
|
||||
{
|
||||
// Data values.
|
||||
String dataBefore = attrData.ValueBefore.ToString();
|
||||
String dataAfter = attrData.ValueAfter.ToString();
|
||||
|
||||
// Prepare list of column values:
|
||||
List<String> columnValue = new List<string>();
|
||||
columnValue.Add(updateLogItemMonitor.ItemType.ToString());
|
||||
columnValue.Add(SysId.ToString(updateLogItemMonitor.ItemId));
|
||||
columnValue.Add("'" + DbQuery.FormatForCondition(DbQuery.FormatForCondition(attrData.Name)) + "'");
|
||||
columnValue.Add(DbQuery.FormatDateTimeForCondition(logged, true, true));
|
||||
columnValue.Add("'" + DbQuery.FormatForCondition(dataBefore.Left((int)SaUpdateLogDbDfn.GetColTextLen(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataBefore))) + "'");
|
||||
columnValue.Add("'" + DbQuery.FormatForCondition(dataAfter.Left((int)SaUpdateLogDbDfn.GetColTextLen(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataAfter))) + "'");
|
||||
columnValue.Add("''"); // Notes
|
||||
columnValue.Add("0"); // Flags.
|
||||
columnValue.Add("'" + DbQuery.FormatForCondition(SacsSystem.GetStatusCode(SaStatus.Logged)) + "'");
|
||||
// Create stamp.
|
||||
columnValue.Add(DbQuery.FormatDateTimeForCondition(now, true, true));
|
||||
columnValue.Add(SysId.ToString(dbUpdateInfo.UserId, "0"));
|
||||
columnValue.Add("'" + DbQuery.FormatForCondition(dbUpdateInfo.Host) + "'");
|
||||
// Update stamp.
|
||||
columnValue.Add(DbQuery.FormatDateTimeForCondition(now, true, true));
|
||||
columnValue.Add(SysId.ToString(dbUpdateInfo.UserId, "0"));
|
||||
columnValue.Add("'" + DbQuery.FormatForCondition(dbUpdateInfo.Host) + "'");
|
||||
|
||||
// Construct and add the query for this insert:
|
||||
updateLogQueries.Add(qryPrefix + " VALUES(" + columnValue.Concat(",") + ")");
|
||||
}
|
||||
|
||||
// Execute the query to insert update log entries.
|
||||
if (!updateLogQueries.IsEmpty())
|
||||
{
|
||||
// Turn off display of database exceptions during update logging.
|
||||
bool ddDisplayErrorsPrev = Database.DisplayErrors;
|
||||
Database.DisplayErrors = false;
|
||||
// MS Access only allows a single statement to be executed at a time.
|
||||
bool executeStatementsSeparately = true;
|
||||
if (executeStatementsSeparately)
|
||||
{
|
||||
foreach (String query in updateLogQueries)
|
||||
{
|
||||
SaLogger.Debug($"{SysUtil.Fn} Query: {query}");
|
||||
Database.ExecuteNonQuery(query);
|
||||
if (Database.HasErrorState())
|
||||
SetErrorState("Failed to insert update log entries - " + Database.ErrorStateMessage);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
String query = updateLogQueries.Concat(";");
|
||||
SaLogger.Debug($"{SysUtil.Fn} Query: {query}");
|
||||
Database.ExecuteNonQuery(query);
|
||||
if (Database.HasErrorState())
|
||||
SetErrorState("Failed to insert update log entries - " + Database.ErrorStateMessage);
|
||||
}
|
||||
Database.DisplayErrors = ddDisplayErrorsPrev;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Insert item.
|
||||
public override bool InsertLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!IsValidLogEntry(logEntry)) return false;
|
||||
//if (logEntry.Id.IsValid()) return SetErrorState(ErrorMessage.ValiditemId);
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
dbConnection.Open();
|
||||
SaAttrUpdate_Db dbUpdateLog = new SaAttrUpdate_Db(DbInfo);
|
||||
PopulateTo(dbUpdateLog, logEntry, dbUpdateInfo);
|
||||
if (SaAttrUpdate_Db.FieldsNonId.Contains("Id"))
|
||||
{
|
||||
// Update Log has no Id.
|
||||
//dbUpdateLog._Id = SysId.ToInt(Database.GetNextId("SaAttrUpdate", dbUpdateInfo));
|
||||
}
|
||||
dbUpdateLog.ExecuteInsertCommand(dbCommand);
|
||||
//logEntry.Id = new SysId(dbUpdateLog._Id);
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update item.
|
||||
public override bool UpdateLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!IsValidLogEntry(logEntry)) return false;
|
||||
//if (!logEntry.Id.IsValid()) return SetErrorState(ErrorMessage.InvalidItemId);
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
// Retrieve item.
|
||||
dbConnection.Open();
|
||||
SaAttrUpdate_Db dbUpdateLog = new SaAttrUpdate_Db(DbInfo);
|
||||
dbUpdateLog.PopulateFrom(dbCommand, aliasUpdateLog, GetUpdateLogEntryFilter(logEntry));
|
||||
// Update item.
|
||||
PopulateTo(dbUpdateLog, logEntry, dbUpdateInfo);
|
||||
dbUpdateLog.ExecuteUpdateCommand(dbCommand);
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Delete item.
|
||||
public override bool LogEntryCanBeDeleted (SaUpdateLogEntry logEntry)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!base.LogEntryCanBeDeleted(logEntry)) return false;
|
||||
return true;
|
||||
}
|
||||
public override bool DeleteLogEntry (SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!LogEntryCanBeDeleted(logEntry)) return false;
|
||||
using (var dbConnection = Database.CreateConnection())
|
||||
using (var dbCommand = dbConnection.CreateCommand())
|
||||
{
|
||||
try
|
||||
{
|
||||
// Retrieve item.
|
||||
dbConnection.Open();
|
||||
SaAttrUpdate_Db dbUpdateLog = new SaAttrUpdate_Db(DbInfo);
|
||||
dbUpdateLog.PopulateFrom(dbCommand, aliasUpdateLog, GetUpdateLogEntryFilter(logEntry));
|
||||
// Delete item.
|
||||
dbCommand.CommandType = System.Data.CommandType.Text;
|
||||
dbCommand.CommandText = "DELETE FROM " + SaUpdateLogDbDfn.GetTableName(SaUpdateLogDbDfn.TableIdx.SaAttrUpdate) + " WHERE " + GetUpdateLogEntryFilter(logEntry) + ";";
|
||||
dbCommand.ExecuteNonQuery();
|
||||
}
|
||||
catch (Exception exc) { SetErrorState(exc.Message); }
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
public override bool ClearLogEntriesForItem (ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
ClearErrorState();
|
||||
if (!ItemId.IsValid(itemId)) return SetErrorState(ErrorMessage.ItemIdNotSpecified);
|
||||
String colItemType = SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemType);
|
||||
String colItemId = SaUpdateLogDbDfn.GetColumnName(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemId);
|
||||
String query = "Delete From "+TableName_UpdateLog+" WHERE "+colItemType+"="+itemId.Type.ToString()+" AND "+colItemId+"="+SysId.ToString(itemId.Id);
|
||||
Database.ExecuteNonQuery(query);
|
||||
if (Database.HasErrorState())
|
||||
SetErrorState("Failed to clear update log entries - " + Database.ErrorStateMessage);
|
||||
return OK;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Copy data properties to and from database.
|
||||
private void PopulateTo (SaAttrUpdate_Db dbUpdateLog, SaUpdateLogEntry logEntry, DbUpdateInfo dbUpdateInfo)
|
||||
{
|
||||
dbUpdateLog._ItemType = logEntry.ItemId.Type;
|
||||
dbUpdateLog._ItemId = SysId.ToInt(logEntry.ItemId.Id);
|
||||
dbUpdateLog._Attribute = logEntry.Attribute;
|
||||
dbUpdateLog._Logged = logEntry.Logged;
|
||||
dbUpdateLog._DataBefore = logEntry.DataBefore;
|
||||
dbUpdateLog._DataAfter = logEntry.DataAfter;
|
||||
// Common properties.
|
||||
dbUpdateLog._Notes = logEntry.Notes;
|
||||
dbUpdateLog._Status = SacsSystem.GetStatusCode(logEntry.Status);
|
||||
dbUpdateLog._Flags = (short)logEntry.Flags;
|
||||
if (!SysId.IsValid(logEntry.Id))
|
||||
{
|
||||
dbUpdateLog._CreateOn = DateTime.Now;
|
||||
dbUpdateLog._CreateBy = dbUpdateInfo.UserId.ToInt();
|
||||
dbUpdateLog._CreateHost = dbUpdateInfo.Host;
|
||||
}
|
||||
dbUpdateLog._UpdateOn = DateTime.Now;
|
||||
dbUpdateLog._UpdateBy = dbUpdateInfo.UserId.ToInt();
|
||||
dbUpdateLog._UpdateHost = dbUpdateInfo.Host;
|
||||
}
|
||||
private void PopulateFrom (SaAttrUpdate_Db dbUpdateLog, SaUpdateLogEntry logEntry)
|
||||
{
|
||||
//logEntry.ItemId = new ItemId(dbUpdateLog._ItemType, new SysId(dbUpdateLog._ItemId);
|
||||
//logEntry.Attribute = dbUpdateLog._Attribute;
|
||||
//logEntry.Logged = dbUpdateLog._Logged;
|
||||
logEntry.DataBefore = dbUpdateLog._DataBefore;
|
||||
logEntry.DataAfter = dbUpdateLog._DataAfter;
|
||||
// Common properties.
|
||||
logEntry.Notes = dbUpdateLog._Notes;
|
||||
logEntry.Status = SacsSystem.GetStatusForCode(dbUpdateLog._Status);
|
||||
logEntry.SetCreateStamp(dbUpdateLog._CreateOn, new SysId(dbUpdateLog._CreateBy), dbUpdateLog._CreateHost);
|
||||
logEntry.SetUpdateStamp(dbUpdateLog._UpdateOn, new SysId(dbUpdateLog._UpdateBy), dbUpdateLog._UpdateHost);
|
||||
logEntry.AcceptChanges();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// UpdateLog column definitions.
|
||||
private static readonly String aliasUpdateLog = "aUpdLog";
|
||||
private void SetUpdateLogColDfn
|
||||
(ColumnDfn col, String caption, int width, SaUpdateLogDbDfn.ColumnIdx dbCol,
|
||||
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
|
||||
String alias = "", String prefix = "")
|
||||
{
|
||||
if (String.IsNullOrEmpty(alias) && SaUpdateLogDbDfn.GetTableForColumn(dbCol) == SaUpdateLogDbDfn.TableIdx.SaAttrUpdate)
|
||||
alias = aliasUpdateLog;
|
||||
col.Set(caption, width, (int)dbCol, prefix + SaUpdateLogDbDfn.GetColumnName(dbCol, false), SaUpdateLogDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
|
||||
}
|
||||
public override ColumnDfn GetLogEntryColumnDfn (SaUpdateLogEntry.Column columnId, string caption = "", int width = 0)
|
||||
{
|
||||
ColumnDfn columnDfn = new ColumnDfn((int)columnId,caption,width);
|
||||
switch (columnId)
|
||||
{
|
||||
case SaUpdateLogEntry.Column.Pos:
|
||||
SetUpdateLogColDfn(columnDfn, "Pos", 45, SaUpdateLogDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
|
||||
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
|
||||
columnDfn.ReadOnly = true;
|
||||
columnDfn.Resizable = false;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.ItemType:
|
||||
SetUpdateLogColDfn(columnDfn, "Item type", 80, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.ItemType_Desc:
|
||||
SetUpdateLogColDfn(columnDfn, "Item type", 100, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemType);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Attribute:
|
||||
SetUpdateLogColDfn(columnDfn, "Attribute", 100, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Attribute);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Logged:
|
||||
SetUpdateLogColDfn(columnDfn, "Logged", 110, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Logged, ColumnAlignment.Center, DataValue.DataType.DateTime);
|
||||
columnDfn.TimeFormat = "HH:mm:ss";
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Logged_Date:
|
||||
SetUpdateLogColDfn(columnDfn, "Logged", 100, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Logged, ColumnAlignment.Center, DataValue.DataType.Date);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Logged_Time:
|
||||
SetUpdateLogColDfn(columnDfn, "Logged", 100, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Logged, ColumnAlignment.Center, DataValue.DataType.Time);
|
||||
columnDfn.TimeFormat = "HH:mm:ss";
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.DataBefore:
|
||||
SetUpdateLogColDfn(columnDfn, "Value before", 120, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataBefore);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.DataAfter:
|
||||
SetUpdateLogColDfn(columnDfn, "Value after", 120, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataAfter);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Notes:
|
||||
SetUpdateLogColDfn(columnDfn, "Notes", 240, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Notes);
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Status:
|
||||
SetUpdateLogColDfn(columnDfn, "Status", 80, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Status, ColumnAlignment.Center);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Status_Desc:
|
||||
SetUpdateLogColDfn(columnDfn, "Status", 90, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Status, ColumnAlignment.Center);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Status_Ind:
|
||||
SetUpdateLogColDfn(columnDfn, "Status", 80, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
|
||||
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.CreateOn_Date:
|
||||
SetUpdateLogColDfn(columnDfn, "Created", 80, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.CreateBy:
|
||||
SetUpdateLogColDfn(columnDfn, "Modified by", 80, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_CreateBy, ColumnAlignment.Center, DataValue.DataType.Long);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.CreateBy_Name:
|
||||
SetUpdateLogColDfn(columnDfn, "Modified by", 120, SaUpdateLogDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.String);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.UpdateOn_Date:
|
||||
SetUpdateLogColDfn(columnDfn, "Updated", 80, SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
|
||||
columnDfn.ReadOnly = true;
|
||||
break;
|
||||
case SaUpdateLogEntry.Column.Hidden:
|
||||
SetUpdateLogColDfn(columnDfn, "", 0, SaUpdateLogDbDfn.ColumnIdx.Unknown);
|
||||
columnDfn.Hidden = true;
|
||||
break;
|
||||
}
|
||||
if (!String.IsNullOrEmpty(caption))
|
||||
columnDfn.Caption = caption;
|
||||
if (width > 0)
|
||||
columnDfn.Width = width;
|
||||
return columnDfn;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// UpdateLog query filter.
|
||||
public override List<string> GetLogEntryQueryFilter (SaUpdateLogEntry.Params prm)
|
||||
{
|
||||
List<String> filter = new List<String>();
|
||||
|
||||
// Item Ids.
|
||||
List<String> filterItemId = new List<String>();
|
||||
String colItemType = SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemType, aliasUpdateLog);
|
||||
String colItemId = SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemId, aliasUpdateLog);
|
||||
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 ", "(", ")"));
|
||||
|
||||
// Attributes.
|
||||
String colAttribute = SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Attribute, aliasUpdateLog);
|
||||
if (prm.IncludedAttributes.Count > 0)
|
||||
filter.Add(colAttribute + " IN (" + DbQuery.FormatForIn(prm.IncludedAttributes, true, true) + ")");
|
||||
|
||||
// Logged at.
|
||||
String colLogged = SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Logged, aliasUpdateLog);
|
||||
if (DateUtil.IsValid(prm.Logged))
|
||||
filter.Add(colLogged + "=" + DbQuery.FormatDateTimeForCondition(prm.LoggedFrom, true, true));
|
||||
else
|
||||
{
|
||||
if (DateUtil.IsValid(prm.LoggedFrom))
|
||||
filter.Add(colLogged + ">=" + DbQuery.FormatDateTimeForCondition(prm.LoggedFrom, true, true));
|
||||
if (DateUtil.IsValid(prm.LoggedTo))
|
||||
filter.Add(colLogged + "<=" + DbQuery.FormatDateTimeForCondition(prm.LoggedTo, true, true));
|
||||
}
|
||||
|
||||
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
|
||||
return filter;
|
||||
}
|
||||
// UpdateLog sort columns.
|
||||
public List<String> GetUpdateLogSortColumns (SaUpdateLogEntry.Params prm)
|
||||
{
|
||||
// Sort sequence:
|
||||
List<String> sortColumnNames = new List<String>();
|
||||
foreach (var columnDfn in prm.SortColumns)
|
||||
{
|
||||
// Need to ensure correct alias used for UpdateLog columns in case of conflict.
|
||||
String sortCol = String.Empty;
|
||||
if (SaUpdateLogDbDfn.GetTableForColumn((SaUpdateLogDbDfn.ColumnIdx)columnDfn.DbColumn) == SaUpdateLogDbDfn.TableIdx.SaAttrUpdate)
|
||||
{
|
||||
sortCol = SaUpdateLogDbDfn.GetColumnNameQual((SaUpdateLogDbDfn.ColumnIdx)columnDfn.DbColumn, aliasUpdateLog);
|
||||
}
|
||||
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(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Logged, aliasUpdateLog) + " DESC");
|
||||
}
|
||||
return sortColumnNames;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// UpdateLog count.
|
||||
private long GetUpdateLogEntryCount (String filter)
|
||||
{
|
||||
ClearErrorState();
|
||||
return Database.GetRowCount($"{SaUpdateLogDbDfn.GetTableName(SaUpdateLogDbDfn.TableIdx.SaAttrUpdate)} As {aliasUpdateLog}", filter);
|
||||
}
|
||||
public override long GetLogEntryCount (SaUpdateLogEntry.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
return GetUpdateLogEntryCount(GetLogEntryQueryFilter(prm).Concat(" AND ", "(", ")"));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update Log Entry list.
|
||||
public override List<SaUpdateLogEntry> GetLogEntryList (SaUpdateLogEntry.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
List<SaUpdateLogEntry> logEntries = new List<SaUpdateLogEntry>();
|
||||
DbQuery qry = new DbQuery(Database.DbmsType);
|
||||
qry.Tables.Add(TableName_UpdateLog, aliasUpdateLog);
|
||||
SaAttrUpdate_Db dbLogEntry = new SaAttrUpdate_Db(DbInfo);
|
||||
qry.Columns.AddRange(dbLogEntry.ExistingColumnNames);
|
||||
qry.Filters.AddRange(GetLogEntryQueryFilter(prm));
|
||||
qry.OrderBy.AddRange(GetUpdateLogSortColumns(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())
|
||||
{
|
||||
dbLogEntry = new SaAttrUpdate_Db(DbInfo);
|
||||
dbLogEntry.PopulateFrom(dbDataReader);
|
||||
SaUpdateLogEntry logEntry = CreateLogEntry(new ItemId(dbLogEntry._ItemType,new SysId(dbLogEntry._ItemId)),dbLogEntry._Attribute);
|
||||
PopulateFrom(dbLogEntry, logEntry);
|
||||
logEntries.Add(logEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
SetErrorState(ErrorMessage.DatabaseQueryException);
|
||||
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
||||
}
|
||||
}
|
||||
return logEntries;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update Log Entry query.
|
||||
public override DbResultSet ExecuteLogEntryQuery (List<ColumnDfn> columns, SaUpdateLogEntry.Params prm)
|
||||
{
|
||||
ClearErrorState();
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Construct query.
|
||||
DbQuery query = new DbQuery(Database.DbmsType);
|
||||
query.Tables.Add(SaUpdateLogDbDfn.GetTableName(SaUpdateLogDbDfn.TableIdx.SaAttrUpdate), aliasUpdateLog);
|
||||
|
||||
// Add columns as defined in query list.
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.ItemType) || columns.HasId(SaUpdateLogEntry.Column.ItemType_Desc))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemType, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.ItemId))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_ItemId, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.Attribute) || columns.HasId(SaUpdateLogEntry.Column.DataBefore) || columns.HasId(SaUpdateLogEntry.Column.DataAfter))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Attribute, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.Logged) || columns.HasId(SaUpdateLogEntry.Column.Logged_Date) || columns.HasId(SaUpdateLogEntry.Column.Logged_Time))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Logged, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.DataBefore))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataBefore, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.DataAfter))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_DataAfter, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.Notes))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Notes, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.Status) || columns.HasId(SaUpdateLogEntry.Column.Status_Desc) || columns.HasId(SaUpdateLogEntry.Column.Status_Ind))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_Status, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.CreateOn_Date))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_CreateOn, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.CreateBy) || columns.HasId(SaUpdateLogEntry.Column.CreateBy_Name))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_CreateBy, aliasUpdateLog));
|
||||
if (columns.HasId(SaUpdateLogEntry.Column.UpdateOn_Date))
|
||||
query.Columns.Add(SaUpdateLogDbDfn.GetColumnNameQual(SaUpdateLogDbDfn.ColumnIdx.SaAttrUpdate_UpdateOn, aliasUpdateLog));
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Populate filter.
|
||||
query.Filters.AddRange(GetLogEntryQueryFilter(prm));
|
||||
|
||||
// Configure sort sequence.
|
||||
foreach (String sortColumn in GetUpdateLogSortColumns(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,18 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<RootNamespace>Sarand.Net.Standard</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="7.0.3" />
|
||||
<PackageReference Include="System.Data.Odbc" Version="10.0.12" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SacsBusinessBase\SacsBusinessBase.csproj" />
|
||||
<ProjectReference Include="..\SacsStandardDbas\SacsStandardDbas.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user