From 08740bf6fd0bd4d33a894508e62af5999fdc83c0 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Thu, 18 Apr 2019 11:17:54 +0000 Subject: [PATCH] MessageHistory erster Wurf --- ENI-2/ENI2/ENI2/MainWindow.xaml.cs | 50 +++++++--- Stundensheet.xlsx | Bin 40378 -> 40556 bytes nsw/Source/SQL/Update_To_5.2.sql | 10 ++ nsw/Source/bsmd.database/DBManager.cs | 92 +++++++++++------- nsw/Source/bsmd.database/DatabaseEntity.cs | 35 +++++++ nsw/Source/bsmd.database/MessageHistory.cs | 33 +++++++ nsw/Source/bsmd.database/bsmd.database.csproj | 1 + 7 files changed, 173 insertions(+), 48 deletions(-) create mode 100644 nsw/Source/SQL/Update_To_5.2.sql create mode 100644 nsw/Source/bsmd.database/MessageHistory.cs diff --git a/ENI-2/ENI2/ENI2/MainWindow.xaml.cs b/ENI-2/ENI2/ENI2/MainWindow.xaml.cs index c4480b1d..24edc984 100644 --- a/ENI-2/ENI2/ENI2/MainWindow.xaml.cs +++ b/ENI-2/ENI2/ENI2/MainWindow.xaml.cs @@ -258,27 +258,23 @@ namespace ENI2 { efMode = true; logoImage.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/ef_logo.png")); - } + } + Microsoft.Win32.SystemEvents.SessionEnded += SystemEvents_SessionEnded; + } + + private void SystemEvents_SessionEnded(object sender, Microsoft.Win32.SessionEndedEventArgs e) + { + this.UnlockOpenCores(); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { - try - { - // unlock all cores - foreach (ClosableTabItem tabItem in this.lockedCores.Keys) - { - App.LockingServiceClient.Unlock(lockedCores[tabItem], this.userEntity.Id.Value); - } - } - catch(Exception ex) - { - _log.ErrorFormat("LockingService.Unlock: {0}", ex.Message); - } + this.UnlockOpenCores(); DBManager.Instance.Disconnect(); Properties.Settings.Default.MainWindowPlacement = this.GetPlacement(); Properties.Settings.Default.Save(); + Microsoft.Win32.SystemEvents.SessionEnded -= SystemEvents_SessionEnded; } private void Window_SourceInitialized(object sender, EventArgs e) @@ -329,7 +325,11 @@ namespace ENI2 e.CanExecute = true; - } + } + + #endregion + + #region window control events private void buttonNewTransitIdClick(object sender, RoutedEventArgs e) { @@ -538,7 +538,27 @@ namespace ENI2 this.Close(); } - #endregion + #endregion + + #region private methods + + private void UnlockOpenCores() + { + try + { + // unlock all cores + foreach (ClosableTabItem tabItem in this.lockedCores.Keys) + { + App.LockingServiceClient.Unlock(lockedCores[tabItem], this.userEntity.Id.Value); + } + } + catch (Exception ex) + { + _log.ErrorFormat("LockingService.Unlock: {0}", ex.Message); + } + } + + #endregion } } diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 1d2748edcbb4b860a6033f16b5fa10d74236bf8b..1109b1ee911ea22f166574b44903ce854cf06f55 100644 GIT binary patch delta 19433 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 diff --git a/nsw/Source/SQL/Update_To_5.2.sql b/nsw/Source/SQL/Update_To_5.2.sql new file mode 100644 index 00000000..0a3cba52 --- /dev/null +++ b/nsw/Source/SQL/Update_To_5.2.sql @@ -0,0 +1,10 @@ +CREATE TABLE [dbo].[MessageHistory] +( + [Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY, + [ReportingPartyId] UNIQUEIDENTIFIER NULL, + [EntityId] UNIQUEIDENTIFIER NOT NULL, + [EntityType] NVARCHAR(100) NOT NULL, + [EntityName] NVARCHAR(50) NULL, + [EntityValues] NVARCHAR(MAX) NULL, + [Timestamp] DATETIME NOT NULL DEFAULT GETDATE() +) diff --git a/nsw/Source/bsmd.database/DBManager.cs b/nsw/Source/bsmd.database/DBManager.cs index e4bd52c8..f9980963 100644 --- a/nsw/Source/bsmd.database/DBManager.cs +++ b/nsw/Source/bsmd.database/DBManager.cs @@ -569,7 +569,8 @@ namespace bsmd.database entity.PrepareSave(cmd); int queryResult = this.PerformNonQuery(cmd); this.LogNonQueryResult(cmd.CommandText, queryResult); - + this.CreateEntityHistoryEntry(entity); + if (this._closeConnectionAfterUse) this.Disconnect(); } @@ -622,7 +623,7 @@ namespace bsmd.database SqlCommand cmd = new SqlCommand(); core.PrepareSave(cmd); int queryResult = this.PerformNonQuery(cmd); - this.LogNonQueryResult(cmd.CommandText, queryResult); + this.LogNonQueryResult(cmd.CommandText, queryResult); if (this._closeConnectionAfterUse) this.Disconnect(); } @@ -710,6 +711,19 @@ namespace bsmd.database } } + private void CreateEntityHistoryEntry(DatabaseEntity entity) + { + // switch(entity.) + // 1. prüfen ob für das Objekt ein Historieneintrag angelegt werden soll + + // 2. falls ja Objekt serialisieren + + // 3. MessageHistory Element speichern + // (das könnte auch in einem Background Thread passieren, da der Wert erst irgendwann gelesen wird und aktuell nicht relevant ist) + + } + + #region CreateMessage() /// @@ -758,6 +772,8 @@ namespace bsmd.database #endregion + #region LoadDependingLists + /// /// Loads inner lists / collections /// @@ -1022,6 +1038,10 @@ namespace bsmd.database } + #endregion + + #region Error / Violation + internal void LoadErrorList(Message message) { MessageError aMessageError = new MessageError(); @@ -1055,6 +1075,42 @@ namespace bsmd.database message.SystemErrorList.Add(sError); } + internal Dictionary LoadErrorTexts() + { + SqlCommand cmd = new SqlCommand(); + cmd.CommandText = "SELECT ErrorCode, ErrorText FROM ErrorText"; + SqlDataReader reader = this.PerformCommand(cmd); + Dictionary result = new Dictionary(); + while (reader.Read()) + { + int errorCode = reader.GetInt32(0); + string errorText = reader.GetString(1); + result[errorCode] = errorText; + } + reader.Close(); + return result; + } + + internal Dictionary LoadViolationTexts() + { + SqlCommand cmd = new SqlCommand(); + cmd.CommandText = "SELECT ViolationCode, ViolationText FROM ViolationText"; + SqlDataReader reader = this.PerformCommand(cmd); + Dictionary result = new Dictionary(); + while (reader.Read()) + { + int violationCode = reader.GetInt32(0); + string violationText = reader.GetString(1); + result[violationCode] = violationText; + } + reader.Close(); + return result; + } + + #endregion + + #region Convenience loading functions + internal void LoadCustomer(MessageCore core) { if (core.CustomerId.HasValue) @@ -1155,37 +1211,7 @@ namespace bsmd.database reader.Close(); } - internal Dictionary LoadErrorTexts() - { - SqlCommand cmd = new SqlCommand(); - cmd.CommandText = "SELECT ErrorCode, ErrorText FROM ErrorText"; - SqlDataReader reader = this.PerformCommand(cmd); - Dictionary result = new Dictionary(); - while (reader.Read()) - { - int errorCode = reader.GetInt32(0); - string errorText = reader.GetString(1); - result[errorCode] = errorText; - } - reader.Close(); - return result; - } - - internal Dictionary LoadViolationTexts() - { - SqlCommand cmd = new SqlCommand(); - cmd.CommandText = "SELECT ViolationCode, ViolationText FROM ViolationText"; - SqlDataReader reader = this.PerformCommand(cmd); - Dictionary result = new Dictionary(); - while (reader.Read()) - { - int violationCode = reader.GetInt32(0); - string violationText = reader.GetString(1); - result[violationCode] = violationText; - } - reader.Close(); - return result; - } + #endregion #region DB access methods diff --git a/nsw/Source/bsmd.database/DatabaseEntity.cs b/nsw/Source/bsmd.database/DatabaseEntity.cs index 5a214bbb..e7110245 100644 --- a/nsw/Source/bsmd.database/DatabaseEntity.cs +++ b/nsw/Source/bsmd.database/DatabaseEntity.cs @@ -14,15 +14,22 @@ using System.Linq; using System.Collections.Generic; using System.Reflection; using System.Text.RegularExpressions; +using System.Xml.Serialization; +using System.IO; +using log4net; namespace bsmd.database { + [XmlInclude(typeof(Message))] + [XmlInclude(typeof(MessageCore))] + [XmlInclude(typeof(AGNT))] public abstract class DatabaseEntity : IMessageParagraph, IEquatable, ICloneable { protected Guid? id; protected string tablename; private Guid instance_id = Guid.NewGuid(); // Comparison id in case entity has not been saved + private static readonly ILog _log = LogManager.GetLogger(typeof(DatabaseEntity)); #region delegate / events // Ein etwas hakeliger Mechanismus, damit ein abhängiges Projekt (ReportGenerator) die Werte ersetzen kann ohne dass die ganze Logik @@ -360,5 +367,33 @@ namespace bsmd.database #endregion + #region Serialization + + public static DatabaseEntity Deserialize(string serializedClass) + { + + + } + + public string Serialize() + { + using (StringWriter sw = new StringWriter()) + { + try + { + XmlSerializer serializer = new XmlSerializer(this.GetType()); + serializer.Serialize(sw, this); + return sw.ToString(); + } + catch (Exception ex) + { + _log.ErrorFormat("Serialization failed: {0}", ex.Message); + } + } + return null; + } + + #endregion + } } diff --git a/nsw/Source/bsmd.database/MessageHistory.cs b/nsw/Source/bsmd.database/MessageHistory.cs new file mode 100644 index 00000000..ec27cc9b --- /dev/null +++ b/nsw/Source/bsmd.database/MessageHistory.cs @@ -0,0 +1,33 @@ +// Copyright (c) 2015-2017 schick Informatik +// Description: + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace bsmd.database +{ + public class MessageHistory + { + + #region Properties + + public Guid? ReportingPartyId { get; set; } + + ReportingParty CreatedBy { get; set; } + + public Guid EntityId { get; private set; } + + public string EntityType { get; private set; } + + public string EntityName { get; private set; } + + public string EntityValues { get; private set; } + + public DateTime Created { get; private set; } + + #endregion + + } +} diff --git a/nsw/Source/bsmd.database/bsmd.database.csproj b/nsw/Source/bsmd.database/bsmd.database.csproj index e32e1790..7db99649 100644 --- a/nsw/Source/bsmd.database/bsmd.database.csproj +++ b/nsw/Source/bsmd.database/bsmd.database.csproj @@ -76,6 +76,7 @@ +