Imports DigitalData.Modules.Database Imports DigitalData.Modules.Database.MSSQLServer Imports DigitalData.Modules.Language Imports DigitalData.Modules.Logging Imports System.Data.SqlClient Imports DigitalData.Modules.ZooFlow.State Imports DigitalData.Modules.Patterns Imports DigitalData.Services.EDMIService.Methods.IDB Imports DigitalData.Modules.Filesystem Namespace IDB Public Class Helpers Inherits BaseClass Private ReadOnly Patterns As Patterns2 Private ReadOnly Database As MSSQLServer Private ReadOnly FileEx As File Public Sub New(pLogConfig As LogConfig, pMSSQLServer As MSSQLServer) MyBase.New(pLogConfig) Patterns = New Patterns2(pLogConfig) Database = pMSSQLServer FileEx = New File(pLogConfig) End Sub Public Function GetPlaceholderValue(pValue As String, pFileInfo As IO.FileInfo, pUserState As UserState, pUserAttributes As Dictionary(Of String, List(Of String)), pAutoAttributes As Dictionary(Of String, List(Of String))) As String Dim oResult As String = pValue oResult = Patterns.ReplaceInternalValues(oResult) oResult = Patterns.ReplaceFileValues(oResult, pFileInfo) oResult = Patterns.ReplaceUserValues(oResult, pUserState) oResult = Patterns.ReplaceGlobixValues(oResult, pUserAttributes, pAutoAttributes) Return oResult End Function Public Function UserAttributesToDictionary(pUserAttributes As List(Of UserAttributeValue)) As Dictionary(Of String, List(Of String)) If pUserAttributes Is Nothing OrElse pUserAttributes.Count = 0 Then Return New Dictionary(Of String, List(Of String)) End If Return pUserAttributes.ToDictionary( Function(attr) attr.Name, Function(attr) attr.Values) End Function Public Function TestObjectIdExists(pObjectId As Long, Optional ByRef IsDeleted As Boolean = False, Optional ByRef IsActive As Boolean = False) As Boolean Try Dim oSQL As String = $"SELECT IDB_OBJ_ID, ACTIVE, DELETED FROM TBIDB_OBJECT WHERE IDB_OBJ_ID = {pObjectId}" Dim oTable As DataTable = Database.GetDatatable(oSQL) If IsNothing(oTable) OrElse oTable.Rows.Count = 0 Then Logger.Warn("ObjectId {0} does not exist") Return False End If Dim oRow As DataRow = oTable.Rows.Item(0) Dim oActive = Utils.NotNull(oRow.Item("ACTIVE"), False) Dim oDeleted = Utils.NotNull(oRow.Item("DELETED"), False) IsDeleted = oDeleted IsActive = oActive Return True Catch ex As Exception Logger.Error(ex) Return False End Try End Function Public 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 = Database.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 Public 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 = Database.GetScalarValue(oNewObjectIdSQL) 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 Public Function NewObjectIdWithTransaction(pKindType As String, pWho As String, pConnection As SqlConnection, pTransaction As SqlTransaction) As Long Try Dim oNewObjectIdSQL = $"DECLARE @NEW_IDB_OBJ_ID BIGINT EXEC PRIDB_NEW_OBJECT '{pKindType}','{pWho}',0, 0, @IDB_OBJ_ID = @NEW_IDB_OBJ_ID OUTPUT; SELECT @NEW_IDB_OBJ_ID" Dim oObjectId As Long = Database.GetScalarValueWithConnectionObject(oNewObjectIdSQL, pConnection, TransactionMode.ExternalTransaction, pTransaction) 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 Public Function GetFileObjectPath(pStore As GlobalState.ObjectStore, pDateImported As Date) As String ' Get directory by DateImported or, if not supplied, by current date Dim oFinalPath As String If IsNothing(pDateImported) Then oFinalPath = FileEx.CreateDateDirectory(pStore.Path, Now) Else oFinalPath = FileEx.CreateDateDirectory(pStore.Path, pDateImported) End If Return oFinalPath End Function Public Function SetAttributeValueWithTransaction(pConnection As SqlConnection, pTransaction As SqlTransaction, pObjectId As Long, pAttributeName As String, pValue As String, pLanguage As String, pWho As String) As Boolean Logger.Info("Setting value of Attribute [{0}]", pAttributeName) Dim oSql = $" DECLARE @NEW_OBJ_MD_ID BIGINT EXEC PRIDB_NEW_OBJ_DATA {pObjectId}, '{pAttributeName}', '{pWho}', '{pValue}', '{pLanguage}', 0, @OMD_ID = @NEW_OBJ_MD_ID OUTPUT" If Database.ExecuteNonQueryWithConnectionObject(oSql, pConnection, MSSQLServer.TransactionMode.ExternalTransaction, pTransaction) = False Then Logger.Warn("Error while setting attribute value.") Return False End If Return True End Function Public Sub SetAttributeValuesWithTransaction(pConnection As SqlConnection, pTransaction As SqlTransaction, pObjectId As Long, pAttributes As Dictionary(Of String, List(Of String)), pLanguage As String, pWho As String) For Each oAttribute As KeyValuePair(Of String, List(Of String)) In pAttributes Try ' TODO: This works only for simple attributes for now!!! Dim oValue = oAttribute.Value.FirstOrDefault() ' Dont write empty attributes If oValue Is Nothing Then Continue For End If ' Now make the call to the database Dim oSuccess = SetAttributeValueWithTransaction(pConnection, pTransaction, pObjectId, oAttribute.Key, oValue, pLanguage, pWho) If oSuccess Then Logger.Info("Attribute written [{0}] => [{1}]", oAttribute.Key, oAttribute.Value.First()) Else Logger.Warn("Attribute value could not be written") End If Catch ex As Exception LogAndThrow(ex, $"Attribute [{oAttribute.Key}] could not be written!") End Try Next End Sub Public Function NewDynamicFolderForObject(pObjectId As Long, pFolder As String, pWho As String, pLangCode As String) As Boolean Logger.Info("Setting Dynamic Folder [{0}]", pFolder) Dim oSql = $" DECLARE @NEW_OBJ_MD_ID BIGINT EXEC PRIDB_NEW_DYNAMIC_FOLDER_FOR_OBJECT {pObjectId}, '{pFolder}', '{pWho}', '{pLangCode}'" If Database.ExecuteNonQuery(oSql) = False Then Logger.Warn("Error while setting Dynamic Folder.") Return False End If Return True End Function Public Function SetObjectState(pObjectId As Long, pState As String, pWho As String) As Boolean Try Logger.Debug("Setting object state for [{0}]: [{1}]") Dim oSql As String = $"EXEC PRIDB_OBJECT_SET_STATE {pObjectId}, '{pState}', '{pWho}'" Dim oResult = Database.ExecuteNonQuery(oSql) If oResult = False Then Return False End If Logger.Info("Object state for [{0}] set: [{1}]", pObjectId, pState) Return True Catch ex As Exception Logger.Warn("Error while setting Object State") Logger.Error(ex) Return False End Try End Function End Class End Namespace