Modified copy and delete record to sql routines to lock the queue record before attempting to prevent long running copy or delete calls form being processed more than once and wasting resources.

This commit is contained in:
Infineon\StieberD
2025-07-03 14:03:39 -07:00
parent 5ca3778719
commit 98ac420462
5 changed files with 354 additions and 320 deletions

View File

@ -1,6 +1,4 @@
Compile subroutine Copy_Backlog_Records_To_SQL(VOID)
#pragma precomp SRP_PreCompiler
/*****************************************************************************\
This is a utility function. For each record found in SQL_BACKLOG, it makes
sure the identified record is copied to SQL. Then the backlog record is
@ -10,95 +8,97 @@ Compile subroutine Copy_Backlog_Records_To_SQL(VOID)
-------
08/10/2010 KRF Original Programmer
\*****************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert APP_INSERTS
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Copy_Pending_Records_To_Sql
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Environment_Services
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
Main:
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
Copy_Pending_Records_To_Sql()
Copy_Pending_Records_To_Sql()
CurrDtm = Datetime()
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
Open "SQL_PENDING" to pTable then
Open "SQL_BACKLOG" to hTable then
ClearSelect
Select hTable
Done = 0
Loop
ReadNext Key else Done = 1
Command = ''
Skip = False$
Until Done
Table = Key[1, "*"]
Locate Table in TablesToSkip by "AL" using "," setting ListPos then
Delete hTable, Key else null
end else
Locate Table in NonCriticalTables using @FM setting Dummy then
ID = Key[Col2() + 1, Len(Key)]
Read Dummy From pTable, Key then
Skip = True$
end
If Skip EQ False$ then
Begin Case
Case ID[-7, 7] EQ "*DELETE"
ID[-7, 7] = ""
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
Write CurrDtm to pTable, Key then Delete hTable, Key
Case ID[-6, 6] EQ "*WRITE"
ID[-6, 6] = ""
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
Write CurrDtm to pTable, Key then Delete hTable, Key
End Case
end else
// This record is already being processed and we don't need to process it multiple times.
Delete hTable, Key else null
end
end else
TempKey = Key
TempKey[1, Len(Table) + 1] = ''
TransTime = TempKey[-1, 'B*']
TempKey[-1, Neg(Len(TransTime) + 1)] = ''
TransDate = TempKey[-1, 'B*']
TempKey[-1, Neg(Len(TransDate) + 1)] = ''
Process = TempKey[-1, 'B*']
TempKey[-1, Neg(Len(Process) + 1)] = ''
ID = TempKey
If Process EQ 'DELETE' then
pKey = Key
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
Write CurrDtm to pTable, pKey then Delete hTable, Key
end else
pKey = Key
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
Write CurrDtm to pTable, pKey then Delete hTable, Key
end
end
CurrDtm = Datetime()
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
Open "SQL_PENDING" to pTable then
Open "SQL_BACKLOG" to hTable then
ClearSelect
Select hTable
Done = 0
Loop
ReadNext Key else Done = 1
Command = ''
Skip = False$
Until Done
Table = Key[1, "*"]
Locate Table in TablesToSkip by "AL" using "," setting ListPos then
Delete hTable, Key else null
end else
Locate Table in NonCriticalTables using @FM setting Dummy then
ID = Key[Col2() + 1, Len(Key)]
Read Dummy From pTable, Key then
Skip = True$
end
If Skip EQ False$ then
Begin Case
Case ID[-7, 7] EQ "*DELETE"
ID[-7, 7] = ""
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
Write CurrDtm to pTable, Key then Delete hTable, Key
Case ID[-6, 6] EQ "*WRITE"
ID[-6, 6] = ""
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
Write CurrDtm to pTable, Key then Delete hTable, Key
End Case
end else
// This record is already being processed and we don't need to process it multiple times.
Delete hTable, Key else null
end
end else
TempKey = Key
TempKey[1, Len(Table) + 1] = ''
TransTime = TempKey[-1, 'B*']
TempKey[-1, Neg(Len(TransTime) + 1)] = ''
TransDate = TempKey[-1, 'B*']
TempKey[-1, Neg(Len(TransDate) + 1)] = ''
Process = TempKey[-1, 'B*']
TempKey[-1, Neg(Len(Process) + 1)] = ''
ID = TempKey
If Process EQ 'DELETE' then
pKey = Key
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
Write CurrDtm to pTable, pKey then Delete hTable, Key
end else
pKey = Key
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(pKey)
Write CurrDtm to pTable, pKey then Delete hTable, Key
end
end
If Skip EQ False$ then
TcpClientHandle = 0
ServerIP = Environment_Services('GetApplicationRootIP')
Convert '\' to '' in ServerIP
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
end
end
end
Repeat
end
end
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null
end
If Skip EQ False$ then
TcpClientHandle = 0
ServerIP = Environment_Services('GetApplicationRootIP')
ServerPort = Environment_Services('GetScrapeServerPort')
Convert '\' to '' in ServerIP
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
end
end
end
Repeat
end
end
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null
end
Return