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 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 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") + + 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) + 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