Extract paired business object projects

This commit is contained in:
Andy Howard
2026-10-06 17:48:37 +01:00
parent 5daf7ce97f
commit d3c5ceaf7a
170 changed files with 168 additions and 13 deletions
@@ -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));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
+18
View File
@@ -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>