From 87f5c3887e3311ee57491d721325da356aa2ab31 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 7 Dec 2020 16:41:46 +0100 Subject: [PATCH 1/3] EDMIService: Add Quartz Scheduler, Add Caching for Datatables --- Service.EDMIService/App.config | 4 + Service.EDMIService/EDMIService.vb | 23 +++ Service.EDMIService/EDMIService.vbproj | 26 +++ Service.EDMIService/GlobalState.vb | 11 +- Service.EDMIService/IEDMIService.vb | 5 + Service.EDMIService/Scheduler.vb | 164 ++++++++++++++++++ Service.EDMIService/Scheduler/DatatableJob.vb | 40 +++++ Service.EDMIService/Scheduler/JobListener.vb | 49 ++++++ Service.EDMIService/WindowsService.vb | 11 +- Service.EDMIService/packages.config | 7 + 10 files changed, 334 insertions(+), 6 deletions(-) create mode 100644 Service.EDMIService/Scheduler.vb create mode 100644 Service.EDMIService/Scheduler/DatatableJob.vb create mode 100644 Service.EDMIService/Scheduler/JobListener.vb diff --git a/Service.EDMIService/App.config b/Service.EDMIService/App.config index ce7ea25e..03cb00ce 100644 --- a/Service.EDMIService/App.config +++ b/Service.EDMIService/App.config @@ -59,6 +59,10 @@ + + + + diff --git a/Service.EDMIService/EDMIService.vb b/Service.EDMIService/EDMIService.vb index 08772559..12b2eb04 100644 --- a/Service.EDMIService/EDMIService.vb +++ b/Service.EDMIService/EDMIService.vb @@ -19,6 +19,7 @@ Public Class EDMIService Public Shared Filesystem As Filesystem.File Public Shared EDMIArchive As EDMI.File.Archive Public Shared GlobalState As GlobalState + Public Shared Scheduler As Scheduler Private ReadOnly _logger As Logger @@ -64,6 +65,28 @@ Public Class EDMIService End Function #End Region +#Region "Database" + Public Function ReturnDatatableFromCache(Name As String) As TableResult Implements IEDMIService.ReturnDatatableFromCache + Try + Dim oSql = "" + _logger.Info($"ReturnDatatableFromCache, SQL: {oSql}") + + Dim oDataset As DataSet = Scheduler.DataSet + Dim oDataTable As DataTable = Nothing + If oDataset.Tables.Contains(Name) Then + oDataTable = oDataset.Tables.Item(Name) + Else + Throw New ApplicationException($"DataTable {Name} does not exist") + End If + + Return New TableResult(oDataTable) + Catch ex As Exception + _logger.Error(ex) + Return New TableResult(ex.Message) + End Try + End Function +#End Region + #Region "=== Database (MSSQL IDB) ===" Public Function ReturnDatatable_MSSQL_IDB(SQL As String) As TableResult Implements IEDMIService.ReturnDatatable_MSSQL_IDB Try diff --git a/Service.EDMIService/EDMIService.vbproj b/Service.EDMIService/EDMIService.vbproj index 2d73f7da..73159239 100644 --- a/Service.EDMIService/EDMIService.vbproj +++ b/Service.EDMIService/EDMIService.vbproj @@ -67,16 +67,39 @@ ..\packages\FirebirdSql.Data.FirebirdClient.7.5.0\lib\net452\FirebirdSql.Data.FirebirdClient.dll + + ..\packages\Microsoft.Extensions.Logging.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll + ..\packages\NLog.4.7.5\lib\net45\NLog.dll + + ..\packages\Quartz.3.2.3\lib\net461\Quartz.dll + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + @@ -108,6 +131,9 @@ + + + Component diff --git a/Service.EDMIService/GlobalState.vb b/Service.EDMIService/GlobalState.vb index 9f0ed38a..adaf8feb 100644 --- a/Service.EDMIService/GlobalState.vb +++ b/Service.EDMIService/GlobalState.vb @@ -4,21 +4,23 @@ Imports DigitalData.Modules.Logging Public Class GlobalState Private ReadOnly _LogConfig As LogConfig Private ReadOnly _Logger As Logger - Private ReadOnly _MSSQL As MSSQLServer + Private ReadOnly _MSSQL_IDB As MSSQLServer + Private ReadOnly _MSSQL_ECM As MSSQLServer Public Property ObjectStores As New List(Of ObjectStore) - Public Sub New(LogConfig As LogConfig, MSSQL_IDB As MSSQLServer) + Public Sub New(LogConfig As LogConfig, MSSQL_IDB As MSSQLServer, MSSQL_ECM As MSSQLServer) _LogConfig = LogConfig _Logger = LogConfig.GetLogger() - _MSSQL = MSSQL_IDB + _MSSQL_IDB = MSSQL_IDB + _MSSQL_ECM = MSSQL_ECM End Sub Public Sub LoadObjectStores() _Logger.Debug("Loading Object Stores") Try Dim oSQL As String = "SELECT * FROM VWIDB_OBJECTSTORE" - Dim oDatatable As DataTable = _MSSQL.GetDatatable(oSQL) + Dim oDatatable As DataTable = _MSSQL_IDB.GetDatatable(oSQL) ObjectStores.Clear() @@ -36,7 +38,6 @@ Public Class GlobalState Next Catch ex As Exception _Logger.Error(ex) - Throw ex End Try End Sub diff --git a/Service.EDMIService/IEDMIService.vb b/Service.EDMIService/IEDMIService.vb index d062dfd5..dd3d012e 100644 --- a/Service.EDMIService/IEDMIService.vb +++ b/Service.EDMIService/IEDMIService.vb @@ -11,6 +11,11 @@ Interface IEDMIService Function Heartbeat() As Boolean #End Region +#Region "Database" + + Function ReturnDatatableFromCache(Name As String) As TableResult +#End Region + #Region "Database (Firebird)" Function ReturnDatatable_Firebird(SQL As String) As TableResult diff --git a/Service.EDMIService/Scheduler.vb b/Service.EDMIService/Scheduler.vb new file mode 100644 index 00000000..7a702eb9 --- /dev/null +++ b/Service.EDMIService/Scheduler.vb @@ -0,0 +1,164 @@ +Imports System.Collections.Specialized +Imports DigitalData.Modules.Database +Imports DigitalData.Modules.Logging +Imports Quartz +Imports Quartz.Impl +Imports Quartz.Impl.Matchers +Imports Quartz.Logging + +Public Class Scheduler + Private _Factory As StdSchedulerFactory + Private _MSSQL As MSSQLServer + Private _Scheduler As IScheduler + Private _LogConfig As LogConfig + Private _Logger As DigitalData.Modules.Logging.Logger + Private _JobListener As JobListener + + Private _Props = New NameValueCollection From { + {"quartz.serializer.type", "binary"} + } + + Private Const JOB_GROUP As String = "DatatableJobs" + + Public ReadOnly Property DataSet As DataSet + Get + Return _JobListener.Dataset + End Get + End Property + + Public Sub New(LogConfig As LogConfig, MSSQL_ECM As MSSQLServer) + _LogConfig = LogConfig + _Logger = LogConfig.GetLogger() + _Factory = New StdSchedulerFactory(_Props) + _MSSQL = MSSQL_ECM + + Dim oDataSet As New DataSet() + _JobListener = New JobListener(LogConfig, oDataSet) + + Quartz.Logging.LogProvider.SetCurrentLogProvider(New LogProvider(_Logger)) + End Sub + + Public Async Sub Start() + ' Get new scheduler + _Scheduler = Await _Factory.GetScheduler() + + ' configure it + _Scheduler.ListenerManager.AddJobListener(_JobListener, + GroupMatcher(Of JobKey).GroupEquals(JOB_GROUP)) + + ' start it + Await _Scheduler.Start() + + Dim oCronjobs As DataTable = Await GetCronJobs() + + Try + If oCronjobs IsNot Nothing Then + _Logger.Debug("Loaded {0} cron jobs", oCronjobs.Rows.Count) + + For Each oRow As DataRow In oCronjobs.Rows + Dim oDefinition As String = oRow.Item("CRON_DEFINITION") + Dim oTitle As String = oRow.Item("TITLE") + Dim oGuid As Integer = oRow.Item("GUID") + Dim oCronDetails As DataTable = Await GetCronJobDetails(oGuid) + + If oCronDetails IsNot Nothing Then + _Logger.Debug("Loaded job [{0}]", oTitle) + _Logger.Debug("Job details: {0}", oCronDetails.Rows.Count) + _Logger.Debug("Job definition: {0}", oDefinition) + + For Each oRowDetail In oCronDetails.Rows + Dim oTrigger As ITrigger + Dim oJob As IJobDetail + + oTrigger = TriggerBuilder.Create(). + WithIdentity(oTitle). + WithCronSchedule(oDefinition). + StartNow(). + Build() + + oJob = JobBuilder.Create(Of DatatableJob)(). + WithIdentity(oGuid, JOB_GROUP). + UsingJobData(New JobDataMap() From { + {"LogConfig", _LogConfig}, + {"MSSQL", _MSSQL}, + {"CronJobId", oGuid}, + {"CronJobTitle", oTitle}, + {"CronJobDetails", oRowDetail} + }). + Build() + + Await _Scheduler.ScheduleJob(oJob, oTrigger) + _Logger.Debug("Scheduled a new job for Cron Job Id [{0}]", oGuid) + Next + Else + _Logger.Warn("CronJob Details for CronJob [{0}] could not be fetched!", oGuid) + End If + Next + Else + _Logger.Warn("CronJobs could not be fetched!") + End If + Catch ex As Exception + _Logger.Error(ex) + _Logger.Warn("Unexpected Error while setting up scheduler: " & ex.Message) + End Try + End Sub + + Public Async Function GetCronJobs() As Task(Of DataTable) + Try + Dim oSQL As String = "SELECT * FROM TBAPPSERV_CRON_JOB WHERE ACTIVE = 1" + Dim oDatatable As DataTable = Await _MSSQL.GetDatatableAsync(oSQL) + + Return oDatatable + Catch ex As Exception + Return Nothing + End Try + End Function + + Public Async Function GetCronJobDetails(CronJobId As Integer) As Task(Of DataTable) + Try + Dim oSQL As String = $"SELECT * FROM TBAPPSERV_CRON_DETAIL WHERE CRON_ID = {CronJobId}" + Dim oDatatable As DataTable = Await _MSSQL.GetDatatableAsync(oSQL) + + Return oDatatable + Catch ex As Exception + Return Nothing + End Try + End Function + + Public Async Sub [Stop]() + Await _Scheduler.Shutdown() + End Sub + + Private Class LogProvider + Implements ILogProvider + + Private _Logger As Modules.Logging.Logger + + Public Sub New(Logger As DigitalData.Modules.Logging.Logger) + MyBase.New() + _Logger = Logger + End Sub + + Public Function OpenNestedContext(message As String) As IDisposable Implements ILogProvider.OpenNestedContext + Throw New NotImplementedException() + End Function + + Public Function OpenMappedContext(key As String, value As Object, Optional destructure As Boolean = False) As IDisposable Implements ILogProvider.OpenMappedContext + Throw New NotImplementedException() + End Function + + Private Function GetLogger(name As String) As Logging.Logger Implements ILogProvider.GetLogger + Return Function(level, func, exception, parameters) + If exception IsNot Nothing Then + _Logger.Error(exception) + ElseIf level >= LogLevel.Debug AndAlso func IsNot Nothing Then + _Logger.Debug(func(), parameters) + ElseIf level >= LogLevel.Info AndAlso func IsNot Nothing Then + _Logger.Info(func(), parameters) + End If + + Return True + End Function + End Function + End Class +End Class diff --git a/Service.EDMIService/Scheduler/DatatableJob.vb b/Service.EDMIService/Scheduler/DatatableJob.vb new file mode 100644 index 00000000..a87d6252 --- /dev/null +++ b/Service.EDMIService/Scheduler/DatatableJob.vb @@ -0,0 +1,40 @@ +Imports DigitalData.Modules.Database +Imports DigitalData.Modules.Logging +Imports Quartz + +Public Class DatatableJob + Implements IJob + + Public Function Execute(context As IJobExecutionContext) As Task Implements IJob.Execute + Dim oJobData = context.MergedJobDataMap + Dim oLogConfig As LogConfig = oJobData.Item("LogConfig") + Dim oCronJobTitle As String = oJobData.Item("CronJobTitle") + Dim oDetailRow As DataRow = oJobData.Item("CronJobDetails") + Dim oMSSQL As MSSQLServer = oJobData.Item("MSSQL") + + Dim oConnectionId As Integer = oDetailRow.Item("CON_ID") + Dim oTitle As String = oDetailRow.Item("TITLE") + Dim oDatatableName As String = oDetailRow.Item("DT_NAME") + Dim oSQL As String = oDetailRow.Item("COMMAND") + + Dim oLogger As Logger = oLogConfig.GetLogger() + oLogger.Debug("Running Command-Job [{0}]", oTitle) + oLogger.Debug("Datatable Name: {0}", oDatatableName) + oLogger.Debug("Connection Id: {0}", oConnectionId) + + Dim oConnectionString = oMSSQL.Get_ConnectionStringforID(oConnectionId) + + Try + Dim oResult = oMSSQL.GetDatatableWithConnection(oSQL, oConnectionString) + oResult.TableName = oDatatableName + oLogger.Debug("Result Datatable contains [{0}] rows", oResult.Rows.Count) + + ' Das Ergebnis speichern + context.Result = oResult + Catch ex As Exception + oLogger.Warn("Unhandled exception while executing SQL for Datatable {}") + End Try + + Return Task.FromResult(True) + End Function +End Class diff --git a/Service.EDMIService/Scheduler/JobListener.vb b/Service.EDMIService/Scheduler/JobListener.vb new file mode 100644 index 00000000..adb32c33 --- /dev/null +++ b/Service.EDMIService/Scheduler/JobListener.vb @@ -0,0 +1,49 @@ +Imports System.Threading +Imports DigitalData.Modules.Logging +Imports Quartz +Imports Quartz.Listener + +Public Class JobListener + Inherits JobListenerSupport + Public Overrides ReadOnly Property Name As String = "JobListener" + Public Property Dataset As DataSet + + Private ReadOnly _Logger As Logger + Private ReadOnly _LogConfig As LogConfig + + Public Sub New(LogConfig As LogConfig, ResultDataSet As DataSet) + MyBase.New() + + _LogConfig = LogConfig + _Logger = LogConfig.GetLogger() + Dataset = ResultDataSet + End Sub + + Public Overrides Function JobWasExecuted(context As IJobExecutionContext, jobException As JobExecutionException, Optional cancellationToken As CancellationToken = Nothing) As Task + Try + Dim oDataTable As DataTable = context.Result + Dim oDetailRow As DataRow = context.MergedJobDataMap.Item("CronJobDetails") + Dim oDatatableName As String = oDetailRow.Item("DT_NAME") + Dim oDatatableNameTemp As String = oDatatableName & "-TEMP" + + If Dataset.Tables.Contains(oDatatableName) Then + _Logger.Debug("DataTable exists, renaming and replacing") + ' Rename the new table, add TEMP suffix + oDataTable.TableName = oDatatableNameTemp + ' Add the new table to the dataset + Dataset.Tables.Add(oDataTable) + ' Remove the old table + Dataset.Tables.Remove(oDatatableName) + ' Rename the new table + Dataset.Tables.Item(oDatatableNameTemp).TableName = oDatatableName + Else + _Logger.Debug("DataTable does not exist, adding") + Dataset.Tables.Add(oDataTable) + End If + Catch ex As Exception + _Logger.Error(ex) + End Try + + Return MyBase.JobWasExecuted(context, jobException, cancellationToken) + End Function +End Class diff --git a/Service.EDMIService/WindowsService.vb b/Service.EDMIService/WindowsService.vb index d9accdbc..20deb2a8 100644 --- a/Service.EDMIService/WindowsService.vb +++ b/Service.EDMIService/WindowsService.vb @@ -23,6 +23,7 @@ Public Class WindowsService Private _Archive As EDMI.File.Archive Private _Filesystem As Filesystem.File Private _Global As GlobalState + Private _Scheduler As Scheduler Public Sub New() ServiceName = SERVICE_NAME @@ -37,6 +38,7 @@ Public Class WindowsService Dim oServicePath As String = AppDomain.CurrentDomain.BaseDirectory _LogConfig = New LogConfig(LogConfig.PathType.CustomPath, oServicePath) + _LogConfig.Debug = True _Logger = _LogConfig.GetLogger() _Logger.Info("Service {0} is starting...", SERVICE_DISPLAY_NAME) _Logger.Info("ServiceDirectory: {0}", oServicePath) @@ -56,11 +58,15 @@ Public Class WindowsService _Archive = New EDMI.File.Archive(_LogConfig) _Filesystem = New Filesystem.File(_LogConfig) - _Global = New GlobalState(_LogConfig, _MSSQL_IDB) + _Global = New GlobalState(_LogConfig, _MSSQL_IDB, _MSSQL_ECM) + _Scheduler = New Scheduler(_LogConfig, _MSSQL_ECM) _Logger.Debug("Loading Objectstores") _Global.LoadObjectStores() + _Logger.Debug("Starting Scheduler") + _Scheduler.Start() + _Logger.Debug("Preparing WCF ServiceHost") EDMIService.MSSQL_ECM = _MSSQL_ECM EDMIService.MSSQL_IDB = _MSSQL_IDB @@ -70,6 +76,7 @@ Public Class WindowsService EDMIService.EDMIArchive = _Archive EDMIService.Filesystem = _Filesystem EDMIService.GlobalState = _Global + EDMIService.Scheduler = _Scheduler _Logger.Debug("Starting WCF ServiceHost") _ServiceHost = New ServiceHost(GetType(EDMIService)) @@ -121,6 +128,8 @@ Public Class WindowsService _ServiceHost.Close() _ServiceHost = Nothing End If + + _Scheduler.Stop() End Sub End Class diff --git a/Service.EDMIService/packages.config b/Service.EDMIService/packages.config index ac410915..4c04c214 100644 --- a/Service.EDMIService/packages.config +++ b/Service.EDMIService/packages.config @@ -1,5 +1,12 @@  + + + + + + + \ No newline at end of file From cafa8cdbf325242209a869b2aa7376c0f40d23c0 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 7 Dec 2020 16:42:02 +0100 Subject: [PATCH 2/3] EDMI.API: Update ServiceReference --- ...viceReference.DocumentResultOld.datasource | 10 - ...DMIServiceReference.IndexResult.datasource | 10 - .../DigitalData.Modules.Filesystem.xsd | 11 - ...italData.Services.EDMIService.Results.xsd} | 25 +- .../DigitalData.Services.EDMIService.wsdl | 163 ++++---- .../DigitalData.Services.EDMIService.xsd | 107 ++--- .../EDMIServiceReference/Reference.svcmap | 3 +- .../EDMIServiceReference/Reference.vb | 383 +++++------------- .../EDMIServiceReference/service.wsdl | 58 +-- Modules.EDMIAPI/EDMI.API.vbproj | 11 +- 10 files changed, 237 insertions(+), 544 deletions(-) delete mode 100644 Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.DocumentResultOld.datasource delete mode 100644 Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.IndexResult.datasource delete mode 100644 Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.Filesystem.xsd rename Modules.EDMIAPI/Connected Services/EDMIServiceReference/{DigitalData.Services.EDMIService1.xsd => DigitalData.Services.EDMIService.Results.xsd} (62%) diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.DocumentResultOld.datasource b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.DocumentResultOld.datasource deleted file mode 100644 index 3c56e249..00000000 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.DocumentResultOld.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - DigitalData.Modules.EDMI.API.EDMIServiceReference.DocumentResultOld, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.IndexResult.datasource b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.IndexResult.datasource deleted file mode 100644 index ab3d3148..00000000 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.IndexResult.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - DigitalData.Modules.EDMI.API.EDMIServiceReference.IndexResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.Filesystem.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.Filesystem.xsd deleted file mode 100644 index 74df549b..00000000 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.Filesystem.xsd +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService1.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Results.xsd similarity index 62% rename from Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService1.xsd rename to Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Results.xsd index 1158774c..4c749748 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService1.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Results.xsd @@ -1,6 +1,5 @@  - - + @@ -49,26 +48,4 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl index 79b1af83..58a4896e 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl @@ -4,10 +4,9 @@ - + - @@ -17,71 +16,65 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - + + @@ -102,60 +95,50 @@ - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + @@ -169,9 +152,5 @@ - - - - \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd index 4650e6f9..b4dd2d43 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd @@ -1,7 +1,6 @@  - - + @@ -15,156 +14,143 @@ - + - - + - + - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - - + - + - + - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -196,7 +182,7 @@ - + @@ -221,21 +207,4 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap index 0dd586d8..778a5cea 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap @@ -26,10 +26,9 @@ - + - diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb index 1c5b2359..4b96be39 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb @@ -18,12 +18,10 @@ Namespace EDMIServiceReference _ Partial Public Class BaseResult Inherits Object @@ -86,15 +84,12 @@ Namespace EDMIServiceReference _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(System.DBNull))> _ Partial Public Class ScalarResult Inherits EDMIServiceReference.BaseResult @@ -117,7 +112,7 @@ Namespace EDMIServiceReference _ Partial Public Class NonQueryResult Inherits EDMIServiceReference.BaseResult @@ -125,83 +120,7 @@ Namespace EDMIServiceReference _ - Partial Public Class DocumentResultOld - Inherits EDMIServiceReference.BaseResult - - Private ContentsField() As Byte - - Private DocumentField As EDMIServiceReference.DocumentObject - - Private HasContentsField As Boolean - - _ - Public Property Contents() As Byte() - Get - Return Me.ContentsField - End Get - Set - If (Object.ReferenceEquals(Me.ContentsField, value) <> true) Then - Me.ContentsField = value - Me.RaisePropertyChanged("Contents") - End If - End Set - End Property - - _ - Public Property Document() As EDMIServiceReference.DocumentObject - Get - Return Me.DocumentField - End Get - Set - If (Object.ReferenceEquals(Me.DocumentField, value) <> true) Then - Me.DocumentField = value - Me.RaisePropertyChanged("Document") - End If - End Set - End Property - - _ - Public Property HasContents() As Boolean - Get - Return Me.HasContentsField - End Get - Set - If (Me.HasContentsField.Equals(value) <> true) Then - Me.HasContentsField = value - Me.RaisePropertyChanged("HasContents") - End If - End Set - End Property - End Class - - _ - Partial Public Class IndexResult - Inherits EDMIServiceReference.BaseResult - - Private IndexIdField As Long - - _ - Public Property IndexId() As Long - Get - Return Me.IndexIdField - End Get - Set - If (Me.IndexIdField.Equals(value) <> true) Then - Me.IndexIdField = value - Me.RaisePropertyChanged("IndexId") - End If - End Set - End Property - End Class - - _ Partial Public Class TableResult Inherits EDMIServiceReference.BaseResult @@ -223,82 +142,6 @@ Namespace EDMIServiceReference End Property End Class - _ - Partial Public Class DocumentObject - Inherits Object - Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged - - _ - Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject - - Private ContainerIdField As String - - Private DocumentIdField As Long - - Private FileNameField As String - - _ - Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData - Get - Return Me.extensionDataField - End Get - Set - Me.extensionDataField = value - End Set - End Property - - _ - Public Property ContainerId() As String - Get - Return Me.ContainerIdField - End Get - Set - If (Object.ReferenceEquals(Me.ContainerIdField, value) <> true) Then - Me.ContainerIdField = value - Me.RaisePropertyChanged("ContainerId") - End If - End Set - End Property - - _ - Public Property DocumentId() As Long - Get - Return Me.DocumentIdField - End Get - Set - If (Me.DocumentIdField.Equals(value) <> true) Then - Me.DocumentIdField = value - Me.RaisePropertyChanged("DocumentId") - End If - End Set - End Property - - _ - Public Property FileName() As String - Get - Return Me.FileNameField - End Get - Set - If (Object.ReferenceEquals(Me.FileNameField, value) <> true) Then - Me.FileNameField = value - Me.RaisePropertyChanged("FileName") - End If - End Set - End Property - - Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged - - Protected Sub RaisePropertyChanged(ByVal propertyName As String) - Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent - If (Not (propertyChanged) Is Nothing) Then - propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName)) - End If - End Sub - End Class - _ Public Interface IEDMIService @@ -309,79 +152,85 @@ Namespace EDMIServiceReference _ Function HeartbeatAsync() As System.Threading.Tasks.Task(Of Boolean) - _ - Function CreateDatabaseRequest(ByVal Name As String, ByVal Debug As Boolean) As String - - _ - Function CreateDatabaseRequestAsync(ByVal Name As String, ByVal Debug As Boolean) As System.Threading.Tasks.Task(Of String) - - _ - Sub CloseDatabaseRequest() + _ + Function ReturnDatatableFromCache(ByVal Name As String) As EDMIServiceReference.TableResult - _ - Function CloseDatabaseRequestAsync() As System.Threading.Tasks.Task + _ + Function ReturnDatatableFromCacheAsync(ByVal Name As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) - _ - Function ReturnDatatable(ByVal SQL As String) As EDMIServiceReference.TableResult + _ + Function ReturnDatatable_Firebird(ByVal SQL As String) As EDMIServiceReference.TableResult - _ - Function ReturnDatatableAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) + _ + Function ReturnDatatable_FirebirdAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) - _ - Function ReturnScalar(ByVal SQL As String) As EDMIServiceReference.ScalarResult + _ + Function ReturnScalar_Firebird(ByVal SQL As String) As EDMIServiceReference.ScalarResult - _ - Function ReturnScalarAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.ScalarResult) + _ + Function ReturnScalar_FirebirdAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.ScalarResult) - _ - Function ExecuteNonQuery(ByVal SQL As String) As EDMIServiceReference.NonQueryResult + _ + Function ExecuteNonQuery_Firebird(ByVal SQL As String) As EDMIServiceReference.NonQueryResult - _ - Function ExecuteNonQueryAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.NonQueryResult) + _ + Function ExecuteNonQuery_FirebirdAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.NonQueryResult) - _ - Function NewFile(ByVal FileName As String, ByVal Contents() As Byte) As EDMIServiceReference.DocumentResultOld + _ + Function ReturnDatatable_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.TableResult - _ - Function NewFileAsync(ByVal FileName As String, ByVal Contents() As Byte) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentResultOld) + _ + Function ReturnDatatable_MSSQL_IDBAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) - _ - Function UpdateFile(ByVal DocObject As EDMIServiceReference.DocumentObject, ByVal Contents() As Byte) As EDMIServiceReference.DocumentResultOld + _ + Function ReturnScalar_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.ScalarResult - _ - Function UpdateFileAsync(ByVal DocObject As EDMIServiceReference.DocumentObject, ByVal Contents() As Byte) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentResultOld) + _ + Function ReturnScalar_MSSQL_IDBAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.ScalarResult) - _ - Function GetFile(ByVal DocObject As EDMIServiceReference.DocumentObject) As EDMIServiceReference.DocumentResultOld + _ + Function ExecuteNonQuery_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.NonQueryResult - _ - Function GetFileAsync(ByVal DocObject As EDMIServiceReference.DocumentObject) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentResultOld) + _ + Function ExecuteNonQuery_MSSQL_IDBAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.NonQueryResult) - _ - Function DeleteFile(ByVal DocObject As EDMIServiceReference.DocumentObject) As Boolean + _ + Function ReturnDatatable_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.TableResult - _ - Function DeleteFileAsync(ByVal DocObject As EDMIServiceReference.DocumentObject) As System.Threading.Tasks.Task(Of Boolean) + _ + Function ReturnDatatable_MSSQL_ECMAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) - _ - Function GetDocumentByDocumentId(ByVal DocumentId As Long) As EDMIServiceReference.DocumentResultOld + _ + Function ReturnScalar_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.ScalarResult - _ - Function GetDocumentByDocumentIdAsync(ByVal DocumentId As Long) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentResultOld) + _ + Function ReturnScalar_MSSQL_ECMAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.ScalarResult) - _ - Function GetDocumentByContainerId(ByVal ContainerId As String) As EDMIServiceReference.DocumentResultOld + _ + Function ExecuteNonQuery_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.NonQueryResult - _ - Function GetDocumentByContainerIdAsync(ByVal ContainerId As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentResultOld) + _ + Function ExecuteNonQuery_MSSQL_ECMAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.NonQueryResult) 'CODEGEN: Der Nachrichtenvertrag wird generiert, da der Wrappername (DocumentImportRequest) von Nachricht "DocumentImportRequest" nicht mit dem Standardwert (ImportFile) übereinstimmt. _ @@ -403,12 +252,6 @@ Namespace EDMIServiceReference _ Function ListFilesForUserAsync(ByVal request As EDMIServiceReference.ListFilesForUserRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentListResponse) - - _ - Function NewFileIndex(ByVal DocObject As EDMIServiceReference.DocumentObject, ByVal Syskey As String, ByVal LanguageCode As String, ByVal Value As String) As EDMIServiceReference.IndexResult - - _ - Function NewFileIndexAsync(ByVal DocObject As EDMIServiceReference.DocumentObject, ByVal Syskey As String, ByVal LanguageCode As String, ByVal Value As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.IndexResult) End Interface _ @@ -739,13 +574,5 @@ Namespace EDMIServiceReference Dim inValue As EDMIServiceReference.ListFilesForUserRequest = New EDMIServiceReference.ListFilesForUserRequest() Return CType(Me,EDMIServiceReference.IEDMIService).ListFilesForUserAsync(inValue) End Function - - Public Function NewFileIndex(ByVal DocObject As EDMIServiceReference.DocumentObject, ByVal Syskey As String, ByVal LanguageCode As String, ByVal Value As String) As EDMIServiceReference.IndexResult Implements EDMIServiceReference.IEDMIService.NewFileIndex - Return MyBase.Channel.NewFileIndex(DocObject, Syskey, LanguageCode, Value) - End Function - - Public Function NewFileIndexAsync(ByVal DocObject As EDMIServiceReference.DocumentObject, ByVal Syskey As String, ByVal LanguageCode As String, ByVal Value As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.IndexResult) Implements EDMIServiceReference.IEDMIService.NewFileIndexAsync - Return MyBase.Channel.NewFileIndexAsync(DocObject, Syskey, LanguageCode, Value) - End Function End Class End Namespace diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl index 392381ce..aaced7c1 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/service.wsdl @@ -50,8 +50,8 @@ - - + + @@ -59,8 +59,8 @@ - - + + @@ -68,8 +68,8 @@ - - + + @@ -77,8 +77,8 @@ - - + + @@ -86,8 +86,8 @@ - - + + @@ -95,8 +95,8 @@ - - + + @@ -104,8 +104,8 @@ - - + + @@ -113,8 +113,8 @@ - - + + @@ -122,8 +122,8 @@ - - + + @@ -131,17 +131,8 @@ - - - - - - - - - - - + + @@ -177,15 +168,6 @@ - - - - - - - - - diff --git a/Modules.EDMIAPI/EDMI.API.vbproj b/Modules.EDMIAPI/EDMI.API.vbproj index 5fc2a8da..e11f662b 100644 --- a/Modules.EDMIAPI/EDMI.API.vbproj +++ b/Modules.EDMIAPI/EDMI.API.vbproj @@ -111,15 +111,9 @@ Reference.svcmap - - Reference.svcmap - Reference.svcmap - - Reference.svcmap - Reference.svcmap @@ -129,16 +123,13 @@ Reference.svcmap - + Designer Designer - - Designer - Designer From 4c9abf3b1f7de8953853a4544ccce7a7ab08e954 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Tue, 8 Dec 2020 14:40:43 +0100 Subject: [PATCH 3/3] jj appserv --- GUIs.Test.EDMIBenchmark/Form1.Designer.vb | 67 ++++++++++++++----- GUIs.Test.EDMIBenchmark/Form1.resx | 45 ++++++++++++- GUIs.Test.EDMIBenchmark/Form1.vb | 23 +++++++ Modules.EDMIAPI/Client.vb | 17 ++++- Service.EDMIService/EDMIService.vb | 32 +++++++-- Service.EDMIService/EDMIService.vbproj | 4 ++ Service.EDMIService/IEDMIService.vb | 2 +- Service.EDMIService/Scheduler.vb | 26 ++++--- Service.EDMIService/Scheduler/DatatableJob.vb | 27 ++++---- Service.EDMIService/Scheduler/JobListener.vb | 13 +++- 10 files changed, 208 insertions(+), 48 deletions(-) diff --git a/GUIs.Test.EDMIBenchmark/Form1.Designer.vb b/GUIs.Test.EDMIBenchmark/Form1.Designer.vb index aac11258..d15fa96f 100644 --- a/GUIs.Test.EDMIBenchmark/Form1.Designer.vb +++ b/GUIs.Test.EDMIBenchmark/Form1.Designer.vb @@ -40,10 +40,15 @@ Partial Class Form1 Me.BarToggleSwitchItem1 = New DevExpress.XtraBars.BarToggleSwitchItem() Me.BarDockingMenuItem1 = New DevExpress.XtraBars.BarDockingMenuItem() Me.BarMdiChildrenListItem1 = New DevExpress.XtraBars.BarMdiChildrenListItem() + Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem() + Me.TextboxDatatableName = New DevExpress.XtraBars.BarEditItem() + Me.RepositoryItemTextEdit2 = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit() + Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem() Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup4 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.RibbonPageGroup2 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.DocumentManager1 = New DevExpress.XtraBars.Docking2010.DocumentManager(Me.components) @@ -68,11 +73,11 @@ Partial Class Form1 Me.DockPanel2_Container = New DevExpress.XtraBars.Docking.ControlContainer() Me.DocumentViewer1 = New DigitalData.Controls.DocumentViewer.DocumentViewer() Me.Timer1 = New System.Windows.Forms.Timer(Me.components) - Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem() CType(Me.DocumentGroup1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.Document1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.RepositoryItemTextEdit1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.RepositoryItemTextEdit2, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.DocumentManager1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.TabbedView1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.DockManager1, System.ComponentModel.ISupportInitialize).BeginInit() @@ -110,14 +115,14 @@ Partial Class Form1 'RibbonControl1 ' Me.RibbonControl1.ExpandCollapseItem.Id = 0 - Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.ButtonSelectFiles, Me.ButtonImportFiles, Me.buttonClearLog, Me.buttonClearFiles, Me.TextboxObjectId, Me.ButtonLoadFile, Me.BarListItem1, Me.BarButtonItem2, Me.BarToggleSwitchItem1, Me.BarDockingMenuItem1, Me.BarMdiChildrenListItem1, Me.BarButtonItem1}) + Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.RibbonControl1.SearchEditItem, Me.ButtonSelectFiles, Me.ButtonImportFiles, Me.buttonClearLog, Me.buttonClearFiles, Me.TextboxObjectId, Me.ButtonLoadFile, Me.BarListItem1, Me.BarButtonItem2, Me.BarToggleSwitchItem1, Me.BarDockingMenuItem1, Me.BarMdiChildrenListItem1, Me.BarButtonItem1, Me.TextboxDatatableName, Me.BarButtonItem3}) Me.RibbonControl1.Location = New System.Drawing.Point(0, 0) - Me.RibbonControl1.MaxItemId = 14 + Me.RibbonControl1.MaxItemId = 17 Me.RibbonControl1.Name = "RibbonControl1" Me.RibbonControl1.PageHeaderItemLinks.Add(Me.BarDockingMenuItem1) Me.RibbonControl1.PageHeaderItemLinks.Add(Me.BarMdiChildrenListItem1) Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1}) - Me.RibbonControl1.RepositoryItems.AddRange(New DevExpress.XtraEditors.Repository.RepositoryItem() {Me.RepositoryItemTextEdit1}) + Me.RibbonControl1.RepositoryItems.AddRange(New DevExpress.XtraEditors.Repository.RepositoryItem() {Me.RepositoryItemTextEdit1, Me.RepositoryItemTextEdit2}) Me.RibbonControl1.Size = New System.Drawing.Size(1310, 158) Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1 ' @@ -149,14 +154,14 @@ Partial Class Form1 Me.buttonClearFiles.ImageOptions.SvgImage = CType(resources.GetObject("buttonClearFiles.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) Me.buttonClearFiles.Name = "buttonClearFiles" ' - 'TextboxObejctId + 'TextboxObjectId ' Me.TextboxObjectId.Caption = "Document Id" Me.TextboxObjectId.Edit = Me.RepositoryItemTextEdit1 Me.TextboxObjectId.EditWidth = 100 Me.TextboxObjectId.Id = 5 - Me.TextboxObjectId.ImageOptions.SvgImage = CType(resources.GetObject("TextboxObejctId.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) - Me.TextboxObjectId.Name = "TextboxObejctId" + Me.TextboxObjectId.ImageOptions.SvgImage = CType(resources.GetObject("TextboxObjectId.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.TextboxObjectId.Name = "TextboxObjectId" ' 'RepositoryItemTextEdit1 ' @@ -203,9 +208,35 @@ Partial Class Form1 Me.BarMdiChildrenListItem1.Id = 12 Me.BarMdiChildrenListItem1.Name = "BarMdiChildrenListItem1" ' + 'BarButtonItem1 + ' + Me.BarButtonItem1.Caption = "Open Log Directory" + Me.BarButtonItem1.Id = 13 + Me.BarButtonItem1.Name = "BarButtonItem1" + ' + 'TextboxDatatableName + ' + Me.TextboxDatatableName.Caption = "Datatable Name" + Me.TextboxDatatableName.Edit = Me.RepositoryItemTextEdit2 + Me.TextboxDatatableName.Id = 15 + Me.TextboxDatatableName.ImageOptions.SvgImage = CType(resources.GetObject("TextboxDatatableName.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.TextboxDatatableName.Name = "TextboxDatatableName" + ' + 'RepositoryItemTextEdit2 + ' + Me.RepositoryItemTextEdit2.AutoHeight = False + Me.RepositoryItemTextEdit2.Name = "RepositoryItemTextEdit2" + ' + 'BarButtonItem3 + ' + Me.BarButtonItem3.Caption = "Load Datatable" + Me.BarButtonItem3.Id = 16 + Me.BarButtonItem3.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem3.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) + Me.BarButtonItem3.Name = "BarButtonItem3" + ' 'RibbonPage1 ' - Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroup4, Me.RibbonPageGroup3}) + Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroup4, Me.RibbonPageGroup3, Me.RibbonPageGroup2}) Me.RibbonPage1.Name = "RibbonPage1" Me.RibbonPage1.Text = "Start" ' @@ -223,7 +254,7 @@ Partial Class Form1 Me.RibbonPageGroup4.ItemLinks.Add(Me.ButtonLoadFile) Me.RibbonPageGroup4.ItemLinks.Add(Me.BarButtonItem2) Me.RibbonPageGroup4.Name = "RibbonPageGroup4" - Me.RibbonPageGroup4.Text = "Retrieve" + Me.RibbonPageGroup4.Text = "Retrieve Document" ' 'RibbonPageGroup3 ' @@ -233,6 +264,13 @@ Partial Class Form1 Me.RibbonPageGroup3.Name = "RibbonPageGroup3" Me.RibbonPageGroup3.Text = "Utils" ' + 'RibbonPageGroup2 + ' + Me.RibbonPageGroup2.ItemLinks.Add(Me.TextboxDatatableName) + Me.RibbonPageGroup2.ItemLinks.Add(Me.BarButtonItem3) + Me.RibbonPageGroup2.Name = "RibbonPageGroup2" + Me.RibbonPageGroup2.Text = "Retrieve Datatable" + ' 'RibbonStatusBar1 ' Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 640) @@ -443,12 +481,6 @@ Partial Class Form1 ' Me.Timer1.Interval = 3000 ' - 'BarButtonItem1 - ' - Me.BarButtonItem1.Caption = "Open Log Directory" - Me.BarButtonItem1.Id = 13 - Me.BarButtonItem1.Name = "BarButtonItem1" - ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -466,6 +498,7 @@ Partial Class Form1 CType(Me.Document1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.RepositoryItemTextEdit1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.RepositoryItemTextEdit2, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.DocumentManager1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.TabbedView1, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.DockManager1, System.ComponentModel.ISupportInitialize).EndInit() @@ -532,4 +565,8 @@ Partial Class Form1 Friend WithEvents BarDockingMenuItem1 As DevExpress.XtraBars.BarDockingMenuItem Friend WithEvents BarMdiChildrenListItem1 As DevExpress.XtraBars.BarMdiChildrenListItem Friend WithEvents BarButtonItem1 As DevExpress.XtraBars.BarButtonItem + Friend WithEvents TextboxDatatableName As DevExpress.XtraBars.BarEditItem + Friend WithEvents RepositoryItemTextEdit2 As DevExpress.XtraEditors.Repository.RepositoryItemTextEdit + Friend WithEvents BarButtonItem3 As DevExpress.XtraBars.BarButtonItem + Friend WithEvents RibbonPageGroup2 As DevExpress.XtraBars.Ribbon.RibbonPageGroup End Class diff --git a/GUIs.Test.EDMIBenchmark/Form1.resx b/GUIs.Test.EDMIBenchmark/Form1.resx index bc8018dc..1eff7f9f 100644 --- a/GUIs.Test.EDMIBenchmark/Form1.resx +++ b/GUIs.Test.EDMIBenchmark/Form1.resx @@ -196,7 +196,7 @@ Ny41LDExLjh6IiBjbGFzcz0iUmVkIiAvPg0KPC9zdmc+Cw== - + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl @@ -284,6 +284,49 @@ PSJXaGl0ZSIgLz4NCiAgPGcgaWQ9IkxheWVyXzMiIGNsYXNzPSJzdDAiPg0KICAgIDxwYXRoIGQ9Ik0x NSw4VjdoLTNWNWgtMXYySDVWNUg0djJIMXYxaDN2MkgxdjFoM3YyaDF2LTJoNnYyaDF2LTJoM3YtMWgt M1Y4SDE1eiBNMTEsMTBINVY4aDZWMTB6IiBjbGFzcz0iQmxhY2siIC8+DQogIDwvZz4NCjwvc3ZnPgs= + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGkEAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAxNiAxNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MTYgMTYiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku + R3JlZW57ZmlsbDojMDM5QzIzO30KCS5XaGl0ZXtmaWxsOiNGRkZGRkY7fQoJLnN0MHtvcGFjaXR5OjAu + Njt9Cgkuc3Qxe29wYWNpdHk6MC41O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTE1LDFIMUMwLjUsMSww + LDEuNSwwLDJ2MTJjMCwwLjUsMC41LDEsMSwxaDE0YzAuNSwwLDEtMC41LDEtMVYyQzE2LDEuNSwxNS41 + LDEsMTUsMXogTTE1LDE0SDFWMmgxNFYxNHoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPHBhdGggZD0iTTAs + NVYyYzAtMC41LDAuNS0xLDEtMWgxNGMwLjYsMCwxLDAuNSwxLDF2M0gweiIgY2xhc3M9IkdyZWVuIiAv + Pg0KICA8ZyBpZD0iTGF5ZXJfMiIgY2xhc3M9InN0MCI+DQogICAgPHJlY3QgeD0iMSIgeT0iMiIgd2lk + dGg9IjE0IiBoZWlnaHQ9IjIiIHJ4PSIwIiByeT0iMCIgY2xhc3M9IldoaXRlIiAvPg0KICA8L2c+DQog + IDxyZWN0IHg9IjEiIHk9IjUiIHdpZHRoPSIxNCIgaGVpZ2h0PSI5IiByeD0iMCIgcnk9IjAiIGNsYXNz + PSJXaGl0ZSIgLz4NCiAgPHBhdGggZD0iTTUsMTJWN2gxdjVINXoiIGNsYXNzPSJCbGFjayIgLz4NCiAg + PHBhdGggZD0iTTExLDEyaC0xbDAtMC42QzkuOCwxMS42LDkuNSwxMiw4LjcsMTJjLTAuNSwwLTAuOS0w + LjItMS4yLTAuNUM3LjIsMTEuMiw3LDEwLjcsNywxMC4xQzcsOS41LDcuMiw5LDcuNSw4LjcgIGMwLjMt + MC4zLDAuNy0wLjUsMS4yLTAuNXMwLjksMC4yLDEuMiwwLjVWN0gxMVYxMnogTTguMSwxMC4xYzAsMC40 + LDAsMS4yLDAuOSwxLjJjMC44LDAsMC45LTAuOCwwLjktMS4xQzkuOSw5LjgsOS44LDksOSw5ICBDOC4z + LDksOC4xLDkuNyw4LjEsMTAuMXoiIGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs= + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjE5LjIsIFZlcnNpb249MTkuMi4z + LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl + dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAFcCAAAC77u/ + PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi + IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv + MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh + Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg + MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ + LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD + MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh + Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9Ik5leHQiPg0KICAgIDxwYXRoIGQ9Ik0xNiwyQzgu + MywyLDIsOC4zLDIsMTZzNi4zLDE0LDE0LDE0czE0LTYuMywxNC0xNFMyMy43LDIsMTYsMnogTTE2LDI0 + bC04LThoNlY4aDR2OGg2TDE2LDI0eiIgY2xhc3M9IkdyZWVuIiAvPg0KICA8L2c+DQo8L3N2Zz4L diff --git a/GUIs.Test.EDMIBenchmark/Form1.vb b/GUIs.Test.EDMIBenchmark/Form1.vb index c13698ba..85ae0f8e 100644 --- a/GUIs.Test.EDMIBenchmark/Form1.vb +++ b/GUIs.Test.EDMIBenchmark/Form1.vb @@ -213,4 +213,27 @@ Public Class Form1 Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick Process.Start(_LogConfig.LogDirectory) End Sub + + Private Async Sub BarButtonItem3_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem3.ItemClick + Try + Dim oSWTotal As New Stopwatch() + oSWTotal.Start() + + If TextboxDatatableName.EditValue = "" Then + MsgBox("Please enter a Datatable name!", MsgBoxStyle.Exclamation, "Uh oh!") + End If + + Dim oDatatableName As String = TextboxDatatableName.EditValue + Dim oResponse As DataTable = Await _Client.GetDatatableByNameAsync(oDatatableName) + + oSWTotal.Stop() + AddLogMessage($"DataTable [{oResponse.TableName}] loaded: [{FormatTime(oSWTotal.ElapsedMilliseconds)}]") + Catch ex As FaultException + MsgBox(ex.Reason.ToString, MsgBoxStyle.Critical, "Error from Service") + _Client.Reconnect() + Catch ex As Exception + MsgBox(ex.Message, MsgBoxStyle.Critical, "Uh oh!") + _Client.Reconnect() + End Try + End Sub End Class diff --git a/Modules.EDMIAPI/Client.vb b/Modules.EDMIAPI/Client.vb index 9cdd7a7d..22f8c194 100644 --- a/Modules.EDMIAPI/Client.vb +++ b/Modules.EDMIAPI/Client.vb @@ -131,10 +131,25 @@ Public Class Client End Try End Function + Public Async Function GetDatatableByNameAsync(DatatableName As String) As Task(Of DataTable) + Try + Dim oResponse = Await _channel.ReturnDatatableFromCacheAsync(DatatableName) + + If oResponse.OK Then + Return oResponse.Table + Else + Return Nothing + End If + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + ''' ''' Aborts the channel and creates a new connection ''' - Private Sub Reconnect() + Public Sub Reconnect() _logger.Warn("Connection faulted. Trying to reconnect..") Try diff --git a/Service.EDMIService/EDMIService.vb b/Service.EDMIService/EDMIService.vb index 12b2eb04..8bb20a2b 100644 --- a/Service.EDMIService/EDMIService.vb +++ b/Service.EDMIService/EDMIService.vb @@ -1,6 +1,7 @@ Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Filesystem +Imports DigitalData.Modules.language Imports DigitalData.Modules Imports System.IO Imports System.ServiceModel @@ -66,20 +67,41 @@ Public Class EDMIService #End Region #Region "Database" - Public Function ReturnDatatableFromCache(Name As String) As TableResult Implements IEDMIService.ReturnDatatableFromCache + Public Function ReturnDatatableFromCache(Name As String, FilterExpression As String, SortByColumn As String) As TableResult Implements IEDMIService.ReturnDatatableFromCache Try - Dim oSql = "" - _logger.Info($"ReturnDatatableFromCache, SQL: {oSql}") + _logger.Info($"ReturnDatatableFromCache, Datatable: {Name}") Dim oDataset As DataSet = Scheduler.DataSet Dim oDataTable As DataTable = Nothing + + _logger.Debug("DataSet contains [{0}] datatables", oDataset.Tables.Count) + If oDataset.Tables.Contains(Name) Then - oDataTable = oDataset.Tables.Item(Name) + oDataTable = oDataset.Tables.Item(Name).Copy() + + ' Apply filter and sorting to data + Dim oFilterExpression As String = Utils.NotNull(FilterExpression, String.Empty) + Dim oSortByColumn As String = Utils.NotNull(SortByColumn, String.Empty) + Dim oFilteredTable = oDataTable. + Select(oFilterExpression, oSortByColumn). + CopyToDataTable() + + _logger.Debug("Datatable Stats for [{0}]:", Name) + _logger.Debug("Unfiltered: [{0}] rows", oDataTable.Rows.Count) + _logger.Debug("Filtered: [{0}] rows", oFilteredTable.Rows.Count) + + Return New TableResult(oFilteredTable) Else Throw New ApplicationException($"DataTable {Name} does not exist") End If - Return New TableResult(oDataTable) + 'If oDataset.Tables.Contains(Name) Then + ' oDataTable = oDataset.Tables.Item(Name).Clone() + + ' Return New TableResult(oDataTable) + 'Else + ' Throw New ApplicationException($"DataTable {Name} does not exist") + 'End If Catch ex As Exception _logger.Error(ex) Return New TableResult(ex.Message) diff --git a/Service.EDMIService/EDMIService.vbproj b/Service.EDMIService/EDMIService.vbproj index 73159239..6e0de2e7 100644 --- a/Service.EDMIService/EDMIService.vbproj +++ b/Service.EDMIService/EDMIService.vbproj @@ -206,6 +206,10 @@ {991D0231-4623-496D-8BD0-9CA906029CBC} Filesystem + + {d3c8cfed-d6f6-43a8-9bdf-454145d0352f} + Language + {903B2D7D-3B80-4BE9-8713-7447B704E1B0} Logging diff --git a/Service.EDMIService/IEDMIService.vb b/Service.EDMIService/IEDMIService.vb index dd3d012e..fa04259e 100644 --- a/Service.EDMIService/IEDMIService.vb +++ b/Service.EDMIService/IEDMIService.vb @@ -13,7 +13,7 @@ Interface IEDMIService #Region "Database" - Function ReturnDatatableFromCache(Name As String) As TableResult + Function ReturnDatatableFromCache(Name As String, FilterExpression As String, SortByColumn As String) As TableResult #End Region #Region "Database (Firebird)" diff --git a/Service.EDMIService/Scheduler.vb b/Service.EDMIService/Scheduler.vb index 7a702eb9..102b15d7 100644 --- a/Service.EDMIService/Scheduler.vb +++ b/Service.EDMIService/Scheduler.vb @@ -33,9 +33,9 @@ Public Class Scheduler _MSSQL = MSSQL_ECM Dim oDataSet As New DataSet() - _JobListener = New JobListener(LogConfig, oDataSet) + _JobListener = New JobListener(LogConfig, _MSSQL, oDataSet) - Quartz.Logging.LogProvider.SetCurrentLogProvider(New LogProvider(_Logger)) + Logging.LogProvider.SetCurrentLogProvider(New LogProvider(_Logger)) End Sub Public Async Sub Start() @@ -66,18 +66,26 @@ Public Class Scheduler _Logger.Debug("Job details: {0}", oCronDetails.Rows.Count) _Logger.Debug("Job definition: {0}", oDefinition) - For Each oRowDetail In oCronDetails.Rows + For Each oRowDetail As DataRow In oCronDetails.Rows Dim oTrigger As ITrigger Dim oJob As IJobDetail + Dim oDataTableName As String = oRowDetail.Item("DT_NAME") + Dim oRunOnStartup As Boolean = oRowDetail.Item("RUN_ON_STARTUP") + Dim oJobIdentity As String = $"{oGuid}~{oDataTableName}" - oTrigger = TriggerBuilder.Create(). - WithIdentity(oTitle). - WithCronSchedule(oDefinition). - StartNow(). - Build() + Dim oBaseTrigger = TriggerBuilder.Create(). + WithIdentity(oJobIdentity, JOB_GROUP). + WithCronSchedule(oDefinition) + + ' Run directly at startup if configured + If oRunOnStartup Then + oBaseTrigger = oBaseTrigger.StartNow() + End If + + oTrigger = oBaseTrigger.Build() oJob = JobBuilder.Create(Of DatatableJob)(). - WithIdentity(oGuid, JOB_GROUP). + WithIdentity(oJobIdentity, JOB_GROUP). UsingJobData(New JobDataMap() From { {"LogConfig", _LogConfig}, {"MSSQL", _MSSQL}, diff --git a/Service.EDMIService/Scheduler/DatatableJob.vb b/Service.EDMIService/Scheduler/DatatableJob.vb index a87d6252..a2367906 100644 --- a/Service.EDMIService/Scheduler/DatatableJob.vb +++ b/Service.EDMIService/Scheduler/DatatableJob.vb @@ -8,23 +8,24 @@ Public Class DatatableJob Public Function Execute(context As IJobExecutionContext) As Task Implements IJob.Execute Dim oJobData = context.MergedJobDataMap Dim oLogConfig As LogConfig = oJobData.Item("LogConfig") - Dim oCronJobTitle As String = oJobData.Item("CronJobTitle") - Dim oDetailRow As DataRow = oJobData.Item("CronJobDetails") - Dim oMSSQL As MSSQLServer = oJobData.Item("MSSQL") + Dim oLogger As Logger = oLogConfig.GetLogger() - Dim oConnectionId As Integer = oDetailRow.Item("CON_ID") - Dim oTitle As String = oDetailRow.Item("TITLE") - Dim oDatatableName As String = oDetailRow.Item("DT_NAME") - Dim oSQL As String = oDetailRow.Item("COMMAND") + Try + Dim oCronJobTitle As String = oJobData.Item("CronJobTitle") + Dim oDetailRow As DataRow = oJobData.Item("CronJobDetails") + Dim oMSSQL As MSSQLServer = oJobData.Item("MSSQL") - Dim oLogger As Logger = oLogConfig.GetLogger() - oLogger.Debug("Running Command-Job [{0}]", oTitle) - oLogger.Debug("Datatable Name: {0}", oDatatableName) - oLogger.Debug("Connection Id: {0}", oConnectionId) + Dim oConnectionId As Integer = oDetailRow.Item("CON_ID") + Dim oTitle As String = oDetailRow.Item("TITLE") + Dim oDatatableName As String = oDetailRow.Item("DT_NAME") + Dim oSQL As String = oDetailRow.Item("COMMAND") - Dim oConnectionString = oMSSQL.Get_ConnectionStringforID(oConnectionId) + oLogger.Debug("Running Command-Job [{0}]", oTitle) + oLogger.Debug("Datatable Name: {0}", oDatatableName) + oLogger.Debug("Connection Id: {0}", oConnectionId) + + Dim oConnectionString = oMSSQL.Get_ConnectionStringforID(oConnectionId) - Try Dim oResult = oMSSQL.GetDatatableWithConnection(oSQL, oConnectionString) oResult.TableName = oDatatableName oLogger.Debug("Result Datatable contains [{0}] rows", oResult.Rows.Count) diff --git a/Service.EDMIService/Scheduler/JobListener.vb b/Service.EDMIService/Scheduler/JobListener.vb index adb32c33..6bc7d573 100644 --- a/Service.EDMIService/Scheduler/JobListener.vb +++ b/Service.EDMIService/Scheduler/JobListener.vb @@ -1,4 +1,5 @@ Imports System.Threading +Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports Quartz Imports Quartz.Listener @@ -10,12 +11,14 @@ Public Class JobListener Private ReadOnly _Logger As Logger Private ReadOnly _LogConfig As LogConfig + Private ReadOnly _MSSQL As MSSQLServer - Public Sub New(LogConfig As LogConfig, ResultDataSet As DataSet) + Public Sub New(LogConfig As LogConfig, MSSQL As MSSQLServer, ResultDataSet As DataSet) MyBase.New() _LogConfig = LogConfig _Logger = LogConfig.GetLogger() + _MSSQL = MSSQL Dataset = ResultDataSet End Sub @@ -24,10 +27,11 @@ Public Class JobListener Dim oDataTable As DataTable = context.Result Dim oDetailRow As DataRow = context.MergedJobDataMap.Item("CronJobDetails") Dim oDatatableName As String = oDetailRow.Item("DT_NAME") + Dim oDetailId As Integer = oDetailRow.Item("GUID") Dim oDatatableNameTemp As String = oDatatableName & "-TEMP" If Dataset.Tables.Contains(oDatatableName) Then - _Logger.Debug("DataTable exists, renaming and replacing") + _Logger.Debug("DataTable [{0}] exists, renaming and replacing", oDatatableName) ' Rename the new table, add TEMP suffix oDataTable.TableName = oDatatableNameTemp ' Add the new table to the dataset @@ -37,10 +41,13 @@ Public Class JobListener ' Rename the new table Dataset.Tables.Item(oDatatableNameTemp).TableName = oDatatableName Else - _Logger.Debug("DataTable does not exist, adding") + _Logger.Debug("DataTable [{0}] does not exist, adding", oDatatableName) Dataset.Tables.Add(oDataTable) End If + + _MSSQL.ExecuteNonQuery($"INSERT INTO TBAPPSERV_CRON_DETAIL_HISTORY (DETAIL_ID) VALUES ({oDetailId})") Catch ex As Exception + _Logger.Warn("Unexpected error in JobListener: {0}", ex.Message) _Logger.Error(ex) End Try