created transaction queue to process database writes and deletes in first in first out order
This commit is contained in:
232
LSL2/STPROC/TRANSACTION_SERVICES.txt
Normal file
232
LSL2/STPROC/TRANSACTION_SERVICES.txt
Normal file
@ -0,0 +1,232 @@
|
||||
Compile function Transaction_Services(@Service, @Params)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from Infineon Technologies.
|
||||
|
||||
Name : Transaction_Services
|
||||
|
||||
Description : Handler program for all module related services.
|
||||
|
||||
Notes : Service module to support environmental state issues. Environmental refers to the state of the
|
||||
operating system, which includes version, client vs. server, and path to critical systems.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
06/24/25 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert TRANSACTION_QUEUE_EQUATES
|
||||
|
||||
EQU COMMA$ to ','
|
||||
|
||||
Declare function Datetime, RTI_CreateGuid, Error_Services, SRP_Encode, SRP_Decode, Database_Services
|
||||
Declare function Environment_Services, Logging_Services
|
||||
Declare subroutine Database_Services, Error_Services, Logging_Services
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service PostWriteFieldTransaction(Table, Key, FieldNo, FieldVal)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (Table EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case (Key EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Key passed into service.'
|
||||
Case (FieldNo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case Not(Num(FieldNo))
|
||||
ErrorMsg = 'Error in ':Service:' service. FieldNo ':FieldNo:' is not a number.'
|
||||
Case Otherwise$
|
||||
TransKey = RTI_CreateGuid()
|
||||
TransRec = ''
|
||||
TransRec<TRANSACTION_QUEUE.TRANSACTION_DTM$> = Datetime()
|
||||
TransRec<TRANSACTION_QUEUE.ACTION$> = 'WRITE_FIELD'
|
||||
TransRec<TRANSACTION_QUEUE.TABLE$> = Table
|
||||
TransRec<TRANSACTION_QUEUE.KEY$> = Key
|
||||
TransRec<TRANSACTION_QUEUE.COLUMN$> = FieldNo
|
||||
TransRec<TRANSACTION_QUEUE.VALUE$> = FieldVal
|
||||
Database_Services('WriteDataRow', 'TRANSACTION_QUEUE', TransKey, TransRec)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service PostWriteRecordTransaction(Table, Key, Record)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (Table EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case (Key EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Key passed into service.'
|
||||
Case (Record EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Record passed into service.'
|
||||
Case Otherwise$
|
||||
TransKey = RTI_CreateGuid()
|
||||
TransRec = ''
|
||||
TransRec<TRANSACTION_QUEUE.TRANSACTION_DTM$> = Datetime()
|
||||
TransRec<TRANSACTION_QUEUE.ACTION$> = 'WRITE_RECORD'
|
||||
TransRec<TRANSACTION_QUEUE.TABLE$> = Table
|
||||
TransRec<TRANSACTION_QUEUE.KEY$> = Key
|
||||
TransRec<TRANSACTION_QUEUE.RECORD$> = SRP_Encode(Record, 'BASE64')
|
||||
Database_Services('WriteDataRow', 'TRANSACTION_QUEUE', TransKey, TransRec)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service PostDeleteRecordTransaction(Table, Key)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (Table EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case (Key EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Key passed into service.'
|
||||
Case Otherwise$
|
||||
TransKey = RTI_CreateGuid()
|
||||
TransRec = ''
|
||||
TransRec<TRANSACTION_QUEUE.TRANSACTION_DTM$> = Datetime()
|
||||
TransRec<TRANSACTION_QUEUE.ACTION$> = 'DELETE_RECORD'
|
||||
TransRec<TRANSACTION_QUEUE.TABLE$> = Table
|
||||
TransRec<TRANSACTION_QUEUE.KEY$> = Key
|
||||
Database_Services('WriteDataRow', 'TRANSACTION_QUEUE', TransKey, TransRec)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ProcessTransactionQueue()
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Transaction'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Transaction Queue Log.csv'
|
||||
Headers = 'Logging DTM':@FM:'Result':@FM:'Action':@FM:'Table':@FM:'Key':@FM:'Base64Record'
|
||||
Headers := @FM:'Column':@FM:'Value'
|
||||
objQueueLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
Select 'TRANSACTION_QUEUE' by 'TRANSACTION_DTM' setting Cursor then
|
||||
EOF = False$
|
||||
Loop
|
||||
LogData = ''
|
||||
DeleteTrans = False$
|
||||
ErrorMsg = ''
|
||||
ReadNext TransId using Cursor By At else EOF = True$
|
||||
Until EOF
|
||||
TransRec = Database_Services('ReadDataRow', 'TRANSACTION_QUEUE', TransId)
|
||||
If Error_Services('NoError') then
|
||||
Action = TransRec<TRANSACTION_QUEUE.ACTION$>
|
||||
Table = TransRec<TRANSACTION_QUEUE.TABLE$>
|
||||
Key = TransRec<TRANSACTION_QUEUE.KEY$>
|
||||
HaveLock = Database_Services('GetKeyIDLock', Table, Key)
|
||||
If HaveLock then
|
||||
Begin Case
|
||||
Case Action EQ 'WRITE_FIELD'
|
||||
FieldNo = TransRec<TRANSACTION_QUEUE.COLUMN$>
|
||||
FieldVal = TransRec<TRANSACTION_QUEUE.VALUE$>
|
||||
LogData<7> = FieldNo
|
||||
LogData<8> = FieldVal
|
||||
Open Table to hTable then
|
||||
WriteV FieldVal on hTable, Key, FieldNo then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling WriteV. '
|
||||
ErrorMsg := 'File error: ':@File_Error
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening ':Table:'.'
|
||||
end
|
||||
Case Action EQ 'WRITE_RECORD'
|
||||
Record = SRP_Decode(TransRec<TRANSACTION_QUEUE.RECORD$>, 'BASE64')
|
||||
LogData<6> = Record
|
||||
Database_Services('WriteDataRow', Table, Key, Record, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Case Action EQ 'DELETE_RECORD'
|
||||
Database_Services('DeleteDataRow', Table, Key, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Case Otherwise$
|
||||
DeleteTrans = True$
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid Action ':Action:'.'
|
||||
End Case
|
||||
Database_Services('ReleaseKeyIDLock', Table, Key)
|
||||
If DeleteTrans then Database_Services('DeleteDataRow', 'TRANSACTION_QUEUE', TransId)
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to get lock on ':Table:' ':Key:'.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<3> = Action
|
||||
LogData<4> = Table
|
||||
LogData<5> = Key
|
||||
If ErrorMsg EQ '' then
|
||||
// Log success
|
||||
LogData<2> = 'Successfully processed transaction ':TransId:'.'
|
||||
end else
|
||||
// Log failure
|
||||
LogData<2> = 'Failed to process transaction ':TransId:'. Error message: ':ErrorMsg
|
||||
end
|
||||
Logging_Services('AppendLog', objQueueLog, LogData, @RM, @FM)
|
||||
Repeat
|
||||
end
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
end
|
||||
|
||||
end service
|
||||
|
Reference in New Issue
Block a user