Imports DigitalData.Modules.Logging Imports Oracle.ManagedDataAccess.Client Public Class Dispatcher Public ReadOnly Property Connections As New List(Of DispatcherConnection) Public ReadOnly Logger As Logger Public ReadOnly LogConfig As LogConfig ''' ''' Create a new instance of Dispatcher. This is the preferred way to create the dispatcher. ''' ''' An instance of LogConfig ''' Initial connectionstring for connecting to DD_ECM database. ''' An instance of Dispatcher with connections Public Shared Function Create(pLogConfig As LogConfig, pConnectionString As String) As Dispatcher Dim oDecryptedConnectionString As String = MSSQLServer.DecryptConnectionString(pConnectionString) Dim oDatabase As MSSQLServer = New MSSQLServer(pLogConfig, oDecryptedConnectionString) Dim oTable As DataTable = oDatabase.GetDatatable(Queries.DD_ECM.Connections.AllConnections) Dim oConnections As New List(Of DispatcherConnection) For Each oRow As DataRow In oTable.Rows Dim oConnection As DispatcherConnection = CreateFromDataRow(oRow) If oConnection IsNot Nothing Then oConnections.Add(oConnection) End If Next Return New Dispatcher(pLogConfig, oConnections) End Function ''' ''' Create a new instance of Dispatcher. Needs a manually constructed list of connection objects. ''' ''' An instance of LogConfig ''' A list of DispatcherConnection objects ''' Public Sub New(pLogConfig As LogConfig, pConnections As List(Of DispatcherConnection)) LogConfig = pLogConfig Logger = pLogConfig.GetLogger() Connections = pConnections End Sub Public Enum ConnectionType MSSQL Oracle ODBC Firebird End Enum Public Class DispatcherOptions Public Property QueryTimeout As Integer = Constants.DEFAULT_TIMEOUT End Class Public Class DispatcherConnection Public Property Id As Integer Public Property Name As String Public Property ConnectionString As String Public Property ConnectionType As ConnectionType End Class ''' ''' Returns a Datatable from the database with the specified connection id ''' ''' The SQL query ''' The connection id ''' A datatable with the results or nothing if an error occurred Public Function GetDatatable(pSQLCommand As String, pConnectionId As Integer) As DataTable Dim oAdapter As IDatabase = GetAdapterClass(pConnectionId) Return oAdapter.GetDatatable(pSQLCommand) End Function ''' ''' Returns a Datatable from the database ''' ''' The SQL query ''' A datatable with the results or nothing if an error occurred Public Function GetDatatable(pSQLCommand As String) As DataTable Return GetDatatable(pSQLCommand, Constants.DEFAULT_CONNECTION_ID) End Function ''' ''' Executes a query without return value like INSERT or UPDATE from the database with the specified connection id and ''' returns a boolean value indicating success or failure of the query ''' ''' The SQL query ''' The connection id ''' True if the query was successful, otherwise false Public Function ExecuteNonQuery(pSQLCommand As String, pConnectionId As Integer) As Boolean Dim oAdapter As IDatabase = GetAdapterClass(pConnectionId) Return oAdapter.ExecuteNonQuery(pSQLCommand) End Function ''' ''' Executes a query without return value like INSERT or UPDATE from the database and ''' returns a boolean value indicating success or failure of the query ''' ''' The SQL query ''' True if the query was successful, otherwise false Public Function ExecuteNonQuery(pSQLCommand As String) As Boolean Return ExecuteNonQuery(pSQLCommand, Constants.DEFAULT_CONNECTION_ID) End Function ''' ''' Returns a single value from the database specified by the connection id ''' ''' The SQL query ''' The connection id ''' A value of type object Public Function GetScalarValue(pSQLCommand As String, pConnectionId As Integer) As Object Dim oAdapter As IDatabase = GetAdapterClass(pConnectionId) Return oAdapter.GetScalarValue(pSQLCommand) End Function ''' ''' Returns a single value from the database ''' ''' The SQL query ''' A value of type object Public Function GetScalarValue(pSQLCommand As String) As Object Return GetScalarValue(pSQLCommand, Constants.DEFAULT_CONNECTION_ID) End Function Private Function GetConnection(pConnectionId As Integer) As DispatcherConnection Dim oConnection As DispatcherConnection = Connections. Where(Function(conn) conn.Id = pConnectionId). FirstOrDefault() If oConnection IsNot Nothing Then Logger.Debug("Resolved ConnectionId [{0}] into Connection [{1}]", pConnectionId, oConnection.Name) End If Return oConnection End Function Private Function GetAdapterClass(pConnectionId As Integer) As IDatabase Dim oConnection = GetConnection(pConnectionId) Dim oArgs As New List(Of Object) From {LogConfig, oConnection.ConnectionString, Constants.DEFAULT_TIMEOUT} Logger.Debug("Creating database adapter object for type [{0}]", ConnectionType.MSSQL) ' TODO: Cache Database instances to avoid constructing them for every call Select Case oConnection.ConnectionType Case ConnectionType.MSSQL Dim oConnectionString = MSSQLServer.DecryptConnectionString(oConnection.ConnectionString) Return New MSSQLServer(LogConfig, oConnectionString, Constants.DEFAULT_TIMEOUT) Case ConnectionType.Oracle Return New Oracle(LogConfig, oConnection.ConnectionString, Constants.DEFAULT_TIMEOUT) Case ConnectionType.Firebird Dim oBuilder As New FirebirdSql.Data.FirebirdClient.FbConnectionStringBuilder(oConnection.ConnectionString) Return New Firebird(LogConfig, oBuilder.DataSource, oBuilder.Database, oBuilder.UserID, oBuilder.Password) Case ConnectionType.ODBC 'Dim oBuilder As New Data.Odbc.OdbcConnectionStringBuilder(pConnection.ConnectionString) 'Return New ODBC(LogConfig) Return Nothing Case Else Return Nothing End Select End Function Private Shared Function CreateFromDataRow(pConnectionDataRow As DataRow) As DispatcherConnection Try Dim oGuid = pConnectionDataRow.Item("GUID") Dim oName = pConnectionDataRow.Item("BEZEICHNUNG") Dim oUser = pConnectionDataRow.Item("USERNAME") Dim oPassword = pConnectionDataRow.Item("PASSWORD") Dim oServer = pConnectionDataRow.Item("SERVER") Dim oDatabase = pConnectionDataRow.Item("DATENBANK") Dim oConnectionType As ConnectionType Dim oConnectionString As String Select Case pConnectionDataRow.Item("SQL_PROVIDER") Case "Oracle" ' TODO: Test Oracle Connection oConnectionType = ConnectionType.Oracle oConnectionString = New OracleConnectionStringBuilder() With { .UserID = oUser, .Password = oPassword, .DataSource = oServer }.ToString() Case "ODBC" ' TODO: Test ODBC Connection oConnectionType = ConnectionType.ODBC oConnectionString = New Data.Odbc.OdbcConnectionStringBuilder() With { .ConnectionString = oServer }.ToString() Case "Firebird" oConnectionType = ConnectionType.Firebird oConnectionString = New FirebirdSql.Data.FirebirdClient.FbConnectionStringBuilder() With { .UserID = oUser, .Password = oPassword, .DataSource = oServer, .Database = oDatabase }.ToString() Case Else ' MSSQL oConnectionType = ConnectionType.MSSQL oConnectionString = New SqlClient.SqlConnectionStringBuilder() With { .UserID = oUser, .Password = oPassword, .DataSource = oServer, .InitialCatalog = oDatabase }.ToString() End Select Return New DispatcherConnection With { .Id = oGuid, .Name = oName, .ConnectionType = oConnectionType, .ConnectionString = oConnectionString } Catch ex As Exception Return Nothing End Try End Function End Class