diff --git a/Modules.EDMIAPI/Client.vb b/Modules.EDMIAPI/Client.vb index b3e9ec29..43cc3ee6 100644 --- a/Modules.EDMIAPI/Client.vb +++ b/Modules.EDMIAPI/Client.vb @@ -21,6 +21,7 @@ Public Class Client ' Runtime Variables Private ReadOnly ServerAddress As String Private ReadOnly ServerPort As Integer + Private ClientConfig As ConfigClientConfiguration ' Channel Private ReadOnly ChannelFactory As ChannelFactory(Of IEDMIServiceChannel) @@ -32,6 +33,7 @@ Public Class Client ' Public Variables Public CachedTables As New List(Of String) + ''' ''' Parse a IPAddress:Port String into its parts ''' @@ -121,6 +123,12 @@ Public Class Client Logger.Debug("Opening channel..") Channel.Open() + Dim oResponse = Channel.GetClientConfig() + If oResponse.OK Then + ClientConfig = oResponse.ClientConfig + Else + Logger.Warn("Client Configuration could not be loaded: [{0}]", oResponse.ErrorMessage) + End If Logger.Info($"Connection to AppService {ServerAddress} successfully established!") @@ -146,6 +154,14 @@ Public Class Client End Try End Sub + Public Function TryGetClientConfig() As ConfigClientConfiguration + If ClientConfig Is Nothing Then + Throw New ApplicationException("ClientConfig is empty! Please connect to the service before calling this function") + End If + + Return ClientConfig + End Function + Private Async Function UpdateTimer_Elapsed(sender As Object, e As ElapsedEventArgs) As Task Handles UpdateTimer.Elapsed Try Dim oTables As String() = Await Channel.GetCachedTablesAsync() @@ -674,6 +690,62 @@ Public Class Client End Try End Function + Public Function ExecuteNonQueryFromIDB(pSQL As String, Optional pConnectionId As Integer = 0) As ExecuteNonQueryResponse + Try + Dim oResponse = Channel.ExecuteNonQuery(New ExecuteNonQueryRequest() With { + .SqlCommand = pSQL, + .NamedDatabase = DatabaseName.IDB, + .ConnectionId = pConnectionId + }) + Return oResponse + Catch ex As Exception + Logger.Error(ex) + Throw ex + End Try + End Function + + Public Function ExecuteNonQueryFromECM(pSQL As String, Optional pConnectionId As Integer = 0) As ExecuteNonQueryResponse + Try + Dim oResponse = Channel.ExecuteNonQuery(New ExecuteNonQueryRequest() With { + .SqlCommand = pSQL, + .NamedDatabase = DatabaseName.ECM, + .ConnectionId = pConnectionId + }) + Return oResponse + Catch ex As Exception + Logger.Error(ex) + Throw ex + End Try + End Function + + Public Async Function ExecuteNonQueryFromIDBAsync(pSQL As String, Optional pConnectionId As Integer = 0) As Task(Of ExecuteNonQueryResponse) + Try + Dim oResponse = Await Channel.ExecuteNonQueryAsync(New ExecuteNonQueryRequest() With { + .SqlCommand = pSQL, + .NamedDatabase = DatabaseName.IDB, + .ConnectionId = pConnectionId + }) + Return oResponse + Catch ex As Exception + Logger.Error(ex) + Throw ex + End Try + End Function + + Public Async Function ExecuteNonQueryFromECMAsync(pSQL As String, Optional pConnectionId As Integer = 0) As Task(Of ExecuteNonQueryResponse) + Try + Dim oResponse = Await Channel.ExecuteNonQueryAsync(New ExecuteNonQueryRequest() With { + .SqlCommand = pSQL, + .NamedDatabase = DatabaseName.ECM, + .ConnectionId = pConnectionId + }) + Return oResponse + Catch ex As Exception + Logger.Error(ex) + Throw ex + End Try + End Function + Public Function GetDatatableByName(DatatableName As String, Optional FilterExpression As String = "", Optional SortByColumn As String = "") As TableResult Try Dim oResponse = Channel.ReturnDatatableFromCache(DatatableName, FilterExpression, SortByColumn) @@ -694,6 +766,8 @@ Public Class Client End Try End Function + + ''' ''' Return infos about a file object ''' diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.ExecuteNonQueryResponse.datasource b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.ExecuteNonQueryResponse.datasource new file mode 100644 index 00000000..8bb4d79f --- /dev/null +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.ExecuteNonQueryResponse.datasource @@ -0,0 +1,10 @@ + + + + DigitalData.Modules.EDMI.API.EDMIServiceReference.ExecuteNonQueryResponse, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.GetClientConfigResponse.datasource b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.GetClientConfigResponse.datasource new file mode 100644 index 00000000..8d9e62a6 --- /dev/null +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMI.API.EDMIServiceReference.GetClientConfigResponse.datasource @@ -0,0 +1,10 @@ + + + + DigitalData.Modules.EDMI.API.EDMIServiceReference.GetClientConfigResponse, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Messages.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Messages.xsd index 0acf5ce9..3a7241eb 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Messages.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Messages.xsd @@ -1,5 +1,13 @@  + + + + + + + + @@ -23,14 +31,6 @@ - - - - - - - - diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.Base.GetClientConfig.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.Base.GetClientConfig.xsd new file mode 100644 index 00000000..9f121f27 --- /dev/null +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.Base.GetClientConfig.xsd @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.Database.ExecuteNonQuery.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.Database.ExecuteNonQuery.xsd new file mode 100644 index 00000000..145bef4f --- /dev/null +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.Database.ExecuteNonQuery.xsd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.GlobalIndexer.ImportFile.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.GlobalIndexer.ImportFile.xsd index dfacd76d..e8a6215e 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.GlobalIndexer.ImportFile.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.GlobalIndexer.ImportFile.xsd @@ -1,13 +1,13 @@  - + - + - + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.GetFileObject.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.GetFileObject.xsd similarity index 86% rename from Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.GetFileObject.xsd rename to Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.GetFileObject.xsd index 5e423071..8d71cf3d 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.GetFileObject.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.GetFileObject.xsd @@ -1,5 +1,5 @@  - + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.NewFile.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.NewFile.xsd similarity index 78% rename from Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.NewFile.xsd rename to Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.NewFile.xsd index 9bbf4d86..b12f9392 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.NewFile.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.NewFile.xsd @@ -1,12 +1,12 @@  - - + + - + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.SetAttributeValue.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.SetAttributeValue.xsd similarity index 83% rename from Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.SetAttributeValue.xsd rename to Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.SetAttributeValue.xsd index fb7799c9..e8b79472 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.SetAttributeValue.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.SetAttributeValue.xsd @@ -1,5 +1,5 @@  - + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.xsd similarity index 89% rename from Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.xsd rename to Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.xsd index 6dfd5893..70b45152 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.Methods.IDB.xsd @@ -1,5 +1,5 @@  - + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl index d6ba8df7..a5ca1cd7 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.wsdl @@ -4,21 +4,24 @@ - - + + + + - - + + + - + - + @@ -29,6 +32,12 @@ + + + + + + @@ -59,6 +68,12 @@ + + + + + + @@ -209,6 +224,10 @@ + + + + @@ -227,6 +246,10 @@ + + + + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd index ca415ab6..1439c329 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService.xsd @@ -1,13 +1,15 @@  + - - + + + - + @@ -22,6 +24,18 @@ + + + + + + + + + + + + @@ -30,7 +44,7 @@ - + @@ -46,35 +60,49 @@ - + - + - + - + - + + + + + + + + + + + + + + + @@ -88,7 +116,7 @@ - + @@ -102,7 +130,7 @@ - + @@ -116,7 +144,7 @@ - + @@ -130,7 +158,7 @@ - + @@ -144,7 +172,7 @@ - + @@ -158,7 +186,7 @@ - + @@ -172,7 +200,7 @@ - + @@ -186,7 +214,7 @@ - + @@ -200,63 +228,63 @@ - + - + - + - + - + - + - + - + - + @@ -270,7 +298,7 @@ - + @@ -286,7 +314,7 @@ - + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService1.xsd b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService1.xsd new file mode 100644 index 00000000..95430386 --- /dev/null +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/DigitalData.Services.EDMIService1.xsd @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap index 656e958c..515a521a 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap @@ -26,21 +26,24 @@ - + + + - - + + + - + - + diff --git a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb index 66e70bf4..b1702f42 100644 --- a/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb +++ b/Modules.EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb @@ -21,15 +21,17 @@ Namespace EDMIServiceReference System.Runtime.Serialization.DataContractAttribute(Name:="BaseResponse", [Namespace]:="http://schemas.datacontract.org/2004/07/DigitalData.Services.EDMIService.Messages"& _ ""), _ System.SerializableAttribute(), _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.TableResult)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.ScalarResult)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.NonQueryResult)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.GetDatatableResponse)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.GetScalarValueResponse)), _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.ExecuteNonQueryResponse)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.NewFileResponse)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.SetAttributeValueResponse)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.ImportFileResponse)), _ System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.GetFileObjectResponse)), _ - System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.TableResult))> _ + System.Runtime.Serialization.KnownTypeAttribute(GetType(EDMIServiceReference.GetClientConfigResponse))> _ Partial Public Class BaseResponse Inherits Object Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged @@ -105,17 +107,44 @@ Namespace EDMIServiceReference End Sub End Class + _ + Partial Public Class TableResult + Inherits EDMIServiceReference.BaseResponse + + _ + Private TableField As System.Data.DataTable + + _ + Public Property Table() As System.Data.DataTable + Get + Return Me.TableField + End Get + Set + If (Object.ReferenceEquals(Me.TableField, value) <> true) Then + Me.TableField = value + Me.RaisePropertyChanged("Table") + End If + End Set + End Property + End Class + _ + Partial Public Class ExecuteNonQueryResponse + Inherits EDMIServiceReference.BaseResponse + + _ + Private ResultField As Boolean + + _ + Public Property Result() As Boolean + Get + Return Me.ResultField + End Get + Set + If (Me.ResultField.Equals(value) <> true) Then + Me.ResultField = value + Me.RaisePropertyChanged("Result") + End If + End Set + End Property + End Class + _ Partial Public Class NewFileResponse Inherits EDMIServiceReference.BaseResponse @@ -281,7 +341,7 @@ Namespace EDMIServiceReference _ Partial Public Class SetAttributeValueResponse Inherits EDMIServiceReference.BaseResponse @@ -331,7 +391,7 @@ Namespace EDMIServiceReference _ Partial Public Class GetFileObjectResponse Inherits EDMIServiceReference.BaseResponse @@ -355,29 +415,76 @@ Namespace EDMIServiceReference _ - Partial Public Class TableResult + Partial Public Class GetClientConfigResponse Inherits EDMIServiceReference.BaseResponse _ - Private TableField As System.Data.DataTable + Private ClientConfigField As EDMIServiceReference.ConfigClientConfiguration _ - Public Property Table() As System.Data.DataTable + Public Property ClientConfig() As EDMIServiceReference.ConfigClientConfiguration Get - Return Me.TableField + Return Me.ClientConfigField End Get Set - If (Object.ReferenceEquals(Me.TableField, value) <> true) Then - Me.TableField = value - Me.RaisePropertyChanged("Table") + If (Object.ReferenceEquals(Me.ClientConfigField, value) <> true) Then + Me.ClientConfigField = value + Me.RaisePropertyChanged("ClientConfig") End If End Set End Property End Class + _ + Partial Public Class ConfigClientConfiguration + Inherits Object + Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged + + _ + Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject + + _ + Private ForceDirectDatabaseAccessField As Boolean + + _ + Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData + Get + Return Me.extensionDataField + End Get + Set + Me.extensionDataField = value + End Set + End Property + + _ + Public Property ForceDirectDatabaseAccess() As Boolean + Get + Return Me.ForceDirectDatabaseAccessField + End Get + Set + If (Me.ForceDirectDatabaseAccessField.Equals(value) <> true) Then + Me.ForceDirectDatabaseAccessField = value + Me.RaisePropertyChanged("ForceDirectDatabaseAccess") + End If + End Set + End Property + + Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged + + Protected Sub RaisePropertyChanged(ByVal propertyName As String) + Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent + If (Not (propertyChanged) Is Nothing) Then + propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName)) + End If + End Sub + End Class + _ + Partial Public Class ExecuteNonQueryRequest + Inherits Object + Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged + + _ + Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject + + _ + Private ConnectionIdField As Integer + + _ + Private DatabaseTypeField As EDMIServiceReference.DatabaseType + + _ + Private NamedDatabaseField As EDMIServiceReference.DatabaseName + + _ + Private SqlCommandField As String + + _ + Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData + Get + Return Me.extensionDataField + End Get + Set + Me.extensionDataField = value + End Set + End Property + + _ + Public Property ConnectionId() As Integer + Get + Return Me.ConnectionIdField + End Get + Set + If (Me.ConnectionIdField.Equals(value) <> true) Then + Me.ConnectionIdField = value + Me.RaisePropertyChanged("ConnectionId") + End If + End Set + End Property + + _ + Public Property DatabaseType() As EDMIServiceReference.DatabaseType + Get + Return Me.DatabaseTypeField + End Get + Set + If (Me.DatabaseTypeField.Equals(value) <> true) Then + Me.DatabaseTypeField = value + Me.RaisePropertyChanged("DatabaseType") + End If + End Set + End Property + + _ + Public Property NamedDatabase() As EDMIServiceReference.DatabaseName + Get + Return Me.NamedDatabaseField + End Get + Set + If (Me.NamedDatabaseField.Equals(value) <> true) Then + Me.NamedDatabaseField = value + Me.RaisePropertyChanged("NamedDatabase") + End If + End Set + End Property + + _ + Public Property SqlCommand() As String + Get + Return Me.SqlCommandField + End Get + Set + If (Object.ReferenceEquals(Me.SqlCommandField, value) <> true) Then + Me.SqlCommandField = value + Me.RaisePropertyChanged("SqlCommand") + End If + End Set + End Property + + Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged + + Protected Sub RaisePropertyChanged(ByVal propertyName As String) + Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent + If (Not (propertyChanged) Is Nothing) Then + propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName)) + End If + End Sub + End Class + _ Partial Public Class NewFileRequest Inherits Object @@ -824,7 +1027,8 @@ Namespace EDMIServiceReference _ Partial Public Class FileProperties Inherits Object @@ -967,7 +1171,8 @@ Namespace EDMIServiceReference _ Partial Public Class UserAttributeValue Inherits Object @@ -1286,7 +1491,7 @@ Namespace EDMIServiceReference _ Partial Public Class SetAttributeValueRequest Inherits Object @@ -1542,7 +1747,7 @@ Namespace EDMIServiceReference _ Partial Public Class GetFileObjectRequest Inherits Object @@ -1606,7 +1811,7 @@ Namespace EDMIServiceReference _ Partial Public Class FileObject Inherits Object @@ -1749,6 +1954,12 @@ Namespace EDMIServiceReference _ Function HeartbeatAsync() As System.Threading.Tasks.Task(Of Boolean) + _ + Function GetClientConfig() As EDMIServiceReference.GetClientConfigResponse + + _ + Function GetClientConfigAsync() As System.Threading.Tasks.Task(Of EDMIServiceReference.GetClientConfigResponse) + _ Function GetCachedTables() As String() @@ -1781,6 +1992,12 @@ Namespace EDMIServiceReference _ Function ReturnScalarValueAsync(ByVal pData As EDMIServiceReference.GetScalarValueRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.GetScalarValueResponse) + _ + Function ExecuteNonQuery(ByVal pData As EDMIServiceReference.ExecuteNonQueryRequest) As EDMIServiceReference.ExecuteNonQueryResponse + + _ + Function ExecuteNonQueryAsync(ByVal pData As EDMIServiceReference.ExecuteNonQueryRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.ExecuteNonQueryResponse) + + + + + + + + + + @@ -92,6 +101,15 @@ + + + + + + + + + diff --git a/Modules.EDMIAPI/DatabaseWithFallback.vb b/Modules.EDMIAPI/DatabaseWithFallback.vb index 39739117..ed83b916 100644 --- a/Modules.EDMIAPI/DatabaseWithFallback.vb +++ b/Modules.EDMIAPI/DatabaseWithFallback.vb @@ -8,7 +8,8 @@ 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 _ClientConfig As ConfigClientConfiguration + Private ReadOnly _DatabaseECM As MSSQLServer Private ReadOnly _DatabaseIDB As MSSQLServer ''' @@ -49,8 +50,11 @@ Public Class DatabaseWithFallback Public Sub New(LogConfig As LogConfig, Client As Client, DatabaseECM As MSSQLServer, DatabaseIDB As MSSQLServer) _Logger = LogConfig.GetLogger() _Client = Client - _DatabaseEDM = DatabaseECM + _DatabaseECM = DatabaseECM _DatabaseIDB = DatabaseIDB + + ' Load client config, will throw if client is not yet connected to service + _ClientConfig = Client.TryGetClientConfig() End Sub Public Function GetDatatableECM(pSQL As String, Optional pConnectionId As Integer = 0) As DataTable @@ -73,6 +77,14 @@ Public Class DatabaseWithFallback Return GetScalarValue(pSQL, Constants.DatabaseType.IDB, pForceFallback:=False, pConnectionId) End Function + Public Function ExecuteNonQueryECM(pSQL As String, Optional pConnectionId As Integer = 0) As Boolean + Return ExecuteNonQuery(pSQL, Constants.DatabaseType.ECM, pForceFallback:=False, pConnectionId) + End Function + + Public Function ExecuteNonQueryIDB(pSQL As String, Optional pConnectionId As Integer = 0) As Boolean + Return ExecuteNonQuery(pSQL, Constants.DatabaseType.IDB, pForceFallback:=False, pConnectionId) + End Function + ''' ''' Returns a Datatable by trying to fetch a cached version from the service, then querying the database through the service and querying the database directly as fallback. ''' @@ -112,7 +124,7 @@ Public Class DatabaseWithFallback End If ' If ForceFallback flag is set, we go to database immediately - If pForceFallback Then + If pForceFallback Or _ClientConfig.ForceDirectDatabaseAccess Then Return GetDatatableFromDatabase(pFallbackSQL, pFallbackType, pConnectionId) End If @@ -165,7 +177,7 @@ Public Class DatabaseWithFallback End If ' If ForceFallback flag is set, we go to database immediately - If pForceFallback Then + If pForceFallback Or _ClientConfig.ForceDirectDatabaseAccess Then Return GetScalarValueFromDatabase(pSQL, pDatabaseType, pConnectionId) End If @@ -178,6 +190,37 @@ Public Class DatabaseWithFallback End Try End Function + ''' + ''' Returns a Scalar Value by querying the database through the service and querying the database directly as fallback. + ''' + ''' SQL Command to execute as fallback + ''' Named Database to use for the fallback SQL Command + ''' Force the fallback, skipping the service completely + ''' Connection Id to use, references TBDD_CONNECTION + Public Function ExecuteNonQuery(pSQL As String, pDatabaseType As Constants.DatabaseType, Optional pForceFallback As Boolean = False, Optional pConnectionId As Integer = 0) As Boolean + Try + Dim oResult As DataTable = Nothing + Dim oTableResult As TableResult = Nothing + + ' If there is no client, we assume there is no service (configured) + If _Client Is Nothing Then + Return ExecuteNonQueryFromDatabase(pSQL, pDatabaseType, pConnectionId) + End If + + ' If ForceFallback flag is set, we go to database immediately + If pForceFallback Or _ClientConfig.ForceDirectDatabaseAccess Then + Return ExecuteNonQueryFromDatabase(pSQL, pDatabaseType, pConnectionId) + End If + + Return ExecuteNonQueryFromService(pSQL, pDatabaseType, pConnectionId) + + Catch ex As Exception + _Logger.Error(ex) + Return Nothing + + End Try + End Function + Private Function IsTableCached(pName As String) As Boolean If _Client Is Nothing Then Return False @@ -186,19 +229,32 @@ Public Class DatabaseWithFallback Return _Client.CachedTables.Contains(pName.ToUpper) End Function - Private Function GetDatatableFromService(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) + Private Function GetDatatableFromService(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As DataTable Try + Dim oResult As GetDatatableResponse = Nothing + Select Case DatabaseType Case Constants.DatabaseType.ECM - Return _Client.GetDatatableFromECM(pSQLCommand, pConnectionId) + oResult = _Client.GetDatatableFromECM(pSQLCommand, pConnectionId) Case Constants.DatabaseType.IDB - Return _Client.GetDatatableFromIDB(pSQLCommand, pConnectionId) + oResult = _Client.GetDatatableFromIDB(pSQLCommand, pConnectionId) Case Else - Return Nothing + Return GetDatatableFromDatabase(pSQLCommand, DatabaseType, pConnectionId) End Select + + If oResult Is Nothing Then + Throw New ApplicationException("Unexpected server error ocurred!") + End If + + If oResult.OK = False Then + Throw New ApplicationException(oResult.ErrorMessage) + End If + + Return oResult.Table + Catch ex As Exception _Logger.Warn("GetDatatableFromService failed. Falling back to direct database access.") _Logger.Error(ex) @@ -207,19 +263,53 @@ Public Class DatabaseWithFallback End Try End Function - Private Function GetScalarValueFromService(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) + + Private Function GetDatatableFromDatabase(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As DataTable Try + Dim oResult As ExecuteNonQueryResponse = Nothing + Select Case DatabaseType Case Constants.DatabaseType.ECM - Return _Client.GetScalarValueFromECM(pSQLCommand, pConnectionId) + Return _DatabaseECM.GetDatatable(pSQLCommand) Case Constants.DatabaseType.IDB - Return _Client.GetScalarValueFromIDB(pSQLCommand, pConnectionId) + Return _DatabaseIDB.GetDatatable(pSQLCommand) Case Else - Return Nothing + Dim oConnectionString = _DatabaseECM.Get_ConnectionStringforID(pConnectionId) + Return _DatabaseECM.GetDatatableWithConnection(pSQLCommand, oConnectionString) End Select + Catch ex As Exception + _Logger.Error(ex) + Return Nothing + + End Try + End Function + + Private Function GetScalarValueFromService(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Object + Try + Dim oResult As GetScalarValueResponse = Nothing + + Select Case DatabaseType + Case Constants.DatabaseType.ECM + oResult = _Client.GetScalarValueFromECM(pSQLCommand, pConnectionId) + + Case Constants.DatabaseType.IDB + oResult = _Client.GetScalarValueFromIDB(pSQLCommand, pConnectionId) + + End Select + + If oResult Is Nothing Then + Throw New ApplicationException("Unexpected server error ocurred!") + End If + + If oResult.OK = False Then + Throw New ApplicationException(oResult.ErrorMessage) + End If + + Return oResult.Scalar + Catch ex As Exception _Logger.Warn("GetScalarValueFromService failed. Falling back to direct database access.") _Logger.Error(ex) @@ -228,37 +318,19 @@ Public Class DatabaseWithFallback End Try End Function - Private Function GetDatatableFromDatabase(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) + + Private Function GetScalarValueFromDatabase(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Object Try Select Case DatabaseType Case Constants.DatabaseType.ECM - Return _DatabaseEDM.GetDatatable(pSQLCommand) - - Case Constants.DatabaseType.IDB - Return _DatabaseIDB.GetDatatable(pSQLCommand) - - Case Else - Return Nothing - - End Select - Catch ex As Exception - _Logger.Error(ex) - Return Nothing - - End Try - End Function - - Private Function GetScalarValueFromDatabase(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) - Try - Select Case DatabaseType - Case Constants.DatabaseType.ECM - Return _DatabaseEDM.GetScalarValue(pSQLCommand) + Return _DatabaseECM.GetScalarValue(pSQLCommand) Case Constants.DatabaseType.IDB Return _DatabaseIDB.GetScalarValue(pSQLCommand) Case Else - Return Nothing + Dim oConnectionString = _DatabaseECM.Get_ConnectionStringforID(pConnectionId) + Return _DatabaseECM.GetScalarValueWithConnection(pSQLCommand, oConnectionString) End Select Catch ex As Exception @@ -267,5 +339,57 @@ Public Class DatabaseWithFallback End Try End Function + + Private Function ExecuteNonQueryFromService(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Boolean + Try + Dim oResult As ExecuteNonQueryResponse = Nothing + + Select Case DatabaseType + Case Constants.DatabaseType.ECM + oResult = _Client.ExecuteNonQueryFromECM(pSQLCommand, pConnectionId) + + Case Constants.DatabaseType.IDB + oResult = _Client.ExecuteNonQueryFromIDB(pSQLCommand, pConnectionId) + + End Select + + If oResult Is Nothing Then + Throw New ApplicationException("Unexpected server error ocurred!") + End If + + If oResult.OK = False Then + Throw New ApplicationException(oResult.ErrorMessage) + End If + + Return oResult.Result + + Catch ex As Exception + _Logger.Warn("ExecuteNonQueryFromService failed. Falling back to direct database access.") + _Logger.Error(ex) + Return ExecuteNonQueryFromDatabase(pSQLCommand, DatabaseType, pConnectionId) + + End Try + End Function + + Private Function ExecuteNonQueryFromDatabase(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Boolean + Try + Select Case DatabaseType + Case Constants.DatabaseType.ECM + Return _DatabaseECM.ExecuteNonQuery(pSQLCommand) + + Case Constants.DatabaseType.IDB + Return _DatabaseIDB.ExecuteNonQuery(pSQLCommand) + + Case Else + Dim oConnectionString = _DatabaseECM.Get_ConnectionStringforID(pConnectionId) + Return _DatabaseECM.ExecuteNonQueryWithConnection(pSQLCommand, oConnectionString) + + End Select + Catch ex As Exception + _Logger.Error(ex) + Return False + + End Try + End Function End Class diff --git a/Modules.EDMIAPI/EDMI.API.vbproj b/Modules.EDMIAPI/EDMI.API.vbproj index 757851e6..d9595048 100644 --- a/Modules.EDMIAPI/EDMI.API.vbproj +++ b/Modules.EDMIAPI/EDMI.API.vbproj @@ -125,6 +125,12 @@ Reference.svcmap + + Reference.svcmap + + + Reference.svcmap + Reference.svcmap @@ -170,6 +176,12 @@ Designer + + Designer + + + Designer + Designer @@ -179,25 +191,28 @@ Designer - - Designer - Designer - + Designer - + Designer - + + Designer + + Designer Designer + + Designer + Designer diff --git a/Modules.EDMIAPI/My Project/AssemblyInfo.vb b/Modules.EDMIAPI/My Project/AssemblyInfo.vb index 6a9f3891..06cd13a5 100644 --- a/Modules.EDMIAPI/My Project/AssemblyInfo.vb +++ b/Modules.EDMIAPI/My Project/AssemblyInfo.vb @@ -12,8 +12,8 @@ Imports System.Runtime.InteropServices - - + + @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - - + + diff --git a/Service.EDMIService/BaseMethod.vb b/Service.EDMIService/BaseMethod.vb index afd19e47..7e4d85a2 100644 --- a/Service.EDMIService/BaseMethod.vb +++ b/Service.EDMIService/BaseMethod.vb @@ -13,6 +13,7 @@ Public MustInherit Class BaseMethod Public Sub New(pLogConfig As LogConfig, pDatabaseIDB As MSSQLServer, pDatabaseECM As MSSQLServer, pGlobalState As GlobalState) MyBase.New(pLogConfig) DatabaseIDB = pDatabaseIDB + DatabaseECM = pDatabaseECM Helpers = New Helpers(pLogConfig, pDatabaseIDB) GlobalState = pGlobalState End Sub diff --git a/Service.EDMIService/Config.vb b/Service.EDMIService/Config.vb index bf0ee0d7..33026e0e 100644 --- a/Service.EDMIService/Config.vb +++ b/Service.EDMIService/Config.vb @@ -22,4 +22,10 @@ Public Class Config Public Property ContainerPassword As String = String.Empty Public Property Debug As Boolean = False + + Public Property ClientConfig As New ClientConfiguration + + Public Class ClientConfiguration + Public Property ForceDirectDatabaseAccess As Boolean = False + End Class End Class diff --git a/Service.EDMIService/EDMIService.vb b/Service.EDMIService/EDMIService.vb index a680e9cf..53e5b602 100644 --- a/Service.EDMIService/EDMIService.vb +++ b/Service.EDMIService/EDMIService.vb @@ -12,6 +12,7 @@ Imports DigitalData.Services.EDMIService.Exceptions Imports DigitalData.Services.EDMIService.Methods Imports DigitalData.Services.EDMIService.Methods.SetAttributeValue Imports DigitalData.Services.EDMIService.Methods.Database +Imports DigitalData.Services.EDMIService.Methods.IDB Public Class EDMIService @@ -54,21 +55,34 @@ Public Class EDMIService Dim oUsername = StripDomainFromUsername(oOperationContext.ServiceSecurityContext.WindowsIdentity.Name) _Username = oUsername + _Logger = LogConfig.GetLogger() _Logger.Debug("New Request by User [{0}]", _Username) _IDBHelpers = New IDB.Helpers(LogConfig, MSSQL_IDB) End Sub +#Region "=== Base ===" + Public Function Heartbeat() As Boolean Implements IEDMIService.Heartbeat + Return True + End Function + + Public Function GetClientConfig() As Base.GetClientConfig.GetClientConfigResponse Implements IEDMIService.GetClientConfig + _Logger.Debug("Start of Method [GetClientConfig]") + Dim oGetClientConfig As New Base.GetClientConfig.GetClientConfigMethod(LogConfig, MSSQL_IDB, MSSQL_ECM, GlobalState) + Return oGetClientConfig.Run() + End Function +#End Region + Public Function NewFile(Data As NewFile.NewFileRequest) As NewFile.NewFileResponse Implements IEDMIService.NewFile _Logger.Debug("Start of Method [NewFile]") - Dim oNewFile As New NewFileMethod(LogConfig, MSSQL_IDB, MSSQL_ECM, GlobalState) + Dim oNewFile As New NewFile.NewFileMethod(LogConfig, MSSQL_IDB, MSSQL_ECM, GlobalState) Return oNewFile.Run(Data) End Function Public Function SetAttributeValue(Data As SetAttributeValue.SetAttributeValueRequest) As SetAttributeValue.SetAttributeValueResponse Implements IEDMIService.SetAttributeValue _Logger.Debug("Start of Method [SetAttributeValue]") - Dim oSetAttributeValue As New SetAttributeValueMethod(LogConfig, MSSQL_IDB, MSSQL_ECM, GlobalState) + Dim oSetAttributeValue As New SetAttributeValue.SetAttributeValueMethod(LogConfig, MSSQL_IDB, MSSQL_ECM, GlobalState) Return oSetAttributeValue.Run(Data) End Function @@ -84,11 +98,6 @@ Public Class EDMIService Return oGetFileObject.Run(pData) End Function -#Region "=== Heartbeat ===" - Public Function Heartbeat() As Boolean Implements IEDMIService.Heartbeat - Return True - End Function -#End Region #Region "=== Database ===" Public Function GetCachedTables() As List(Of String) Implements IEDMIService.GetCachedTables @@ -126,6 +135,12 @@ Public Class EDMIService Dim oGetScalarValue As New GetScalarValue.GetScalarValueMethod(LogConfig, MSSQL_IDB, MSSQL_ECM, GlobalState) Return oGetScalarValue.Run(pData) End Function + + Public Function ExecuteNonQuery(pData As ExecuteNonQuery.ExecuteNonQueryRequest) As ExecuteNonQuery.ExecuteNonQueryResponse Implements IEDMIService.ExecuteNonQuery + _Logger.Debug("Start of Method [ExecuteNonQuery]") + Dim oExecuteNonQuery As New ExecuteNonQuery.ExecuteNonQueryMethod(LogConfig, MSSQL_IDB, MSSQL_ECM, GlobalState) + Return oExecuteNonQuery.Run(pData) + End Function #End Region #Region "=== Database (MSSQL IDB) ===" diff --git a/Service.EDMIService/EDMIService.vbproj b/Service.EDMIService/EDMIService.vbproj index f14bf1cf..4cb4a321 100644 --- a/Service.EDMIService/EDMIService.vbproj +++ b/Service.EDMIService/EDMIService.vbproj @@ -131,25 +131,30 @@ + + + + + - - - - - - - - - - - + + + + + + + + + + + @@ -161,12 +166,12 @@ - - - - - - + + + + + + @@ -175,7 +180,7 @@ - + diff --git a/Service.EDMIService/GlobalState.vb b/Service.EDMIService/GlobalState.vb index 6e8e8143..51baa413 100644 --- a/Service.EDMIService/GlobalState.vb +++ b/Service.EDMIService/GlobalState.vb @@ -11,6 +11,7 @@ Public Class GlobalState Public Property ObjectStores As New List(Of ObjectStore) Public Property Connections As New List(Of DatabaseConnection) + Public Property ClientConfig As New Config.ClientConfiguration Public Property TableStore As New DataSet diff --git a/Service.EDMIService/IDB/Helpers.vb b/Service.EDMIService/IDB/Helpers.vb index eb3f8d56..9b150509 100644 --- a/Service.EDMIService/IDB/Helpers.vb +++ b/Service.EDMIService/IDB/Helpers.vb @@ -6,7 +6,7 @@ Imports System.Data.SqlClient Imports System.IO Imports DigitalData.Modules.ZooFlow.State Imports DigitalData.Modules.Patterns -Imports DigitalData.Services.EDMIService.Methods +Imports DigitalData.Services.EDMIService.Methods.IDB Namespace IDB Public Class Helpers diff --git a/Service.EDMIService/IEDMIService.vb b/Service.EDMIService/IEDMIService.vb index e58c6822..042aadb0 100644 --- a/Service.EDMIService/IEDMIService.vb +++ b/Service.EDMIService/IEDMIService.vb @@ -5,13 +5,17 @@ Imports DigitalData.Services.EDMIService.Exceptions Imports DigitalData.Services.EDMIService.Messages Imports DigitalData.Services.EDMIService.Methods Imports DigitalData.Services.EDMIService.Methods.Database +Imports DigitalData.Services.EDMIService.Methods.IDB Interface IEDMIService -#Region "Heartbeat" +#Region "Base" Function Heartbeat() As Boolean + + + Function GetClientConfig() As Base.GetClientConfig.GetClientConfigResponse #End Region #Region "Database" @@ -28,6 +32,9 @@ Interface IEDMIService Function ReturnScalarValue(pData As GetScalarValue.GetScalarValueRequest) As GetScalarValue.GetScalarValueResponse + + + Function ExecuteNonQuery(pData As ExecuteNonQuery.ExecuteNonQueryRequest) As ExecuteNonQuery.ExecuteNonQueryResponse #End Region #Region "Database (Firebird)" diff --git a/Service.EDMIService/Methods/Base/GetClientConfig/GetClientConfigMethod.vb b/Service.EDMIService/Methods/Base/GetClientConfig/GetClientConfigMethod.vb new file mode 100644 index 00000000..285ac3cd --- /dev/null +++ b/Service.EDMIService/Methods/Base/GetClientConfig/GetClientConfigMethod.vb @@ -0,0 +1,22 @@ +Imports DigitalData.Modules.Database +Imports DigitalData.Modules.Logging + +Namespace Methods.Base.GetClientConfig + Public Class GetClientConfigMethod + Inherits BaseMethod + + Public Sub New(pLogConfig As LogConfig, pDatabaseIDB As MSSQLServer, pDatabaseECM As MSSQLServer, pGlobalState As GlobalState) + MyBase.New(pLogConfig, pDatabaseIDB, pDatabaseECM, pGlobalState) + End Sub + + Public Function Run() As GetClientConfigResponse + Try + Return New GetClientConfigResponse(GlobalState.ClientConfig) + Catch ex As Exception + Logger.Warn("Error occurred while getting client config!") + Return New GetClientConfigResponse(ex) + End Try + End Function + End Class + +End Namespace \ No newline at end of file diff --git a/Service.EDMIService/Methods/Base/GetClientConfig/GetClientConfigResponse.vb b/Service.EDMIService/Methods/Base/GetClientConfig/GetClientConfigResponse.vb new file mode 100644 index 00000000..6ad1ad2b --- /dev/null +++ b/Service.EDMIService/Methods/Base/GetClientConfig/GetClientConfigResponse.vb @@ -0,0 +1,23 @@ +Imports System.Runtime.Serialization + +Namespace Methods.Base.GetClientConfig + + + + Public Class GetClientConfigResponse + Inherits Messages.BaseResponse + + + Public Property ClientConfig As Config.ClientConfiguration + + Public Sub New(pConfig As Config.ClientConfiguration) + MyBase.New() + ClientConfig = pConfig + End Sub + + Public Sub New(pException As Exception, Optional pDetails As String = "") + MyBase.New(pException, pDetails) + End Sub + End Class + +End Namespace \ No newline at end of file diff --git a/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryMethod.vb b/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryMethod.vb new file mode 100644 index 00000000..6d739512 --- /dev/null +++ b/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryMethod.vb @@ -0,0 +1,66 @@ +Imports DigitalData.Modules.Database +Imports DigitalData.Modules.Logging + +Namespace Methods.Database.ExecuteNonQuery + ''' + ''' Database method for executing a query from the supplied SQL Command and a Connection Id. + ''' + Public Class ExecuteNonQueryMethod + Inherits BaseMethod + + Public Sub New(pLogConfig As LogConfig, pDatabaseIDB As MSSQLServer, pDatabaseECM As MSSQLServer, pGlobalState As GlobalState) + MyBase.New(pLogConfig, pDatabaseIDB, pDatabaseECM, pGlobalState) + End Sub + + ''' + ''' Executes a Query. If ConnectionId is empty, uses the configured DD_ECM Database. + ''' + Public Function Run(pData As ExecuteNonQueryRequest) As ExecuteNonQueryResponse + Try + Dim oResult As Boolean = False + + Select Case pData.DatabaseType + Case DatabaseType.MSSQL + If pData.NamedDatabase = DatabaseName.None Then + oResult = ExecuteNonQueryByConnectionId(pData.SqlCommand, pData.ConnectionId) + + ElseIf pData.NamedDatabase = DatabaseName.ECM Then + oResult = DatabaseECM.ExecuteNonQuery(pData.SqlCommand) + + ElseIf pData.NamedDatabase = DatabaseName.IDB Then + oResult = DatabaseIDB.ExecuteNonQuery(pData.SqlCommand) + + Else + LogAndThrow($"Unsupported Named Database supplied. SQL Command [{pData.SqlCommand}] was not executed!") + + End If + + Case Else + LogAndThrow($"Only MSSQL Server is supported at this time. SQL Command [{pData.SqlCommand}] was not executed!") + + End Select + + Return New ExecuteNonQueryResponse(oResult) + Catch ex As Exception + Logger.Warn("Error occurred while getting database scalar value!") + Return New ExecuteNonQueryResponse(ex) + End Try + End Function + + Private Function ExecuteNonQueryByConnectionId(pSQLCommand As String, pConnectionId As Integer) As Boolean + If pConnectionId = 0 Then + Return DatabaseECM.ExecuteNonQuery(pSQLCommand) + Else + Dim oConnectionString = DatabaseECM.Get_ConnectionStringforID(pConnectionId) + If oConnectionString <> "" Then + + Return DatabaseIDB.ExecuteNonQueryWithConnection(pSQLCommand, oConnectionString) + Else + Logger.Warn("ConnectionId [{0}] could not be translated into ConnectionString. Exiting.") + Return False + End If + End If + End Function + End Class + +End Namespace \ No newline at end of file diff --git a/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryRequest.vb b/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryRequest.vb new file mode 100644 index 00000000..b14f665d --- /dev/null +++ b/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryRequest.vb @@ -0,0 +1,8 @@ +Namespace Methods.Database.ExecuteNonQuery + Public Class ExecuteNonQueryRequest + Public Property SqlCommand As String = "" + Public Property ConnectionId As Integer = 0 + Public Property DatabaseType As DatabaseType = DatabaseType.MSSQL + Public Property NamedDatabase As DatabaseName = DatabaseName.ECM + End Class +End Namespace diff --git a/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryResponse.vb b/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryResponse.vb new file mode 100644 index 00000000..b1e36639 --- /dev/null +++ b/Service.EDMIService/Methods/Database/ExecuteNonQuery/ExecuteNonQueryResponse.vb @@ -0,0 +1,24 @@ +Imports System.Runtime.Serialization + +Namespace Methods.Database.ExecuteNonQuery + + + + Public Class ExecuteNonQueryResponse + Inherits Messages.BaseResponse + + + Public Property Result As Boolean + + Public Sub New(pResult As Object) + MyBase.New() + Result = pResult + End Sub + + Public Sub New(pException As Exception, Optional pDetails As String = "") + MyBase.New(pException, pDetails) + End Sub + End Class + +End Namespace + diff --git a/Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheMethod.vb b/Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheMethod.vb similarity index 97% rename from Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheMethod.vb rename to Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheMethod.vb index 3fdb99b8..a5e3fb06 100644 --- a/Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheMethod.vb +++ b/Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheMethod.vb @@ -2,7 +2,7 @@ Imports DigitalData.Modules.Language Imports DigitalData.Modules.Logging -Namespace Methods.GetDatatableFromCache +Namespace Methods.Database.GetDatatableFromCache Public Class GetDatatableFromCacheMethod Inherits BaseMethod diff --git a/Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheRequest.vb b/Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheRequest.vb similarity index 87% rename from Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheRequest.vb rename to Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheRequest.vb index 173ef344..9dd3a763 100644 --- a/Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheRequest.vb +++ b/Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheRequest.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.GetDatatableFromCache +Namespace Methods.Database.GetDatatableFromCache Public Class GetDatatableFromCacheRequest diff --git a/Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheResponse.vb b/Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheResponse.vb similarity index 91% rename from Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheResponse.vb rename to Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheResponse.vb index 8480e418..494fd364 100644 --- a/Service.EDMIService/Methods/GetDatatableFromCache/GetDatatableFromCacheResponse.vb +++ b/Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheResponse.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.GetDatatableFromCache +Namespace Methods.Database.GetDatatableFromCache Public Class GetDatatableFromCacheResponse diff --git a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileMethod.vb b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileMethod.vb index 34581d4f..b3ea349a 100644 --- a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileMethod.vb +++ b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileMethod.vb @@ -1,9 +1,10 @@ -Imports DigitalData.Modules.Database +Imports System.IO +Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Patterns Imports DigitalData.Modules.Language -Imports DigitalData.Services.EDMIService.Methods.GetDatatableFromCache -Imports System.IO +Imports DigitalData.Services.EDMIService.Methods.Database +Imports DigitalData.Services.EDMIService.Methods.IDB Imports DigitalData.Modules.ZooFlow.State Namespace Methods.GlobalIndexer.ImportFile @@ -12,7 +13,7 @@ Namespace Methods.GlobalIndexer.ImportFile Private ReadOnly Loader As Loader Private ReadOnly Patterns As Patterns2 - Private ReadOnly GetDatatable As GetDatatableFromCacheMethod + Private ReadOnly GetDatatable As GetDatatableFromCache.GetDatatableFromCacheMethod Private ReadOnly Connection As SqlClient.SqlConnection Private ReadOnly Transaction As SqlClient.SqlTransaction @@ -59,7 +60,7 @@ Namespace Methods.GlobalIndexer.ImportFile oAutoAttributes = oAutomaticIndexing.ApplyAutomaticeAttributes(oUserAttributes, pData.File.FileInfoRaw, User) ' Import the file - Dim oNewFile As New NewFileMethod(LogConfig, DatabaseIDB, DatabaseECM, GlobalState) + Dim oNewFile As New NewFile.NewFileMethod(LogConfig, DatabaseIDB, DatabaseECM, GlobalState) Dim oResponse = oNewFile.Run(New NewFile.NewFileRequest With { .File = pData.File, .BusinessEntity = pData.BusinessEntity, diff --git a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileRequest.vb b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileRequest.vb index 70b73c13..b4880430 100644 --- a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileRequest.vb +++ b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/ImportFileRequest.vb @@ -1,5 +1,6 @@ Imports System.Runtime.Serialization Imports DigitalData.Modules.ZooFlow.State +Imports DigitalData.Services.EDMIService.Methods.IDB Namespace Methods.GlobalIndexer.ImportFile diff --git a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/AutomaticIndexing.vb b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/AutomaticIndexing.vb index cedf6633..cb9144b7 100644 --- a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/AutomaticIndexing.vb +++ b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/AutomaticIndexing.vb @@ -5,6 +5,7 @@ Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Patterns Imports DigitalData.Modules.ZooFlow.State Imports DigitalData.Services.EDMIService.IDB +Imports DigitalData.Services.EDMIService.Methods.IDB Namespace Methods.GlobalIndexer.ImportFile.Steps Public Class AutomaticIndexing diff --git a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/PostProcessing.vb b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/PostProcessing.vb index 650cde8a..9b702ff6 100644 --- a/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/PostProcessing.vb +++ b/Service.EDMIService/Methods/GlobalIndexer/ImportFile/Steps/PostProcessing.vb @@ -1,5 +1,6 @@ Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Language +Imports DigitalData.Services.EDMIService.Methods.IDB Namespace Methods.GlobalIndexer.ImportFile.Steps Public Class PostProcessing diff --git a/Service.EDMIService/Methods/GlobalIndexer/Loader.vb b/Service.EDMIService/Methods/GlobalIndexer/Loader.vb index f3f50c63..ae14a93e 100644 --- a/Service.EDMIService/Methods/GlobalIndexer/Loader.vb +++ b/Service.EDMIService/Methods/GlobalIndexer/Loader.vb @@ -1,7 +1,7 @@ Imports DigitalData.Modules.Database Imports DigitalData.Modules.Language Imports DigitalData.Modules.Logging -Imports DigitalData.Services.EDMIService.Methods.GetDatatableFromCache +Imports DigitalData.Services.EDMIService.Methods.Database Namespace Methods.GlobalIndexer Public Class Loader @@ -12,11 +12,11 @@ Namespace Methods.GlobalIndexer Private Const VIEW_INDEX_AUTOMATIC = "VWDDINDEX_AUTOM" Private Const TABLE_POST_PROCESSING = "TBDD_INDEX_MAN_POSTPROCESSING" - Private GetDatatable As GetDatatableFromCacheMethod + Private GetDatatable As GetDatatableFromCache.GetDatatableFromCacheMethod Public Sub New(pLogConfig As LogConfig, pDatabaseIDB As MSSQLServer, pDatabaseECM As MSSQLServer, pGlobalState As GlobalState) MyBase.New(pLogConfig) - GetDatatable = New GetDatatableFromCacheMethod(pLogConfig, pDatabaseIDB, pDatabaseECM, pGlobalState) + GetDatatable = New GetDatatableFromCache.GetDatatableFromCacheMethod(pLogConfig, pDatabaseIDB, pDatabaseECM, pGlobalState) End Sub ''' @@ -26,7 +26,7 @@ Namespace Methods.GlobalIndexer Logger.Debug("Start of Method [LoadProfile]") Try - Dim oProfile = GetDatatable.Run(New GetDatatableFromCacheRequest With { + Dim oProfile = GetDatatable.Run(New GetDatatableFromCache.GetDatatableFromCacheRequest With { .DataTable = VIEW_PROFILE, .FilterExpression = $"DOCTYPE_ID = {pProfileId}" }) @@ -69,7 +69,7 @@ Namespace Methods.GlobalIndexer Try ' Load automatic Indexes for this Import Dim oAutomaticIndexes = GetDatatable.Run( - New GetDatatableFromCacheRequest With { + New GetDatatableFromCache.GetDatatableFromCacheRequest With { .DataTable = VIEW_INDEX_AUTOMATIC, .FilterExpression = $"DOCTYPE_ID = {pProfileId}" }) @@ -112,7 +112,7 @@ Namespace Methods.GlobalIndexer Try ' Load manual Indexes for this Import Dim oManualIndexes = GetDatatable.Run( - New GetDatatableFromCacheRequest With { + New GetDatatableFromCache.GetDatatableFromCacheRequest With { .DataTable = VIEW_INDEX_MANUAL, .FilterExpression = $"DOK_ID = {pProfileId}" }) @@ -166,7 +166,7 @@ Namespace Methods.GlobalIndexer ' Load all relevant postprocessing steps Dim oPostProcessingSteps = GetDatatable.Run( - New GetDatatableFromCacheRequest With { + New GetDatatableFromCache.GetDatatableFromCacheRequest With { .DataTable = TABLE_POST_PROCESSING, .FilterExpression = $"IDXMAN_ID IN ({oIndexIds})" }) diff --git a/Service.EDMIService/Methods/AttributeValue.vb b/Service.EDMIService/Methods/IDB/AttributeValue.vb similarity index 95% rename from Service.EDMIService/Methods/AttributeValue.vb rename to Service.EDMIService/Methods/IDB/AttributeValue.vb index f34631c9..2ba6bb4b 100644 --- a/Service.EDMIService/Methods/AttributeValue.vb +++ b/Service.EDMIService/Methods/IDB/AttributeValue.vb @@ -1,4 +1,4 @@ -Namespace Methods +Namespace Methods.IDB Public MustInherit Class BaseAttributeValue diff --git a/Service.EDMIService/Methods/FileProperties.vb b/Service.EDMIService/Methods/IDB/FileProperties.vb similarity index 97% rename from Service.EDMIService/Methods/FileProperties.vb rename to Service.EDMIService/Methods/IDB/FileProperties.vb index 6682d748..96818ac2 100644 --- a/Service.EDMIService/Methods/FileProperties.vb +++ b/Service.EDMIService/Methods/IDB/FileProperties.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods +Namespace Methods.IDB Public Class FileProperties ''' ''' Absolute filename of the file to be imported diff --git a/Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueMethod.vb b/Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueMethod.vb similarity index 89% rename from Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueMethod.vb rename to Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueMethod.vb index 0a1a5c80..530d61a0 100644 --- a/Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueMethod.vb +++ b/Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueMethod.vb @@ -1,7 +1,8 @@ Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging +Imports DigitalData.Services.EDMIService.Methods.IDB.GetAttributeValue -Namespace Methods.GetAttributeValue +Namespace Methods.IDB.GetAttributeValue Public Class GetAttributeValueMethod Inherits BaseMethod diff --git a/Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueRequest.vb b/Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueRequest.vb similarity index 72% rename from Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueRequest.vb rename to Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueRequest.vb index 84a85408..3147a73b 100644 --- a/Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueRequest.vb +++ b/Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueRequest.vb @@ -1,4 +1,4 @@ -Namespace Methods.GetAttributeValue +Namespace Methods.IDB.GetAttributeValue Public Class GetAttributeValueRequest Public Property ObjectId As Long End Class diff --git a/Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueResponse.vb b/Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueResponse.vb similarity index 93% rename from Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueResponse.vb rename to Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueResponse.vb index 7c20e711..96622a23 100644 --- a/Service.EDMIService/Methods/GetAttributeValue/GetAttributeValueResponse.vb +++ b/Service.EDMIService/Methods/IDB/GetAttributeValue/GetAttributeValueResponse.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.GetAttributeValue +Namespace Methods.IDB.GetAttributeValue diff --git a/Service.EDMIService/Methods/GetFileObject/FileObject.vb b/Service.EDMIService/Methods/IDB/GetFileObject/FileObject.vb similarity index 91% rename from Service.EDMIService/Methods/GetFileObject/FileObject.vb rename to Service.EDMIService/Methods/IDB/GetFileObject/FileObject.vb index 6ffed104..3a315e91 100644 --- a/Service.EDMIService/Methods/GetFileObject/FileObject.vb +++ b/Service.EDMIService/Methods/IDB/GetFileObject/FileObject.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.GetFileObject +Namespace Methods.IDB.GetFileObject Public Class FileObject diff --git a/Service.EDMIService/Methods/GetFileObject/GetFileObjectMethod.vb b/Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectMethod.vb similarity index 98% rename from Service.EDMIService/Methods/GetFileObject/GetFileObjectMethod.vb rename to Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectMethod.vb index 5651a8fb..674131fb 100644 --- a/Service.EDMIService/Methods/GetFileObject/GetFileObjectMethod.vb +++ b/Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectMethod.vb @@ -3,7 +3,7 @@ Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Language Imports System.IO -Namespace Methods.GetFileObject +Namespace Methods.IDB.GetFileObject Public Class GetFileObjectMethod Inherits BaseMethod diff --git a/Service.EDMIService/Methods/GetFileObject/GetFileObjectRequest.vb b/Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectRequest.vb similarity index 88% rename from Service.EDMIService/Methods/GetFileObject/GetFileObjectRequest.vb rename to Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectRequest.vb index 59aa5e75..2d2484ef 100644 --- a/Service.EDMIService/Methods/GetFileObject/GetFileObjectRequest.vb +++ b/Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectRequest.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.GetFileObject +Namespace Methods.IDB.GetFileObject Public Class GetFileObjectRequest diff --git a/Service.EDMIService/Methods/GetFileObject/GetFileObjectResponse.vb b/Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectResponse.vb similarity index 93% rename from Service.EDMIService/Methods/GetFileObject/GetFileObjectResponse.vb rename to Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectResponse.vb index 70b7b41c..7942d8fc 100644 --- a/Service.EDMIService/Methods/GetFileObject/GetFileObjectResponse.vb +++ b/Service.EDMIService/Methods/IDB/GetFileObject/GetFileObjectResponse.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.GetFileObject +Namespace Methods.IDB.GetFileObject Public Class GetFileObjectResponse diff --git a/Service.EDMIService/Methods/IDB/NewFile/NewFileMethod.vb b/Service.EDMIService/Methods/IDB/NewFile/NewFileMethod.vb new file mode 100644 index 00000000..a300c989 --- /dev/null +++ b/Service.EDMIService/Methods/IDB/NewFile/NewFileMethod.vb @@ -0,0 +1,235 @@ +Imports System.Data.SqlClient +Imports DigitalData.Modules.Database +Imports DigitalData.Modules.Database.MSSQLServer.TransactionMode +Imports DigitalData.Modules.Logging +Imports DigitalData.Services.EDMIService.Methods +Imports DigitalData.Services.EDMIService.GlobalState + +Namespace Methods.IDB.NewFile + Public Class NewFileMethod + Inherits BaseMethod + + Private ReadOnly Connection As SqlConnection + Private ReadOnly Transaction As SqlTransaction + + Public Sub New(pLogConfig As LogConfig, pDatabaseIDB As MSSQLServer, pDatabaseECM As MSSQLServer, pGlobalState As GlobalState) + MyBase.New(pLogConfig, pDatabaseIDB, pDatabaseECM, pGlobalState) + + Connection = DatabaseIDB.GetConnection() + Transaction = Connection.BeginTransaction() + End Sub + + Public Function Run(pData As NewFile.NewFileRequest) As Methods.IDB.NewFile.NewFileResponse + Dim oFilePath As String = Nothing + + Dim oExistingObjectId = TestFileChecksumExists(pData.File.FileChecksum) + If oExistingObjectId > 0 Then + Return New NewFile.NewFileResponse(oExistingObjectId) + End If + + Try + + Dim oObjectId = NewObjectId(pData.KindType, pData.BusinessEntity, pData.User.UserName) + If oObjectId = 0 Then + LogAndThrow("Could not create new ObjectId!") + End If + + ' Find ObjectStore by Title + Logger.Debug("Checking for DataStore [{0}].", pData.StoreName) + Dim oStore = GlobalState.ObjectStores. + Where(Function(store) store.Title.Equals(pData.StoreName, StringComparison.OrdinalIgnoreCase)). + SingleOrDefault() + + If oStore Is Nothing Then + LogAndThrow($"DataStore [{pData.StoreName}] does not exist. Exiting.") + End If + + ' Get Store base path + Dim oBasePath As String = oStore.Path + Logger.Debug("Store BasePath is [{0}]", oBasePath) + + ' Get directory by DateImported or, if not supplied, by current date + Dim oSubDirectory As String + If IsNothing(pData.File.FileImportedAt) Then + oSubDirectory = GetDateSubDirectory(Now) + Else + oSubDirectory = GetDateSubDirectory(pData.File.FileImportedAt) + End If + Logger.Debug("Subdirectory is [{0}]", oSubDirectory) + + ' Check and create final path, if necessary + Dim oFinalPath = IO.Path.Combine(oBasePath, oSubDirectory) + If Not IO.Directory.Exists(oFinalPath) Then + Try + Logger.Debug("Path does not exist, creating: [{0}]", oFinalPath) + IO.Directory.CreateDirectory(oFinalPath) + Logger.Debug("Created folder [{0}]", oFinalPath) + Catch ex As Exception + LogAndThrow(ex, $"Store Directory [{oFinalPath}] could not be created!") + End Try + End If + Logger.Debug("Final Directory is [{0}]", oFinalPath) + + ' Get filename + Dim oKeepFileName As Boolean = False + If oStore.IsArchive Then + Logger.Debug("Object Store is an archive: [{0}]", oStore.IsArchive) + oKeepFileName = True + End If + + Dim oFileName As String = GetFileObjectFileName(oObjectId, pData.File.FileName, oKeepFileName) + Logger.Debug("Filename is [{0}]", oFileName) + + oFilePath = IO.Path.Combine(oFinalPath, oFileName) + Dim oFileObjectInfo As IO.FileInfo = New IO.FileInfo(oFilePath) + + Dim oFileObjectSize As Long = pData.File.FileContents.Length + Dim oFileObjectName As String = oFileObjectInfo.Name + Dim oOriginalExtension As String = pData.File.FileInfoRaw.Extension.Substring(1) + + Logger.Debug("File Information for [{0}]:", oFileObjectName) + Logger.Debug("Size: [{0}]", oFileObjectSize) + Logger.Debug("Original Extension: [{0}]", oOriginalExtension) + Logger.Debug("Checksum: [{0}]", pData.File.FileChecksum) + + Try + Using oStream = New IO.FileStream(oFilePath, IO.FileMode.Create, IO.FileAccess.Write) + Logger.Info("Saving file to path [{0}]", oFilePath) + oStream.Write(pData.File.FileContents, 0, oFileObjectSize) + oStream.Flush(True) + oStream.Close() + End Using + Catch ex As Exception + LogAndThrow(ex, $"Could not write file [{oFilePath}] to disk!") + End Try + + '--------------------------------------------------------------------------- + + Logger.Info("Creating IDB FileObject for ObjectId [{0}].", oObjectId) + + ' Insert into DB + Dim oSQL As String = $"EXEC PRIDB_NEW_IDBFO + '{oFinalPath}', + '{oFileObjectName}', + '{oOriginalExtension}', + {oFileObjectSize}, + '{pData.File.FileChecksum}' , + '{pData.User.UserName}', + '{oObjectId}', + {oStore.Id}" + + Dim oResult As Boolean = DatabaseIDB.ExecuteNonQueryWithConnectionObject(oSQL, Connection, ExternalTransaction, Transaction) + + If oResult = False Then + LogAndThrow("IDB FileObject could not be created!") + End If + + '--------------------------------------------------------------------------- + + 'TODO: File dates in try catch + + Dim oSystemAttributes As New Dictionary(Of String, Object) From { + {"OriginFileName", pData.File.FileName}, + {"OriginCreationDatetime", pData.File.FileCreatedAt}, + {"OriginChangedDatetime", pData.File.FileChangedAt} + } + + For Each oAttribute As KeyValuePair(Of String, Object) In oSystemAttributes + Try + ' Dont write empty attributes + If oAttribute.Value Is Nothing Then + Continue For + End If + + Dim oSuccess = Helpers.SetAttributeValue(Connection, Transaction, oObjectId, oAttribute.Key, oAttribute.Value, pData.User.Language, pData.User.UserName) + If oSuccess Then + Logger.Debug("System Attribute [{0}] written with value [{1}]", oAttribute.Key, oAttribute.Value) + Else + Logger.Warn("System attribute value could not be written") + End If + Catch ex As Exception + LogAndThrow(ex, $"System attribute [{oAttribute.Key}] could not be written!") + End Try + Next + + '--------------------------------------------------------------------------- + + ' Finally, commit the transaction + Transaction?.Commit() + + Return New NewFile.NewFileResponse(oObjectId) + Catch ex As Exception + Logger.Warn("Error occurred while creating file!") + Logger.Error(ex) + + Logger.Info("Cleaning up files.") + If Not IsNothing(oFilePath) AndAlso IO.File.Exists(oFilePath) Then + Try + IO.File.Delete(oFilePath) + Catch exInner As Exception + Logger.Warn("Error while cleaning up files.") + Logger.Error(exInner) + End Try + End If + + Logger.Info("Rolling back transaction.") + Transaction?.Rollback() + + Return New NewFile.NewFileResponse(ex) + + End Try + End Function + + Private Function TestFileChecksumExists(pChecksum As String) As Long + Try + Dim oChecksumSQL = $"SELECT IDB_OBJ_ID FROM TBIDB_FILE_OBJECT WHERE FILE_HASH = '{pChecksum}'" + Dim oExistingObjectId As Long = DatabaseIDB.GetScalarValue(oChecksumSQL) + + If oExistingObjectId > 0 Then + Logger.Info("Returning early with ObjectId [{0}] because Checksum [{1}] already exists.", oExistingObjectId, pChecksum) + Return oExistingObjectId + End If + + Return Nothing + + Catch ex As Exception + Logger.Error(ex) + Return Nothing + + End Try + End Function + + Private Function NewObjectId(pKindType As String, pBusinessEntity As String, pWho As String) As Long + Try + Dim oNewObjectIdSQL = $"DECLARE @NEW_IDB_OBJ_ID BIGINT + EXEC PRIDB_NEW_OBJECT '{pKindType}','{pWho}','{pBusinessEntity}',0, @IDB_OBJ_ID = @NEW_IDB_OBJ_ID OUTPUT; + SELECT @NEW_IDB_OBJ_ID" + Dim oObjectId As Long = DatabaseIDB.GetScalarValueWithConnectionObject(oNewObjectIdSQL, Connection, ExternalTransaction, Transaction) + Logger.Info("New Object with Id [{0}] created!", oObjectId) + + If IsNothing(oObjectId) Then + LogAndThrow("Could not create new ObjectId!") + End If + + Return oObjectId + Catch ex As Exception + Logger.Error(ex) + Return Nothing + End Try + End Function + + Private Function GetFileObjectFileName(IDB_OBJ_ID As Long, pFilename As String, pKeepFilename As Boolean) As String + ' TODO: save actual extensions + If pKeepFilename Then + Return pFilename + Else + Return $"{IDB_OBJ_ID}.ddfo" + End If + End Function + + Private Function GetDateSubDirectory(pDate As Date) As String + Return IO.Path.Combine(pDate.ToString("yyyy"), pDate.ToString("MM"), pDate.ToString("dd")) + End Function + End Class + +End Namespace \ No newline at end of file diff --git a/Service.EDMIService/Methods/NewFile/NewFileRequest.vb b/Service.EDMIService/Methods/IDB/NewFile/NewFileRequest.vb similarity index 96% rename from Service.EDMIService/Methods/NewFile/NewFileRequest.vb rename to Service.EDMIService/Methods/IDB/NewFile/NewFileRequest.vb index 8e35ca9d..3c9cadfb 100644 --- a/Service.EDMIService/Methods/NewFile/NewFileRequest.vb +++ b/Service.EDMIService/Methods/IDB/NewFile/NewFileRequest.vb @@ -1,7 +1,7 @@ Imports System.Runtime.Serialization Imports DigitalData.Modules.ZooFlow.State -Namespace Methods.NewFile +Namespace Methods.IDB.NewFile Public Class NewFileRequest diff --git a/Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueResponse.vb b/Service.EDMIService/Methods/IDB/NewFile/NewFileResponse.vb similarity index 94% rename from Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueResponse.vb rename to Service.EDMIService/Methods/IDB/NewFile/NewFileResponse.vb index a8633736..bbc93107 100644 --- a/Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueResponse.vb +++ b/Service.EDMIService/Methods/IDB/NewFile/NewFileResponse.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.NewFile +Namespace Methods.IDB.NewFile Public Class NewFileResponse diff --git a/Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueMethod.vb b/Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueMethod.vb similarity index 96% rename from Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueMethod.vb rename to Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueMethod.vb index f64ef257..f6185daf 100644 --- a/Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueMethod.vb +++ b/Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueMethod.vb @@ -3,7 +3,7 @@ Imports DigitalData.Modules.Database Imports DigitalData.Services.EDMIService.IDB Imports System.Data.SqlClient -Namespace Methods.SetAttributeValue +Namespace Methods.IDB.SetAttributeValue Public Class SetAttributeValueMethod Inherits BaseMethod diff --git a/Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueRequest.vb b/Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueRequest.vb similarity index 93% rename from Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueRequest.vb rename to Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueRequest.vb index 413987ed..04085ee9 100644 --- a/Service.EDMIService/Methods/SetAttributeValue/SetAttributeValueRequest.vb +++ b/Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueRequest.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.SetAttributeValue +Namespace Methods.IDB.SetAttributeValue Public Class SetAttributeValueRequest diff --git a/Service.EDMIService/Methods/NewFile/NewFileResponse.vb b/Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueResponse.vb similarity index 92% rename from Service.EDMIService/Methods/NewFile/NewFileResponse.vb rename to Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueResponse.vb index 6537e477..40702d3e 100644 --- a/Service.EDMIService/Methods/NewFile/NewFileResponse.vb +++ b/Service.EDMIService/Methods/IDB/SetAttributeValue/SetAttributeValueResponse.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Methods.SetAttributeValue +Namespace Methods.IDB.SetAttributeValue Public Class SetAttributeValueResponse diff --git a/Service.EDMIService/Methods/NewFile/NewFileMethod.vb b/Service.EDMIService/Methods/NewFile/NewFileMethod.vb deleted file mode 100644 index 0cdc8d81..00000000 --- a/Service.EDMIService/Methods/NewFile/NewFileMethod.vb +++ /dev/null @@ -1,232 +0,0 @@ -Imports System.Data.SqlClient -Imports DigitalData.Modules.Database -Imports DigitalData.Modules.Database.MSSQLServer.TransactionMode -Imports DigitalData.Modules.Logging -Imports DigitalData.Services.EDMIService.Methods -Imports DigitalData.Services.EDMIService.GlobalState - -Public Class NewFileMethod - Inherits BaseMethod - - Private ReadOnly Connection As SqlConnection - Private ReadOnly Transaction As SqlTransaction - - Public Sub New(pLogConfig As LogConfig, pDatabaseIDB As MSSQLServer, pDatabaseECM As MSSQLServer, pGlobalState As GlobalState) - MyBase.New(pLogConfig, pDatabaseIDB, pDatabaseECM, pGlobalState) - - Connection = DatabaseIDB.GetConnection() - Transaction = Connection.BeginTransaction() - End Sub - - Public Function Run(pData As NewFile.NewFileRequest) As NewFile.NewFileResponse - Dim oFilePath As String = Nothing - - Dim oExistingObjectId = TestFileChecksumExists(pData.File.FileChecksum) - If oExistingObjectId > 0 Then - Return New NewFile.NewFileResponse(oExistingObjectId) - End If - - Try - - Dim oObjectId = NewObjectId(pData.KindType, pData.BusinessEntity, pData.User.UserName) - If oObjectId = 0 Then - LogAndThrow("Could not create new ObjectId!") - End If - - ' Find ObjectStore by Title - Logger.Debug("Checking for DataStore [{0}].", pData.StoreName) - Dim oStore = GlobalState.ObjectStores. - Where(Function(store) store.Title.Equals(pData.StoreName, StringComparison.OrdinalIgnoreCase)). - SingleOrDefault() - - If oStore Is Nothing Then - LogAndThrow($"DataStore [{pData.StoreName}] does not exist. Exiting.") - End If - - ' Get Store base path - Dim oBasePath As String = oStore.Path - Logger.Debug("Store BasePath is [{0}]", oBasePath) - - ' Get directory by DateImported or, if not supplied, by current date - Dim oSubDirectory As String - If IsNothing(pData.File.FileImportedAt) Then - oSubDirectory = GetDateSubDirectory(Now) - Else - oSubDirectory = GetDateSubDirectory(pData.File.FileImportedAt) - End If - Logger.Debug("Subdirectory is [{0}]", oSubDirectory) - - ' Check and create final path, if necessary - Dim oFinalPath = IO.Path.Combine(oBasePath, oSubDirectory) - If Not IO.Directory.Exists(oFinalPath) Then - Try - Logger.Debug("Path does not exist, creating: [{0}]", oFinalPath) - IO.Directory.CreateDirectory(oFinalPath) - Logger.Debug("Created folder [{0}]", oFinalPath) - Catch ex As Exception - LogAndThrow(ex, $"Store Directory [{oFinalPath}] could not be created!") - End Try - End If - Logger.Debug("Final Directory is [{0}]", oFinalPath) - - ' Get filename - Dim oKeepFileName As Boolean = False - If oStore.IsArchive Then - Logger.Debug("Object Store is an archive: [{0}]", oStore.IsArchive) - oKeepFileName = True - End If - - Dim oFileName As String = GetFileObjectFileName(oObjectId, pData.File.FileName, oKeepFileName) - Logger.Debug("Filename is [{0}]", oFileName) - - oFilePath = IO.Path.Combine(oFinalPath, oFileName) - Dim oFileObjectInfo As IO.FileInfo = New IO.FileInfo(oFilePath) - - Dim oFileObjectSize As Long = pData.File.FileContents.Length - Dim oFileObjectName As String = oFileObjectInfo.Name - Dim oOriginalExtension As String = pData.File.FileInfoRaw.Extension.Substring(1) - - Logger.Debug("File Information for [{0}]:", oFileObjectName) - Logger.Debug("Size: [{0}]", oFileObjectSize) - Logger.Debug("Original Extension: [{0}]", oOriginalExtension) - Logger.Debug("Checksum: [{0}]", pData.File.FileChecksum) - - Try - Using oStream = New IO.FileStream(oFilePath, IO.FileMode.Create, IO.FileAccess.Write) - Logger.Info("Saving file to path [{0}]", oFilePath) - oStream.Write(pData.File.FileContents, 0, oFileObjectSize) - oStream.Flush(True) - oStream.Close() - End Using - Catch ex As Exception - LogAndThrow(ex, $"Could not write file [{oFilePath}] to disk!") - End Try - - '--------------------------------------------------------------------------- - - Logger.Info("Creating IDB FileObject for ObjectId [{0}].", oObjectId) - - ' Insert into DB - Dim oSQL As String = $"EXEC PRIDB_NEW_IDBFO - '{oFinalPath}', - '{oFileObjectName}', - '{oOriginalExtension}', - {oFileObjectSize}, - '{pData.File.FileChecksum}' , - '{pData.User.UserName}', - '{oObjectId}', - {oStore.Id}" - - Dim oResult As Boolean = DatabaseIDB.ExecuteNonQueryWithConnectionObject(oSQL, Connection, ExternalTransaction, Transaction) - - If oResult = False Then - LogAndThrow("IDB FileObject could not be created!") - End If - - '--------------------------------------------------------------------------- - - 'TODO: File dates in try catch - - Dim oSystemAttributes As New Dictionary(Of String, Object) From { - {"OriginFileName", pData.File.FileName}, - {"OriginCreationDatetime", pData.File.FileCreatedAt}, - {"OriginChangedDatetime", pData.File.FileChangedAt} - } - - For Each oAttribute As KeyValuePair(Of String, Object) In oSystemAttributes - Try - ' Dont write empty attributes - If oAttribute.Value Is Nothing Then - Continue For - End If - - Dim oSuccess = Helpers.SetAttributeValue(Connection, Transaction, oObjectId, oAttribute.Key, oAttribute.Value, pData.User.Language, pData.User.UserName) - If oSuccess Then - Logger.Debug("System Attribute [{0}] written with value [{1}]", oAttribute.Key, oAttribute.Value) - Else - Logger.Warn("System attribute value could not be written") - End If - Catch ex As Exception - LogAndThrow(ex, $"System attribute [{oAttribute.Key}] could not be written!") - End Try - Next - - '--------------------------------------------------------------------------- - - ' Finally, commit the transaction - Transaction?.Commit() - - Return New NewFile.NewFileResponse(oObjectId) - Catch ex As Exception - Logger.Warn("Error occurred while creating file!") - Logger.Error(ex) - - Logger.Info("Cleaning up files.") - If Not IsNothing(oFilePath) AndAlso IO.File.Exists(oFilePath) Then - Try - IO.File.Delete(oFilePath) - Catch exInner As Exception - Logger.Warn("Error while cleaning up files.") - Logger.Error(exInner) - End Try - End If - - Logger.Info("Rolling back transaction.") - Transaction?.Rollback() - - Return New NewFile.NewFileResponse(ex) - - End Try - End Function - - Private Function TestFileChecksumExists(pChecksum As String) As Long - Try - Dim oChecksumSQL = $"SELECT IDB_OBJ_ID FROM TBIDB_FILE_OBJECT WHERE FILE_HASH = '{pChecksum}'" - Dim oExistingObjectId As Long = DatabaseIDB.GetScalarValue(oChecksumSQL) - - If oExistingObjectId > 0 Then - Logger.Info("Returning early with ObjectId [{0}] because Checksum [{1}] already exists.", oExistingObjectId, pChecksum) - Return oExistingObjectId - End If - - Return Nothing - - Catch ex As Exception - Logger.Error(ex) - Return Nothing - - End Try - End Function - - Private Function NewObjectId(pKindType As String, pBusinessEntity As String, pWho As String) As Long - Try - Dim oNewObjectIdSQL = $"DECLARE @NEW_IDB_OBJ_ID BIGINT - EXEC PRIDB_NEW_OBJECT '{pKindType}','{pWho}','{pBusinessEntity}',0, @IDB_OBJ_ID = @NEW_IDB_OBJ_ID OUTPUT; - SELECT @NEW_IDB_OBJ_ID" - Dim oObjectId As Long = DatabaseIDB.GetScalarValueWithConnectionObject(oNewObjectIdSQL, Connection, ExternalTransaction, Transaction) - Logger.Info("New Object with Id [{0}] created!", oObjectId) - - If IsNothing(oObjectId) Then - LogAndThrow("Could not create new ObjectId!") - End If - - Return oObjectId - Catch ex As Exception - Logger.Error(ex) - Return Nothing - End Try - End Function - - Private Function GetFileObjectFileName(IDB_OBJ_ID As Long, pFilename As String, pKeepFilename As Boolean) As String - ' TODO: save actual extensions - If pKeepFilename Then - Return pFilename - Else - Return $"{IDB_OBJ_ID}.ddfo" - End If - End Function - - Private Function GetDateSubDirectory(pDate As Date) As String - Return IO.Path.Combine(pDate.ToString("yyyy"), pDate.ToString("MM"), pDate.ToString("dd")) - End Function -End Class diff --git a/Service.EDMIService/My Project/AssemblyInfo.vb b/Service.EDMIService/My Project/AssemblyInfo.vb index 23faefe3..3f0c9b0d 100644 --- a/Service.EDMIService/My Project/AssemblyInfo.vb +++ b/Service.EDMIService/My Project/AssemblyInfo.vb @@ -12,8 +12,8 @@ Imports System.Runtime.InteropServices - - + + @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - - + + diff --git a/Service.EDMIService/WindowsService.vb b/Service.EDMIService/WindowsService.vb index e2752393..b87b31d0 100644 --- a/Service.EDMIService/WindowsService.vb +++ b/Service.EDMIService/WindowsService.vb @@ -83,6 +83,10 @@ Public Class WindowsService GlobalState.LoadObjectStores() GlobalState.LoadConnections() + Logger.Debug("Loading Client Config") + Logger.Debug("ForceDirectDatabaseAccess: {0}", Config.ClientConfig.ForceDirectDatabaseAccess) + GlobalState.ClientConfig = Config.ClientConfig + Logger.Debug("Starting Scheduler") Scheduler.Start()