git_bsmd/nsw/Source/bsmd.database/SystemError.cs

211 lines
8.1 KiB
C#

// Copyright (c) 2015-2017 schick Informatik
// Description: Speicherobjekt für HIS-Nord Fehlermeldungen
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Xml;
using System.IO;
using System.Xml.Linq;
using log4net;
namespace bsmd.database
{
/// <summary>
/// Diese Klasse bildet den Verbindungsfehler der HIS-Nord Schnittstelle ab. Damit ist ein Fehler der dazwischenliegenden
/// Kommunikationsschnittstelle gemeint, der Fehler wird nicht im NSW produziert
/// </summary>
public class SystemError : DatabaseEntity
{
private static ILog _log = LogManager.GetLogger(typeof(SystemError));
public SystemError()
{
this.tablename = "[dbo].[SystemError]";
}
#region Enums
public enum SystemErrorStatus
{
NEW,
ACKNOWLEDGED
};
#endregion
#region Properties
public DateTime? ErrorAt { get; set; }
public string Meldetype { get; set; }
public string ReferenceId { get; set; }
public int ProcessStatus { get; set; }
public string ImportFilename { get; set; }
public int ErrorCode { get; set; }
public string ErrorMessage { get; set; }
public string ErrorDescription { get; set; }
public SystemErrorStatus Status { get; set; }
public Guid MessageCoreId { get; set; }
public DateTime? SendDate { get; set; }
#endregion
#region DatabaseEntity implementation
public override List<DatabaseEntity> LoadList(IDataReader reader)
{
List<DatabaseEntity> result = new List<DatabaseEntity>();
while (reader.Read())
{
SystemError se = new SystemError();
se.id = reader.GetGuid(0);
if (!reader.IsDBNull(1)) se.ErrorAt = reader.GetDateTime(1);
if (!reader.IsDBNull(2)) se.Meldetype = reader.GetString(2);
if (!reader.IsDBNull(3)) se.ReferenceId = reader.GetString(3);
if (!reader.IsDBNull(4)) se.ProcessStatus = reader.GetInt32(4);
if (!reader.IsDBNull(5)) se.ImportFilename = reader.GetString(5);
if (!reader.IsDBNull(6)) se.ErrorCode = reader.GetInt32(6);
if (!reader.IsDBNull(7)) se.ErrorMessage = reader.GetString(7);
if (!reader.IsDBNull(8)) se.ErrorDescription = reader.GetString(8);
if (!reader.IsDBNull(9)) se.MessageCoreId = reader.GetGuid(9);
if (!reader.IsDBNull(10)) se.Status = (SystemError.SystemErrorStatus) Enum.ToObject(typeof(SystemError.SystemErrorStatus), reader.GetByte(10));
result.Add(se);
}
reader.Close();
return result;
}
public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
{
string query = string.Format("SELECT Id, ErrorAt, MeldeType, ReferenceId, ProcessStatus, ImportFilename, ErrorCode, ErrorMessage, ErrorDescription, MessageCoreId, Status FROM {0} ", this.Tablename);
switch (filter)
{
case Message.LoadFilter.BY_CORE:
query += "WHERE MessageCoreId = @COREID";
((SqlCommand)cmd).Parameters.AddWithValue("@COREID", criteria[0]);
break;
case Message.LoadFilter.ALL:
default:
break;
}
cmd.CommandText = query;
}
public override void PrepareSave(IDbCommand cmd)
{
SqlCommand scmd = cmd as SqlCommand;
scmd.Parameters.AddWithValue("@EAT", this.ErrorAt);
scmd.Parameters.AddWithValue("@MT", this.Meldetype);
scmd.Parameters.AddWithValue("@REFID", this.ReferenceId);
scmd.Parameters.AddWithValue("@PS", this.ProcessStatus);
scmd.Parameters.AddWithValue("@IF", this.ImportFilename);
scmd.Parameters.AddWithValue("@EC", this.ErrorCode);
scmd.Parameters.AddWithValue("@EM", this.ErrorMessage);
scmd.Parameters.AddWithValue("@ED", this.ErrorDescription);
scmd.Parameters.AddWithValue("@MCID", this.MessageCoreId);
scmd.Parameters.AddWithValue("@STATUS", (byte)this.Status);
if (this.IsNew)
{
scmd.CommandText = string.Format("INSERT INTO {0} (ErrorAt, MeldeType, ReferenceId, ProcessStatus, ImportFilename, ErrorCode, ErrorMessage, ErrorDescription, MessageCoreId, Status) " +
"VALUES (@EAT, @MT, @REFID, @PS, @IF, @EC, @EM, @ED, @MCID, @STATUS)", this.Tablename);
}
else
{
scmd.Parameters.AddWithValue("@ID", this.Id);
scmd.CommandText = string.Format("UPDATE {0} SET ErrorAt = @EAT, MeldeType = @MT, ReferenceId = @REFID, ProcessStatus = @PS, ImportFilename = @IF, " +
"ErrorCode = @EC, ErrorMessage = @EM, ErrorDescription = @ED, MessageCoreId = @MCID, Status = @STATUS WHERE Id = @ID", this.Tablename);
}
}
#endregion
#region public static methods
public static SystemError createFromXml(XElement xml)
{
SystemError systemError = new SystemError();
try
{
if (xml.Descendants("ErrorAt").Count() > 0)
{
systemError.ErrorAt = DateTime.Parse(xml.Descendants("ErrorAt").FirstOrDefault().Value);
}
systemError.Meldetype = xml.Descendants("Meldetype").First()?.Value;
systemError.ReferenceId = xml.Descendants("ReferenceId").First()?.Value;
if (xml.Descendants("ProcessStatus").Count() > 0)
{
systemError.ProcessStatus = Int32.Parse(xml.Descendants("ProcessStatus").FirstOrDefault().Value);
}
systemError.ImportFilename = xml.Descendants("ImportFilename").FirstOrDefault()?.Value;
if (!systemError.ImportFilename.IsNullOrEmpty())
{
systemError.ImportFilename = Path.GetFileNameWithoutExtension(systemError.ImportFilename);
int ind = systemError.ImportFilename.IndexOf('-');
Guid aGuid;
if (Guid.TryParse(systemError.ImportFilename.Substring(ind + 1), out aGuid))
systemError.MessageCoreId = aGuid;
DateTime aDate;
if (DateTime.TryParse(systemError.ImportFilename.Substring(0, ind), out aDate))
systemError.SendDate = aDate;
}
if (xml.Descendants("ErrorCode").Count() > 0)
{
systemError.ErrorCode = Int32.Parse(xml.Descendants("ErrorCode").First().Value);
}
systemError.ErrorMessage = xml.Descendants("ErrorMessage").FirstOrDefault()?.Value;
systemError.ErrorDescription = xml.Descendants("ErrorDescription").FirstOrDefault()?.Value;
string coreIdString = xml.Descendants("ConveyanceCode").FirstOrDefault()?.Value;
if(!coreIdString.IsNullOrEmpty())
{
Guid aCoreId;
if(Guid.TryParse(coreIdString, out aCoreId))
{
systemError.MessageCoreId = aCoreId;
} else
{
_log.WarnFormat("cannot parse conveyance code to Guid: {0}", coreIdString);
}
}
}
catch(Exception ex)
{
_log.WarnFormat("Error parsing system error: {0} ERROR-XML: {1}", ex.ToString(), xml.ToString());
}
return systemError;
}
#endregion
}
}