Monorepo/Modules.EDMIAPI/DatabaseWithFallback.vb
2021-11-25 15:54:48 +01:00

86 lines
3.0 KiB
VB.net

Imports DigitalData.Modules.Database
Imports DigitalData.Modules.EDMI.API
Imports DigitalData.Modules.EDMI.API.Constants
Imports DigitalData.Modules.EDMI.API.EDMIServiceReference
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Language.Utils
Public Class DatabaseWithFallback
Private ReadOnly _Logger As Logger
Private ReadOnly _Client As Client
Private ReadOnly _DatabaseEDM As MSSQLServer
Private ReadOnly _DatabaseIDB As MSSQLServer
Public Enum TableType
TBIDB_ATTRIBUTE
End Enum
Public Class Table
Public TableName As String
Public SQLCommand As String
Public DatabaseType As Constants.DatabaseType
End Class
Public Property Tables As New List(Of Table) From {
New Table With {.DatabaseType = DatabaseType.IDB, .TableName = "TBIDB_ATTRIBUTE", .SQLCommand = "SELECT * FROM TBIDB_ATTRIBUTE"}
}
Public Sub New(LogConfig As LogConfig, Client As Client, DatabaseECM As MSSQLServer, DatabaseIDB As MSSQLServer)
_Logger = LogConfig.GetLogger()
_Client = Client
_DatabaseEDM = DatabaseECM
_DatabaseIDB = DatabaseIDB
End Sub
Public Function GetDatatable(pDataTableName As String, pFallbackSQL As String, pFallbackType As Constants.DatabaseType, Optional pFilterExpression As String = "", Optional pSortByColumn As String = "", Optional pForceFallback As Boolean = False) As DataTable
Try
Dim oResult As DataTable = Nothing
If pForceFallback = False Then
Dim oTableResult As TableResult
Try
oTableResult = _Client.GetDatatableByName(pDataTableName, pFilterExpression, pSortByColumn)
Catch ex As Exception
_Logger.Error(ex)
oTableResult = Nothing
End Try
If oTableResult Is Nothing OrElse oTableResult.OK = False Then
_Logger.Warn("Datatable [{0}] could not be fetched from AppServer Cache. Falling back to direct Database Access.")
Return GetDatatableFromDatabase(pFallbackSQL, pFallbackType)
End If
Return oTableResult.Table
Else
Return GetDatatableFromDatabase(pFallbackSQL, pFallbackType)
End If
Catch ex As Exception
_Logger.Error(ex)
Return Nothing
End Try
End Function
Private Function GetDatatableFromDatabase(SQLCommand As String, DatabaseType As DatabaseType)
Try
Select Case DatabaseType
Case DatabaseType.ECM
Return _DatabaseEDM.GetDatatable(SQLCommand)
Case DatabaseType.IDB
Return _DatabaseIDB.GetDatatable(SQLCommand)
Case Else
Return Nothing
End Select
Catch ex As Exception
_Logger.Error(ex)
Return Nothing
End Try
End Function
End Class