Imports System.ServiceModel Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Filesystem Imports System.IO Imports DigitalData.Services.EDMService 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