Digital Data - Marlon Schreiber f22d7ce643 MS Integration Services und fileOps
2018-12-28 13:59:55 +01:00

195 lines
6.6 KiB
VB.net

Imports System.ServiceModel
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Filesystem
Imports System.IO
Imports DigitalData.Services.EDMService
<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerSession)>
Public Class EDMService
Implements IEDMService
Implements IDisposable
Public Shared Event ClientConnectedEvent As EventHandler(Of Session)
Public Shared Event ClientDisconnectedEvent As EventHandler(Of Session)
Public Shared LogConfig As LogConfig
Public Shared Database As Firebird
Public Shared AppConfig As AppConfig
Private ReadOnly _session As Session
Private ReadOnly _logger As Logger
Private _request As Request = Nothing
Private _debug As Boolean = False
Public Sub New()
Dim oOperationContext As OperationContext = OperationContext.Current
Dim oInstanceContext As InstanceContext = oOperationContext.InstanceContext
Dim oUsername = oOperationContext.ServiceSecurityContext.WindowsIdentity.Name
_logger = LogConfig.GetLogger()
_session = New Session(oUsername)
RaiseEvent ClientConnectedEvent(Me, _session)
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
RaiseEvent ClientDisconnectedEvent(Me, _session)
End Sub
#Region "Request"
Public Function CreateDatabaseRequest(Name As String, Optional Debug As Boolean = False) As String Implements IEDMService.CreateDatabaseRequest
_request = New Request(Name, _session.Username, Database, Debug)
_debug = Debug
_logger.Info("Creating request {0}/{1}", _request.Name, _request.RequestId)
Return _request.Name
End Function
Public Sub CloseDatabaseRequest() Implements IEDMService.CloseDatabaseRequest
If IsNothing(_request) Then
Exit Sub
End If
_logger.Info("Closing request {0}", _request.ToString)
_request.Connection.Close()
_request = Nothing
End Sub
#End Region
#Region "Database"
Private Sub TestRequestCreated()
If IsNothing(_request) Then
Throw New Exceptions.NoRequestException()
End If
End Sub
Public Function ReturnDatatable(SQL As String) As TableResult Implements IEDMService.ReturnDatatable
Try
TestRequestCreated()
_logger.Info($"ReturnDatatable, SQL: {SQL}")
_request.LogDebug($"ReturnDatatable, SQL: {SQL}")
Dim oResult As DataTable = Database.GetDatatableWithConnection(SQL, _request.Connection)
Return New TableResult(True, oResult, Nothing)
Catch ex As Exception
_logger.Error(ex)
_request.LogError(ex.Message)
Return New TableResult(False, Nothing, ex.Message)
End Try
End Function
Public Function ReturnScalar(SQL As String) As ScalarResult Implements IEDMService.ReturnScalar
Try
TestRequestCreated()
_logger.Info($"ReturnScalar, SQL: {SQL}")
_request.LogDebug($"ReturnScalar, SQL: {SQL}")
Dim oResult As Object = Database.GetScalarValueWithConnection(SQL, _request.Connection)
Return New ScalarResult(True, oResult, Nothing)
Catch ex As Exception
_logger.Error(ex)
_request.LogError(ex.Message)
Return New ScalarResult(False, Nothing, ex.Message)
End Try
End Function
Public Function ExecuteNonQuery(SQL As String) As NonQueryResult Implements IEDMService.ExecuteNonQuery
Try
TestRequestCreated()
_logger.Info($"ExecuteNonQuery, SQL: {SQL}")
_request.LogDebug($"ExecuteNonQuery, SQL: {SQL}")
Dim oResult As Boolean = Database.ExecuteNonQueryWithConnection(SQL, _request.Connection)
Return New NonQueryResult(True, Nothing)
Catch ex As Exception
_logger.Error(ex)
_request.LogError(ex.Message)
Return New NonQueryResult(False, ex.Message)
End Try
End Function
#End Region
#Region "FileContainer"
Private Function GetFilePath(ContainerId As String) As String
Return Path.Combine(AppConfig.ContainerPath, ContainerId & ".enc")
End Function
Private Sub TestFileExists(ContainerId)
Dim oContainerPath = GetFilePath(ContainerId)
If Not IO.File.Exists(oContainerPath) Then
Throw New FileNotFoundException("Container existiert nicht", oContainerPath)
End If
End Sub
Public Function GetFile(ContainerId As String) As ContainerResult Implements IEDMService.GetFile
Try
TestFileExists(ContainerId)
Dim oContainerPath = GetFilePath(ContainerId)
Dim oContainer As FileContainer = FileContainer.Load(LogConfig, AppConfig.ContainerPassword, oContainerPath)
Dim oResult As New ContainerResult With {
.Container = oContainer.GetFile()
}
Return oResult
Catch ex As Exception
_logger.Error(ex)
Return New ContainerResult(ex.Message)
End Try
End Function
Public Function CreateFile(Contents() As Byte, Extension As String) As String Implements IEDMService.CreateFile
Try
Dim oContainer As FileContainer = FileContainer.Create(LogConfig, AppConfig.ContainerPassword)
Dim oContainerId As String = oContainer.FileId
oContainer.SetFile(Contents, Extension)
oContainer.SaveAs(GetFilePath(oContainerId))
Return oContainerId
Catch ex As Exception
_logger.Error(ex)
Return Nothing
End Try
End Function
Public Function UpdateFile(FileId As String, Contents() As Byte) As String Implements IEDMService.UpdateFile
Try
TestFileExists(FileId)
Dim oFilePath = GetFilePath(FileId)
Dim oFileContainer As FileContainer = FileContainer.Load(LogConfig, AppConfig.ContainerPassword, oFilePath)
oFileContainer.SetFile(Contents, oFileContainer.Extension)
oFileContainer.Save()
Return oFileContainer.FileId
Catch ex As Exception
_logger.Error(ex)
Return Nothing
End Try
End Function
Public Function DeleteFile(FileId As String) As Boolean Implements IEDMService.DeleteFile
Try
TestFileExists(FileId)
Dim oFilePath = GetFilePath(FileId)
IO.File.Delete(oFilePath)
Return True
Catch ex As Exception
_logger.Error(ex)
Return False
End Try
End Function
#End Region
End Class