190 lines
6.3 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
Public Shared LogConfig As LogConfig
Public Shared Database As Firebird
Public Shared AppConfig As AppConfig
Private ReadOnly _logger As Logger
Private _request As Request = Nothing
Private _debug As Boolean = False
Private _username As String
Public Sub New()
Dim oOperationContext As OperationContext = OperationContext.Current
Dim oInstanceContext As InstanceContext = oOperationContext.InstanceContext
Dim oUsername = oOperationContext.ServiceSecurityContext.WindowsIdentity.Name
_username = oUsername
_logger = LogConfig.GetLogger()
End Sub
#Region "Heartbeat"
Public Function Heartbeat() As Boolean Implements IEDMService.Heartbeat
Return True
End Function
#End Region
#Region "Request"
Public Function CreateDatabaseRequest(Name As String, Optional Debug As Boolean = False) As String Implements IEDMService.CreateDatabaseRequest
_request = New Request(Name, _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