172 lines
6.8 KiB
VB.net
172 lines
6.8 KiB
VB.net
Imports System.Data.SqlClient
|
|
Imports DigitalData.Modules.Base.IDB.Constants
|
|
Imports DigitalData.Modules.Database
|
|
Imports DigitalData.Modules.Database.MSSQLServer.TransactionMode
|
|
Imports DigitalData.Modules.Logging
|
|
|
|
Namespace Methods.IDB.CheckInOutFile
|
|
Public Class CheckInOutFileMethod
|
|
Inherits BaseMethod
|
|
|
|
Private Enum CheckOutResult
|
|
CheckoutSuccessful
|
|
AlreadyCheckedOut
|
|
InternalError
|
|
End Enum
|
|
|
|
Private Enum CheckInResult
|
|
CheckinSuccessful
|
|
NotCheckedOut
|
|
InternalError
|
|
End Enum
|
|
|
|
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 CheckInOutFileRequest) As CheckInOutFileResponse
|
|
Try
|
|
Dim oResult = False
|
|
|
|
If pData.Action = CheckInOutFileAction.CheckOut Then
|
|
Select Case CheckOutFile(pData.ObjectId, pData.User.UserName, pData.Comment)
|
|
Case CheckOutResult.CheckoutSuccessful
|
|
oResult = True
|
|
|
|
Case CheckOutResult.AlreadyCheckedOut
|
|
LogAndThrow($"File '{pData.ObjectId}' is already checked out.")
|
|
|
|
Case CheckOutResult.InternalError
|
|
LogAndThrow($"Internal Error occurred while checking out file [{pData.ObjectId}].")
|
|
|
|
End Select
|
|
|
|
ElseIf pData.Action = CheckInOutFileAction.CheckIn Then
|
|
Select Case CheckInFile(pData.ObjectId, pData.User.UserName)
|
|
Case CheckInResult.CheckinSuccessful
|
|
oResult = True
|
|
|
|
Case CheckInResult.NotCheckedOut
|
|
LogAndThrow($"File '{pData.ObjectId}' is not checked out.")
|
|
|
|
Case CheckInResult.InternalError
|
|
LogAndThrow($"Internal Error occurred while checking in file [{pData.ObjectId}].")
|
|
|
|
End Select
|
|
|
|
Else
|
|
LogAndThrow("Invalid action supplied!")
|
|
|
|
End If
|
|
|
|
If oResult = False Then
|
|
LogAndThrow($"Could not Check In/Out file [{pData.ObjectId}]!")
|
|
End If
|
|
|
|
Return New CheckInOutFileResponse(pData.ObjectId)
|
|
Catch ex As Exception
|
|
Logger.Warn("Error occurred while checkin in/out file!")
|
|
Logger.Error(ex)
|
|
|
|
Logger.Info("Rolling back transaction.")
|
|
Transaction?.Rollback()
|
|
|
|
Return New CheckInOutFileResponse(ex)
|
|
|
|
End Try
|
|
End Function
|
|
|
|
Private Function CheckOutFile(pObjectId As Long, pUsername As String, pComment As String) As CheckOutResult
|
|
Try
|
|
Dim oTable = TestFileIsCheckedOut(pObjectId)
|
|
If oTable Is Nothing Then
|
|
Logger.Warn("File [{0}] could not be checked out because of an internal error!", pObjectId)
|
|
Return CheckOutResult.InternalError
|
|
End If
|
|
|
|
' If there are rows, the file is already checked out (either by the calling user or somebody else)
|
|
If oTable.Rows.Count > 0 Then
|
|
' TODO: Return the person who has this file checked out
|
|
Logger.Warn("File [{0}] is already checked out!", pObjectId)
|
|
Return CheckOutResult.AlreadyCheckedOut
|
|
End If
|
|
|
|
Dim oSQL = $"INSERT INTO TBIDB_OBJECT_CHECK_IN_OUT (IDB_OBJ_ID, CHECKED_OUT_WHEN, COMMENT, ADDED_WHO)
|
|
VALUES ({pObjectId}, GETDATE(), '{pComment}', '{pUsername}')"
|
|
|
|
If DatabaseIDB.ExecuteNonQuery(oSQL) = True Then
|
|
Helpers.SetObjectState(pObjectId, FileStore.OBJECT_STATE_FILE_CHECKED_OUT, pUsername)
|
|
Logger.Info("File [{0}] checked out successfully!", pObjectId)
|
|
|
|
Return CheckOutResult.CheckoutSuccessful
|
|
Else
|
|
Logger.Warn("File [{0}] could not be checked out because of an internal error!", pObjectId)
|
|
Return CheckOutResult.InternalError
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
Logger.Error(ex)
|
|
Return False
|
|
|
|
End Try
|
|
End Function
|
|
|
|
Private Function CheckInFile(pObjectId As Long, pUsername As String) As Boolean
|
|
Try
|
|
Dim oTable = TestFileIsCheckedOut(pObjectId)
|
|
If oTable Is Nothing Then
|
|
Logger.Warn("File [{0}] could not be checked in because of an internal error!", pObjectId)
|
|
Return CheckOutResult.InternalError
|
|
End If
|
|
|
|
' If there are no rows, the file is not checked out
|
|
If oTable.Rows.Count = 0 Then
|
|
Logger.Warn("File [{0}] is not checked out!", pObjectId)
|
|
Return CheckInResult.NotCheckedOut
|
|
End If
|
|
|
|
Dim oSQL = $"UPDATE TBIDB_OBJECT_CHECK_IN_OUT
|
|
SET CHECKED_IN_WHEN = GETDATE(), CHANGED_WHO = '{pUsername}'
|
|
WHERE IDB_OBJ_ID = {pObjectId} AND ADDED_WHO = '{pUsername}' AND CHECKED_IN_WHEN IS NULL"
|
|
|
|
If DatabaseIDB.ExecuteNonQuery(oSQL) = True Then
|
|
Helpers.SetObjectState(pObjectId, FileStore.OBJECT_STATE_FILE_CHECKED_IN, pUsername)
|
|
Logger.Info("File [{0}] checked in successfully!", pObjectId)
|
|
|
|
Return CheckInResult.CheckinSuccessful
|
|
Else
|
|
Logger.Warn("File [{0}] could not be checked in because of an internal error!", pObjectId)
|
|
Return CheckInResult.InternalError
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
Logger.Error(ex)
|
|
Return False
|
|
|
|
End Try
|
|
End Function
|
|
|
|
Private Function TestFileIsCheckedOut(pObjectId As Long) As DataTable
|
|
Try
|
|
Logger.Debug("Checking if file [{0}] is checked out.", pObjectId)
|
|
Dim oSqlCheck = $"SELECT * FROM TBIDB_OBJECT_CHECK_IN_OUT WHERE IDB_OBJ_ID = {pObjectId} AND CHECKED_IN_WHEN IS NULL"
|
|
Dim oTable As DataTable = DatabaseIDB.GetDatatable(oSqlCheck)
|
|
|
|
Return oTable
|
|
Catch ex As Exception
|
|
Logger.Error(ex)
|
|
Return Nothing
|
|
|
|
End Try
|
|
End Function
|
|
|
|
|
|
End Class
|
|
|
|
End Namespace |