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:
@ -1,6 +1,4 @@
|
|||||||
Compile subroutine Copy_Backlog_Records_To_SQL(VOID)
|
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
|
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
|
sure the identified record is copied to SQL. Then the backlog record is
|
||||||
@ -10,14 +8,16 @@ Compile subroutine Copy_Backlog_Records_To_SQL(VOID)
|
|||||||
-------
|
-------
|
||||||
08/10/2010 KRF Original Programmer
|
08/10/2010 KRF Original Programmer
|
||||||
\*****************************************************************************/
|
\*****************************************************************************/
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
$Insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
|
|
||||||
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Copy_Pending_Records_To_Sql
|
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
|
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Environment_Services
|
||||||
|
|
||||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
Main:
|
||||||
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
|
|
||||||
|
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||||
|
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
|
||||||
|
|
||||||
Copy_Pending_Records_To_Sql()
|
Copy_Pending_Records_To_Sql()
|
||||||
|
|
||||||
@ -86,8 +86,9 @@ Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
|
|||||||
If Skip EQ False$ then
|
If Skip EQ False$ then
|
||||||
TcpClientHandle = 0
|
TcpClientHandle = 0
|
||||||
ServerIP = Environment_Services('GetApplicationRootIP')
|
ServerIP = Environment_Services('GetApplicationRootIP')
|
||||||
|
ServerPort = Environment_Services('GetScrapeServerPort')
|
||||||
Convert '\' to '' in ServerIP
|
Convert '\' to '' in ServerIP
|
||||||
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then
|
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
|
||||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||||
end
|
end
|
||||||
@ -97,8 +98,7 @@ Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null
|
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null
|
||||||
end
|
end
|
||||||
|
|
||||||
Return
|
Return
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
Compile subroutine Copy_Pending_Records_To_SQL(VOID)
|
Compile subroutine Copy_Pending_Records_To_SQL(VOID)
|
||||||
#pragma precomp SRP_PreCompiler
|
|
||||||
|
|
||||||
/*****************************************************************************\
|
/*****************************************************************************\
|
||||||
This is a utility function. For each record found in SQL_PENDING, it makes
|
This is a utility function. For each record found in SQL_PENDING, it makes
|
||||||
sure the identified record is copied to SQL.
|
sure the identified record is copied to SQL.
|
||||||
@ -9,28 +7,34 @@ Compile subroutine Copy_Pending_Records_To_SQL(VOID)
|
|||||||
-------
|
-------
|
||||||
02/06/2023 DJS Adapted from Copy_Backlog_Records_To_SQL
|
02/06/2023 DJS Adapted from Copy_Backlog_Records_To_SQL
|
||||||
\*****************************************************************************/
|
\*****************************************************************************/
|
||||||
|
#pragma precomp SRP_PreCompiler
|
||||||
$Insert APP_INSERTS
|
$Insert APP_INSERTS
|
||||||
|
|
||||||
|
EQU FIVE_MINUTES$ to 0.003472
|
||||||
|
EQU SECONDS_PER_DAY$ to 86400
|
||||||
|
EQU THIRTY_MINUTES$ to 1800
|
||||||
|
|
||||||
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Database_Services
|
Declare subroutine Copy_Record_To_SQL, Delete_Record_From_SQL, SRP_TcpClient, Database_Services
|
||||||
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Database_Services, Environment_Services
|
Declare function GetTickCount, Database_Services, SRP_TcpClient, Datetime, Database_Services, Environment_Services
|
||||||
|
|
||||||
// This only needs to be called every once in a while (e.g. 5 minutes ~ 0.003472)
|
Main:
|
||||||
Run = False$
|
|
||||||
CurrDtm = Datetime()
|
// This only needs to be called every once in a while (e.g. 5 minutes ~ 0.003472)
|
||||||
LastRunDtm = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME')
|
Run = False$
|
||||||
If LastRunDtm NE '' then
|
CurrDtm = Datetime()
|
||||||
|
LastRunDtm = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME')
|
||||||
|
If LastRunDtm NE '' then
|
||||||
TimeDiff = CurrDtm - LastRunDtm
|
TimeDiff = CurrDtm - LastRunDtm
|
||||||
If TimeDiff GT 0.003472 then
|
If TimeDiff GT FIVE_MINUTES$ then
|
||||||
Run = True$
|
Run = True$
|
||||||
LastRunDtm = CurrDtm
|
LastRunDtm = CurrDtm
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Run = True$
|
Run = True$
|
||||||
LastRunDtm = CurrDtm
|
LastRunDtm = CurrDtm
|
||||||
end
|
end
|
||||||
|
|
||||||
If Run then
|
If Run then
|
||||||
Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm)
|
Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm)
|
||||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||||
Lock hSysLists, 'Copy_Pending_Records_To_SQL' then
|
Lock hSysLists, 'Copy_Pending_Records_To_SQL' then
|
||||||
@ -48,9 +52,9 @@ If Run then
|
|||||||
|
|
||||||
Read Rec from pTable, Key then
|
Read Rec from pTable, Key then
|
||||||
TransDtm = Rec<1>
|
TransDtm = Rec<1>
|
||||||
ElapSecs = (CurrDtm - TransDtm) * 86400
|
ElapSecs = (CurrDtm - TransDtm) * SECONDS_PER_DAY$
|
||||||
If ElapSecs LT 1800 then
|
If ElapSecs LT THIRTY_MINUTES$ then
|
||||||
// Retry recent pending transactions (1800 seconds = 30 minutes)
|
// Retry recent pending transactions (i.e., those submitted in the last 30 minutes)
|
||||||
Table = Key[1, "*"]
|
Table = Key[1, "*"]
|
||||||
Locate Table in NonCriticalTables using @FM setting Dummy then
|
Locate Table in NonCriticalTables using @FM setting Dummy then
|
||||||
ID = Key[Col2() + 1, Len(Key)]
|
ID = Key[Col2() + 1, Len(Key)]
|
||||||
@ -81,9 +85,10 @@ If Run then
|
|||||||
|
|
||||||
TcpClientHandle = 0
|
TcpClientHandle = 0
|
||||||
ServerIP = Environment_Services('GetApplicationRootIP')
|
ServerIP = Environment_Services('GetApplicationRootIP')
|
||||||
|
ServerPort = Environment_Services('GetScrapeServerPort')
|
||||||
Convert '\' to '' in ServerIP
|
Convert '\' to '' in ServerIP
|
||||||
|
|
||||||
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then
|
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
|
||||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||||
end
|
end
|
||||||
@ -99,8 +104,7 @@ If Run then
|
|||||||
end
|
end
|
||||||
Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null
|
Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Return
|
Return
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,20 +22,29 @@ Compile function Copy_Record_To_SQL(Table, Key, LogError, pKey)
|
|||||||
09/23/2010 KRF Added logic to set @DICT, @ID, and @RECORD so handlers
|
09/23/2010 KRF Added logic to set @DICT, @ID, and @RECORD so handlers
|
||||||
can use symbolics
|
can use symbolics
|
||||||
\*****************************************************************************/
|
\*****************************************************************************/
|
||||||
$insert Microsoft_Ado_Equates
|
$Insert APP_INSERTS
|
||||||
|
$Insert MICROSOFT_ADO_EQUATES
|
||||||
If Assigned(LogError) else LogError = 0
|
|
||||||
|
|
||||||
Declare subroutine SRP_Com, Sql_Services
|
Declare subroutine SRP_Com, Sql_Services
|
||||||
Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services
|
Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services, Unassigned
|
||||||
Ans = ""
|
|
||||||
|
|
||||||
// Make sure table is uppercase
|
Main:
|
||||||
Convert @LOWER_CASE to @UPPER_CASE in Table
|
|
||||||
|
|
||||||
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
|
If Unassigned(LogError) then LogError = False$
|
||||||
Locate Table in TablesToSkip by "AL" using "," setting ListPos else
|
|
||||||
|
|
||||||
|
Ans = ""
|
||||||
|
Done = False$
|
||||||
|
// Make sure table is uppercase
|
||||||
|
Convert @LOWER_CASE to @UPPER_CASE in Table
|
||||||
|
|
||||||
|
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
|
||||||
|
Locate Table in TablesToSkip by "AL" using "," setting ListPos else
|
||||||
|
|
||||||
|
Open 'SQL_PENDING' to pTable then
|
||||||
|
|
||||||
|
If pKey NE '' then Lock pTable, pKey else Done = True$
|
||||||
|
|
||||||
|
If Not(Done) then
|
||||||
// The expected name of the handler
|
// The expected name of the handler
|
||||||
Handler = "COPY_":Table:"_RECORD_TO_SQL"
|
Handler = "COPY_":Table:"_RECORD_TO_SQL"
|
||||||
|
|
||||||
@ -56,9 +65,8 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
|
|||||||
If Ans EQ '' then
|
If Ans EQ '' then
|
||||||
If Assigned(pKey) then
|
If Assigned(pKey) then
|
||||||
If pKey NE '' then
|
If pKey NE '' then
|
||||||
Open 'SQL_PENDING' to pTable then
|
Delete pTable, pKey else Null
|
||||||
Delete pTable, pKey else null
|
Unlock pTable, pKey else Null
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -68,7 +76,8 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end else
|
end else
|
||||||
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
|
Ans = 'Unable to open connection to SQL server. SQL connection error: '
|
||||||
|
Ans := SRP_Com(Connection, "ERROR")
|
||||||
end
|
end
|
||||||
SRP_Com(Connection, "CALL", "Close")
|
SRP_Com(Connection, "CALL", "Close")
|
||||||
SRP_Com(Connection, "RELEASE")
|
SRP_Com(Connection, "RELEASE")
|
||||||
@ -111,9 +120,9 @@ Locate Table in TablesToSkip by "AL" using "," setting ListPos else
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Return Ans
|
Return Ans
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,23 +18,30 @@ Compile function Delete_Record_From_SQL(Table, Key, LogError, pKey)
|
|||||||
-------
|
-------
|
||||||
09/15/2010 KRF Original Programmer
|
09/15/2010 KRF Original Programmer
|
||||||
\*****************************************************************************/
|
\*****************************************************************************/
|
||||||
|
$Insert APP_INSERTS
|
||||||
$insert Microsoft_Ado_Equates
|
$insert MICROSOFT_ADO_EQUATES
|
||||||
|
|
||||||
If Assigned(LogError) else LogError = 0
|
|
||||||
|
|
||||||
Declare subroutine Sql_Services, SRP_COM
|
Declare subroutine Sql_Services, SRP_COM
|
||||||
Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services
|
Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services, Unassigned
|
||||||
Ans = ""
|
|
||||||
|
|
||||||
// Make sure table is uppercase
|
Main:
|
||||||
Convert @LOWER_CASE to @UPPER_CASE in Table
|
|
||||||
|
|
||||||
// The expected name of the handler
|
If Unassigned(LogError) else LogError = False$
|
||||||
Handler = "DELETE_":Table:"_RECORD_FROM_SQL"
|
Ans = ""
|
||||||
|
Done = False$
|
||||||
|
// Make sure table is uppercase
|
||||||
|
Convert @LOWER_CASE to @UPPER_CASE in Table
|
||||||
|
|
||||||
// Find the stored procedure that handles this table
|
Open 'SQL_PENDING' to pTable then
|
||||||
Open "SYSOBJ" to hSysObj then
|
|
||||||
|
If pKey NE '' then Lock pTable, pKey else Done = True$
|
||||||
|
|
||||||
|
If Not(Done) then
|
||||||
|
// The expected name of the handler
|
||||||
|
Handler = "DELETE_":Table:"_RECORD_FROM_SQL"
|
||||||
|
|
||||||
|
// Find the stored procedure that handles this table
|
||||||
|
Open "SYSOBJ" to hSysObj then
|
||||||
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
|
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
|
||||||
// Connect to the ODBC/ADO
|
// Connect to the ODBC/ADO
|
||||||
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
|
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
|
||||||
@ -46,9 +53,8 @@ Open "SYSOBJ" to hSysObj then
|
|||||||
Ans = Function(@Handler(Connection, Key))
|
Ans = Function(@Handler(Connection, Key))
|
||||||
If Ans EQ '' then
|
If Ans EQ '' then
|
||||||
If Assigned(pKey) then
|
If Assigned(pKey) then
|
||||||
Open 'SQL_PENDING' to pTable then
|
Delete pTable, pKey else Null
|
||||||
Delete pTable, pKey else null
|
Unlock pTable, pKey else Null
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -61,9 +67,9 @@ Open "SYSOBJ" to hSysObj then
|
|||||||
Ans = "Unable to create ADO connection."
|
Ans = "Unable to create ADO connection."
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
If LogError AND Len(Ans) then
|
If LogError AND Len(Ans) then
|
||||||
Open "SQL_ERROR" to hSqlError then
|
Open "SQL_ERROR" to hSqlError then
|
||||||
Read Errors from hSqlError, Date() then
|
Read Errors from hSqlError, Date() then
|
||||||
Errors := @FM:Table:@VM:Key:@VM:Ans
|
Errors := @FM:Table:@VM:Key:@VM:Ans
|
||||||
@ -73,11 +79,12 @@ If LogError AND Len(Ans) then
|
|||||||
Write Errors to hSqlError, Date()
|
Write Errors to hSqlError, Date()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
// Always log the result
|
// Always log the result
|
||||||
|
|
||||||
If Assigned(pKey) then
|
If Assigned(pKey) then
|
||||||
|
If (pKey NE '') then
|
||||||
Open 'SQL_LOG' to hLog then
|
Open 'SQL_LOG' to hLog then
|
||||||
If Ans EQ '' then
|
If Ans EQ '' then
|
||||||
Result = 'PROCESSED'
|
Result = 'PROCESSED'
|
||||||
@ -92,7 +99,10 @@ If Assigned(pKey) then
|
|||||||
end
|
end
|
||||||
Write Log to hLog, CurrDate
|
Write Log to hLog, CurrDate
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Return Ans
|
Return Ans
|
||||||
|
|
||||||
|
@ -565,8 +565,19 @@ Service GetServiceManagerPort()
|
|||||||
|
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service GetScrapeServerPort()
|
||||||
|
|
||||||
|
FilePath = Drive():'\SRPEngineServerScrape.ini'
|
||||||
|
OSRead IniFile from FilePath then
|
||||||
|
CharIndex = Index(IniFile, 'Port', 1)
|
||||||
|
Line = IniFile[CharIndex, 'F':CRLF$]
|
||||||
|
Response = Trim(Line[-1, 'B='])
|
||||||
|
end
|
||||||
|
|
||||||
|
end service
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Internal GoSubs
|
// Internal GoSubs
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user