Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports DigitalData.Modules.ZooFlow Imports DigitalData.Modules.Patterns Imports DigitalData.Modules.EDMI.API Imports DigitalData.Modules.EDMI.API.EDMIServiceReference Imports DigitalData.Modules.Base Imports DigitalData.GUIs.Common Imports DigitalData.Modules.ZooFlow.Params Public Class ProfileSearches Inherits BaseClass Private ReadOnly _Environment As Environment Private ReadOnly _Client As Client Private ReadOnly _ClipboardContents As String Private ReadOnly _ClientIsOnline As Boolean = False Public Class Search Public Guid As Integer Public DataTable As DataTable Public TabIndex As Integer Public TabCaption As String Public ProfileId As Integer Public SQLCommand As String End Class Public Sub New(pLogConfig As LogConfig, pEnvironment As Environment, pClipboardContents As String) MyBase.New(pLogConfig) _Environment = pEnvironment _ClipboardContents = pClipboardContents _ClientIsOnline = _Environment.Service.Client IsNot Nothing AndAlso _Environment.Service.Client.IsOnline = True Try If _ClientIsOnline Then Try Dim oSplit() As String = _Environment.Service.Address.Split(":") Dim oAppServerAddress As String = oSplit(0) Dim oAppServerPort As Integer = 9000 If oSplit.Length = 2 Then oAppServerPort = oSplit(1) End If _Client = New Client(pLogConfig, oAppServerAddress, oAppServerPort) If Not IsNothing(_Client) Then If _Client.Connect() Then Logger.Debug("ProfileSearches: Appserver connected successfully!") End If End If Catch ex As Exception Logger.Warn($"Could not initialize the AppServer: {ex.Message}") Logger.Error(ex) End Try Else Logger.Debug("No client found in Env.") End If Catch ex As Exception Logger.Error(ex) End Try End Sub Public Async Function GetDocResultForm(pProfile As ProfileData, pFormTitle As String, pOperationMode As Modules.ZooFlow.Constants.OperationMode) As Task(Of frmDocumentResultList) ' For now we assume these are document results instead of data results Dim oSearches = Await LoadDocumentSearchesAsync(pProfile.Guid) Dim oNameSlug = StringEx.ConvertTextToSlug(pProfile.Name) Dim oSearchGuids = oSearches.Select(Function(s) s.Guid).ToArray Dim oWindowGuid = $"{pProfile.Guid}-{oNameSlug}-{String.Join("-", oSearchGuids)}" Dim oParams = New DocumentResultList.Params() With { .WindowGuid = oWindowGuid, .WindowTitle = pFormTitle, .OperationModeOverride = pOperationMode, .ProfileGuid = pProfile.Guid } For Each oSearch In oSearches oParams.Results.Add(New DocumentResultList.DocumentResult() With { .Title = oSearch.TabCaption, .Datatable = oSearch.DataTable }) Next Dim oForm As New frmDocumentResultList(LogConfig, _Environment, oParams) Return oForm End Function Public Async Function LoadDocumentSearchesAsync(ProfileId As Integer) As Task(Of List(Of Search)) Return Await Task.Run(Function() DoLoadDocumentSearches(ProfileId)) End Function Private Function DoLoadDocumentSearches(ProfileId As Integer) As List(Of Search) Dim oSQL As String = $"SELECT * FROM TBCW_PROF_DOC_SEARCH WHERE ACTIVE = 1 AND PROFILE_ID = {ProfileId} ORDER BY TAB_INDEX" Dim oSearchesDataTable As DataTable If _ClientIsOnline Then Dim oTableResult As TableResult = _Client.GetDatatableByName("TBCW_PROF_DOC_SEARCH", $"PROFILE_ID = {ProfileId} AND ACTIVE = 1", "TAB_INDEX") oSearchesDataTable = oTableResult.Table If oSearchesDataTable Is Nothing Then Logger.Warn("TBCW_PROF_DOC_SEARCH from AppServer is nothing: Failover started...") oSearchesDataTable = _Environment.Database.GetDatatable(oSQL) End If Else oSearchesDataTable = _Environment.Database.GetDatatable(oSQL) End If Dim oDocSearches As New List(Of Search) If Not IsNothing(oSearchesDataTable) Then Dim oCounter As Integer = 0 Dim oPatterns As New ClassPatterns(LogConfig) For Each oRow As DataRow In oSearchesDataTable.Rows Dim oProfileId As Integer = oRow.Item("PROFILE_ID") Dim oTabTitle As String = oRow.Item("TAB_TITLE") Dim oConnectionId As Integer = oRow.Item("CONN_ID") Dim oGuid As Integer = oRow.Item("GUID") oSQL = oRow.Item("SQL_COMMAND") oSQL = oPatterns.ReplaceUserValues(oSQL, _Environment.User) oSQL = oPatterns.ReplaceInternalValues(oSQL) oSQL = oPatterns.ReplaceClipboardContents(oSQL, _ClipboardContents) Dim oConnectionString = ProfileUtils.GetConnectionString(_Environment.Database, oConnectionId) Dim oDatatable As DataTable = _Environment.Database.GetDatatableWithConnection(oSQL, oConnectionString) If oDatatable Is Nothing Then Logger.Warn("Error in SQL-Query '{0}'", oSQL) Continue For End If oDocSearches.Add(New Search() With { .Guid = oGuid, .DataTable = oDatatable, .ProfileId = oProfileId, .TabCaption = oTabTitle, .TabIndex = oCounter, .SQLCommand = oSQL }) oCounter += 1 Next Else End If Return oDocSearches End Function Public Async Function LoadDataSearchesAsync(ProfileId As Integer) As Task(Of List(Of Search)) Return Await Task.Run(Function() DoLoadDataSearches(ProfileId)) End Function Private Function DoLoadDataSearches(ProfileId As Integer) As List(Of Search) Dim oDataSearches As New List(Of Search) Try Dim oSQL As String = $"SELECT * FROM TBCW_PROF_DATA_SEARCH WHERE ACTIVE = 1 AND PROFILE_ID = {ProfileId} ORDER BY TAB_INDEX" Dim oSearchesDataTable As DataTable If _ClientIsOnline Then Dim oTableResult As TableResult = _Client.GetDatatableByName("TBCW_PROF_DATA_SEARCH", $"PROFILE_ID = {ProfileId} AND ACTIVE = 1", "TAB_INDEX") oSearchesDataTable = oTableResult.Table If oSearchesDataTable Is Nothing Then Logger.Warn("TBCW_PROF_DATA_SEARCH from AppServer is nothing: Failover started...") oSearchesDataTable = _Environment.Database.GetDatatable(oSQL) End If Else oSearchesDataTable = _Environment.Database.GetDatatable(oSQL) End If Dim oCounter As Integer = 0 Dim oPatterns As New ClassPatterns(LogConfig) For Each oRow As DataRow In oSearchesDataTable.Rows Try Dim oProfileId As Integer = oRow.Item("PROFILE_ID") Dim oTabTitle As String = oRow.Item("TAB_TITLE") Dim oConnectionId As Integer = oRow.Item("CONN_ID") oSQL = oRow.Item("SQL_COMMAND") oSQL = oPatterns.ReplaceUserValues(oSQL, _Environment.User) oSQL = oPatterns.ReplaceInternalValues(oSQL) oSQL = oPatterns.ReplaceClipboardContents(oSQL, _ClipboardContents) Dim oConnectionString = ProfileUtils.GetConnectionString(_Environment.Database, oConnectionId) Dim oDatatable As DataTable = _Environment.Database.GetDatatableWithConnection(oSQL, oConnectionString) If oDatatable Is Nothing Then Logger.Warn("Error in SQL-Query '{0}'", oSQL) Continue For End If oDataSearches.Add(New Search() With { .DataTable = oDatatable, .ProfileId = oProfileId, .TabCaption = oTabTitle, .TabIndex = oCounter, .SQLCommand = oSQL }) oCounter += 1 Catch ex As Exception Logger.Error(ex) End Try Next Return oDataSearches. Where(Function(s) Not IsNothing(s.DataTable)). ToList() Catch ex As Exception Logger.Error(ex) Return oDataSearches End Try End Function End Class