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) 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,95 +8,97 @@ 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
Copy_Pending_Records_To_Sql() hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, 'Copy_Backlog_Records_To_SQL' then
CurrDtm = Datetime() Copy_Pending_Records_To_Sql()
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 CurrDtm = Datetime()
TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
Open "SQL_BACKLOG" to hTable then Open "SQL_PENDING" to pTable 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 Open "SQL_BACKLOG" to hTable then
Skip = True$ ClearSelect
end 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)]
If Skip EQ False$ then Read Dummy From pTable, Key then
Begin Case Skip = True$
Case ID[-7, 7] EQ "*DELETE" end
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 If Skip EQ False$ then
TcpClientHandle = 0 Begin Case
ServerIP = Environment_Services('GetApplicationRootIP') Case ID[-7, 7] EQ "*DELETE"
Convert '\' to '' in ServerIP ID[-7, 7] = ""
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command) Write CurrDtm to pTable, Key then Delete hTable, Key
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES') Case ID[-6, 6] EQ "*WRITE"
end ID[-6, 6] = ""
end Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
end Write CurrDtm to pTable, Key then Delete hTable, Key
Repeat End Case
end end else
end // This record is already being processed and we don't need to process it multiple times.
Unlock hSysLists, 'Copy_Backlog_Records_To_SQL' else Null Delete hTable, Key else null
end 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')
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 Return

View File

@ -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,98 +7,104 @@ 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()
LastRunDtm = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME')
If LastRunDtm NE '' then
TimeDiff = CurrDtm - LastRunDtm
If TimeDiff GT 0.003472 then
Run = True$
LastRunDtm = CurrDtm
end
end else
Run = True$
LastRunDtm = CurrDtm
end
If Run then // This only needs to be called every once in a while (e.g. 5 minutes ~ 0.003472)
Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm) Run = False$
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') CurrDtm = Datetime()
Lock hSysLists, 'Copy_Pending_Records_To_SQL' then LastRunDtm = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME')
If LastRunDtm NE '' then
TimeDiff = CurrDtm - LastRunDtm
If TimeDiff GT FIVE_MINUTES$ then
Run = True$
LastRunDtm = CurrDtm
end
end else
Run = True$
LastRunDtm = CurrDtm
end
NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES') If Run then
Open "SQL_PENDING" to pTable then Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm)
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, 'Copy_Pending_Records_To_SQL' then
ClearSelect NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES')
Select pTable Open "SQL_PENDING" to pTable then
Done = False$
Loop
ReadNext Key else Done = True$
Command = ''
Until Done
Read Rec from pTable, Key then ClearSelect
TransDtm = Rec<1> Select pTable
ElapSecs = (CurrDtm - TransDtm) * 86400 Done = False$
If ElapSecs LT 1800 then Loop
// Retry recent pending transactions (1800 seconds = 30 minutes) ReadNext Key else Done = True$
Table = Key[1, "*"] Command = ''
Locate Table in NonCriticalTables using @FM setting Dummy then Until Done
ID = Key[Col2() + 1, Len(Key)]
Begin Case
Case ID[-7, 7] EQ "*DELETE"
ID[-7, 7] = ""
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
Case ID[-6, 6] EQ "*WRITE"
ID[-6, 6] = ""
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
End Case
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
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
end else
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
end
end
TcpClientHandle = 0 Read Rec from pTable, Key then
ServerIP = Environment_Services('GetApplicationRootIP') TransDtm = Rec<1>
Convert '\' to '' in ServerIP ElapSecs = (CurrDtm - TransDtm) * SECONDS_PER_DAY$
If ElapSecs LT THIRTY_MINUTES$ then
// Retry recent pending transactions (i.e., those submitted in the last 30 minutes)
Table = Key[1, "*"]
Locate Table in NonCriticalTables using @FM setting Dummy then
ID = Key[Col2() + 1, Len(Key)]
Begin Case
Case ID[-7, 7] EQ "*DELETE"
ID[-7, 7] = ""
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
Case ID[-6, 6] EQ "*WRITE"
ID[-6, 6] = ""
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
End Case
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
Command := 'RUN DELETE_RECORD_FROM_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
end else
Command := 'RUN COPY_RECORD_TO_SQL ':Quote(Table):', ':Quote(ID):', 1, ':Quote(Key)
end
end
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, '20779') then TcpClientHandle = 0
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command) ServerIP = Environment_Services('GetApplicationRootIP')
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES') ServerPort = Environment_Services('GetScrapeServerPort')
end Convert '\' to '' in ServerIP
end else If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
// This transaction most likely won't replicate due to a schema mapping issue or because SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
// the record no longer exists in OI, so remove this transaction from the pending queue. SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
Delete pTable, Key else null end
end
end
Repeat end else
end // This transaction most likely won't replicate due to a schema mapping issue or because
Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null // the record no longer exists in OI, so remove this transaction from the pending queue.
end Delete pTable, Key else null
end end
end
Repeat
end
Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null
end
end
Return Return

View File

@ -22,98 +22,107 @@ 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
// The expected name of the handler Ans = ""
Handler = "COPY_":Table:"_RECORD_TO_SQL" Done = False$
// Make sure table is uppercase
Convert @LOWER_CASE to @UPPER_CASE in Table
// Find the stored procedure that handles this table TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP')
Open "SYSOBJ" to hSysObj then Locate Table in TablesToSkip by "AL" using "," setting ListPos else
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
// Connect to the ODBC Open 'SQL_PENDING' to pTable then
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
ConnectionString = Environment_Services('GetSQLScrapeConnectionString') If pKey NE '' then Lock pTable, pKey else Done = True$
If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
// Read the record and call the handler If Not(Done) then
Open Table to hTable then // The expected name of the handler
Read @RECORD from hTable, Key then Handler = "COPY_":Table:"_RECORD_TO_SQL"
If Key NE "" then
Open "DICT.":Table to @DICT then null // Find the stored procedure that handles this table
@ID = Key Open "SYSOBJ" to hSysObj then
Ans = Function(@Handler(Connection, Key, @RECORD)) Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
If Ans EQ '' then // Connect to the ODBC
If Assigned(pKey) then If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
If pKey NE '' then ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
Open 'SQL_PENDING' to pTable then If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
Delete pTable, pKey else null // Read the record and call the handler
Open Table to hTable then
Read @RECORD from hTable, Key then
If Key NE "" then
Open "DICT.":Table to @DICT then null
@ID = Key
Ans = Function(@Handler(Connection, Key, @RECORD))
If Ans EQ '' then
If Assigned(pKey) then
If pKey NE '' then
Delete pTable, pKey else Null
Unlock pTable, pKey else Null
end
end
end end
end end
end end else
end Ans = 'Unable to read ':Key:' from ':Table:' table.'
end end
end else end
Ans = 'Unable to read ':Key:' from ':Table:' table.' end else
end Ans = 'Unable to open connection to SQL server. SQL connection error: '
end Ans := SRP_Com(Connection, "ERROR")
end else end
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR") SRP_Com(Connection, "CALL", "Close")
end SRP_Com(Connection, "RELEASE")
SRP_Com(Connection, "CALL", "Close") end else
SRP_Com(Connection, "RELEASE") Ans = "Unable to create ADO connection."
end else end
Ans = "Unable to create ADO connection."
end
end
If LogError and Len(Ans) then
Open "SQL_ERROR" to hSqlError then
ErrorKey = OConv(Date(), "D4-J")
Timestamp = OConv(Datetime(), 'DT')
Read Errors from hSqlError, ErrorKey then
Errors := @FM:Table:@VM:Key:@VM:Timestamp:@VM:Ans
Write Errors to hSqlError, ErrorKey
end else
Errors = Table:@VM:Key:@VM:Timestamp:@VM:Ans
Write Errors to hSqlError, ErrorKey
end
end
end
If Assigned(pKey) then
If (pKey NE '') then
// Always log the result
Open 'SQL_LOG' to hLog then
If Ans EQ '' then
Result = 'PROCESSED'
end else
Result = Ans
end end
CurrDate = Date()
Read Log from hLog, CurrDate then If LogError and Len(Ans) then
Log := @FM:pKey:@VM:Result Open "SQL_ERROR" to hSqlError then
end else ErrorKey = OConv(Date(), "D4-J")
Log = pKey:@VM:Result Timestamp = OConv(Datetime(), 'DT')
Read Errors from hSqlError, ErrorKey then
Errors := @FM:Table:@VM:Key:@VM:Timestamp:@VM:Ans
Write Errors to hSqlError, ErrorKey
end else
Errors = Table:@VM:Key:@VM:Timestamp:@VM:Ans
Write Errors to hSqlError, ErrorKey
end
end
end
If Assigned(pKey) then
If (pKey NE '') then
// Always log the result
Open 'SQL_LOG' to hLog then
If Ans EQ '' then
Result = 'PROCESSED'
end else
Result = Ans
end
CurrDate = Date()
Read Log from hLog, CurrDate then
Log := @FM:pKey:@VM:Result
end else
Log = pKey:@VM:Result
end
Write Log to hLog, CurrDate
end
end
end end
Write Log to hLog, CurrDate
end end
end end
end end
end end
end
Return Ans Return Ans

View File

@ -18,81 +18,91 @@ 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
Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
// Connect to the ODBC/ADO
If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
// Connect to the database via ODBC
ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
// Read the record and call the handler
If Key NE "" then
Ans = Function(@Handler(Connection, Key))
If Ans EQ '' then
If Assigned(pKey) then
Open 'SQL_PENDING' to pTable then
Delete pTable, pKey else null
end
end
end
end
end else
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
end
SRP_Com(Connection, "CALL", "Close")
SRP_Com(Connection, "RELEASE")
end else
Ans = "Unable to create ADO connection."
end
end
end
If LogError AND Len(Ans) then If pKey NE '' then Lock pTable, pKey else Done = True$
Open "SQL_ERROR" to hSqlError then
Read Errors from hSqlError, Date() then
Errors := @FM:Table:@VM:Key:@VM:Ans
Write Errors to hSqlError, Date()
end else
Errors = Table:@VM:Key:@VM:Ans
Write Errors to hSqlError, Date()
end
end
end
// Always log the result If Not(Done) then
// The expected name of the handler
Handler = "DELETE_":Table:"_RECORD_FROM_SQL"
If Assigned(pKey) then // Find the stored procedure that handles this table
Open 'SQL_LOG' to hLog then Open "SYSOBJ" to hSysObj then
If Ans EQ '' then Read ObjCode from hSysObj, "$":Handler:"*LSL2" then
Result = 'PROCESSED' // Connect to the ODBC/ADO
end else If SRP_Com(Connection, "CREATE", "ADODB.Connection") then
Result = Ans // Connect to the database via ODBC
end ConnectionString = Environment_Services('GetSQLScrapeConnectionString')
CurrDate = Date() If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then
Read Log from hLog, CurrDate then // Read the record and call the handler
Log := @FM:pKey:@VM:Result If Key NE "" then
end else Ans = Function(@Handler(Connection, Key))
Log = pKey:@VM:Result If Ans EQ '' then
end If Assigned(pKey) then
Write Log to hLog, CurrDate Delete pTable, pKey else Null
end Unlock pTable, pKey else Null
end end
end
end
end else
Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR")
end
SRP_Com(Connection, "CALL", "Close")
SRP_Com(Connection, "RELEASE")
end else
Ans = "Unable to create ADO connection."
end
end
end
If LogError AND Len(Ans) then
Open "SQL_ERROR" to hSqlError then
Read Errors from hSqlError, Date() then
Errors := @FM:Table:@VM:Key:@VM:Ans
Write Errors to hSqlError, Date()
end else
Errors = Table:@VM:Key:@VM:Ans
Write Errors to hSqlError, Date()
end
end
end
// Always log the result
If Assigned(pKey) then
If (pKey NE '') then
Open 'SQL_LOG' to hLog then
If Ans EQ '' then
Result = 'PROCESSED'
end else
Result = Ans
end
CurrDate = Date()
Read Log from hLog, CurrDate then
Log := @FM:pKey:@VM:Result
end else
Log = pKey:@VM:Result
end
Write Log to hLog, CurrDate
end
end
end
end
end
Return Ans Return Ans

View File

@ -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
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////