diff --git a/LSL2/STPROC/COPY_BACKLOG_RECORDS_TO_SQL.txt b/LSL2/STPROC/COPY_BACKLOG_RECORDS_TO_SQL.txt index 2a000d8..7bd0234 100644 --- a/LSL2/STPROC/COPY_BACKLOG_RECORDS_TO_SQL.txt +++ b/LSL2/STPROC/COPY_BACKLOG_RECORDS_TO_SQL.txt @@ -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 - diff --git a/LSL2/STPROC/COPY_PENDING_RECORDS_TO_SQL.txt b/LSL2/STPROC/COPY_PENDING_RECORDS_TO_SQL.txt index 7d8f751..9ed6ad6 100644 --- a/LSL2/STPROC/COPY_PENDING_RECORDS_TO_SQL.txt +++ b/LSL2/STPROC/COPY_PENDING_RECORDS_TO_SQL.txt @@ -1,6 +1,4 @@ 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 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 \*****************************************************************************/ - +#pragma precomp SRP_PreCompiler $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 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) -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 +Main: -If Run then - Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm) - hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') - Lock hSysLists, 'Copy_Pending_Records_To_SQL' then + // This only needs to be called every once in a while (e.g. 5 minutes ~ 0.003472) + Run = False$ + CurrDtm = Datetime() + 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') - Open "SQL_PENDING" to pTable then - - ClearSelect - Select pTable - Done = False$ - Loop - ReadNext Key else Done = True$ - Command = '' - Until Done - - Read Rec from pTable, Key then - TransDtm = Rec<1> - ElapSecs = (CurrDtm - TransDtm) * 86400 - If ElapSecs LT 1800 then - // Retry recent pending transactions (1800 seconds = 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 - - 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 else - // This transaction most likely won't replicate due to a schema mapping issue or because - // the record no longer exists in OI, so remove this transaction from the pending queue. - Delete pTable, Key else null - end - end + If Run then + Database_Services('WriteDataRow', 'APP_INFO', 'SQL_PENDING_LAST_RUNTIME', LastRunDtm) + hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') + Lock hSysLists, 'Copy_Pending_Records_To_SQL' then - Repeat - end - Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null - end -end + NonCriticalTables = Database_Services('ReadDataRow', 'APP_INFO', 'NONCRITICAL_SQL_TABLES') + Open "SQL_PENDING" to pTable then + + ClearSelect + Select pTable + Done = False$ + Loop + ReadNext Key else Done = True$ + Command = '' + Until Done + + Read Rec from pTable, Key then + TransDtm = Rec<1> + 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 + + 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 else + // This transaction most likely won't replicate due to a schema mapping issue or because + // the record no longer exists in OI, so remove this transaction from the pending queue. + Delete pTable, Key else null + end + end + + Repeat + end + Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null + end + end Return - diff --git a/LSL2/STPROC/COPY_RECORD_TO_SQL.txt b/LSL2/STPROC/COPY_RECORD_TO_SQL.txt index 468e47a..e0ca3fe 100644 --- a/LSL2/STPROC/COPY_RECORD_TO_SQL.txt +++ b/LSL2/STPROC/COPY_RECORD_TO_SQL.txt @@ -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 can use symbolics \*****************************************************************************/ -$insert Microsoft_Ado_Equates - -If Assigned(LogError) else LogError = 0 +$Insert APP_INSERTS +$Insert MICROSOFT_ADO_EQUATES Declare subroutine SRP_Com, Sql_Services -Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services -Ans = "" +Declare function SRP_Com, Environment_Services, Datetime, Sql_Services, Error_Services, Database_Services, Unassigned -// Make sure table is uppercase -Convert @LOWER_CASE to @UPPER_CASE in Table +Main: + + If Unassigned(LogError) then LogError = False$ -TablesToSkip = Database_Services('ReadDataRow', 'APP_INFO', 'SQL_TABLES_TO_SKIP') -Locate Table in TablesToSkip by "AL" using "," setting ListPos else - - // The expected name of the handler - Handler = "COPY_":Table:"_RECORD_TO_SQL" - - // Find the stored procedure that handles this table - Open "SYSOBJ" to hSysObj then - Read ObjCode from hSysObj, "$":Handler:"*LSL2" then - // Connect to the ODBC - If SRP_Com(Connection, "CREATE", "ADODB.Connection") then - ConnectionString = Environment_Services('GetSQLScrapeConnectionString') - If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then - // 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 - Open 'SQL_PENDING' to pTable then - Delete pTable, pKey else null + 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 + Handler = "COPY_":Table:"_RECORD_TO_SQL" + + // Find the stored procedure that handles this table + Open "SYSOBJ" to hSysObj then + Read ObjCode from hSysObj, "$":Handler:"*LSL2" then + // Connect to the ODBC + If SRP_Com(Connection, "CREATE", "ADODB.Connection") then + ConnectionString = Environment_Services('GetSQLScrapeConnectionString') + If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then + // 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 - Ans = 'Unable to read ':Key:' from ':Table:' table.' - 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 - - 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 else + Ans = 'Unable to read ':Key:' from ':Table:' table.' + end + end + end else + Ans = 'Unable to open connection to SQL server. SQL connection error: ' + Ans := SRP_Com(Connection, "ERROR") + end + SRP_Com(Connection, "CALL", "Close") + SRP_Com(Connection, "RELEASE") + end else + Ans = "Unable to create ADO connection." + end end - CurrDate = Date() - Read Log from hLog, CurrDate then - Log := @FM:pKey:@VM:Result - end else - Log = pKey:@VM:Result + + 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 + 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 - Write Log to hLog, CurrDate end end - end - end -end + end + end Return Ans - - diff --git a/LSL2/STPROC/DELETE_RECORD_FROM_SQL.txt b/LSL2/STPROC/DELETE_RECORD_FROM_SQL.txt index 3480715..e04fdcc 100644 --- a/LSL2/STPROC/DELETE_RECORD_FROM_SQL.txt +++ b/LSL2/STPROC/DELETE_RECORD_FROM_SQL.txt @@ -18,81 +18,91 @@ Compile function Delete_Record_From_SQL(Table, Key, LogError, pKey) ------- 09/15/2010 KRF Original Programmer \*****************************************************************************/ - -$insert Microsoft_Ado_Equates - -If Assigned(LogError) else LogError = 0 +$Insert APP_INSERTS +$insert MICROSOFT_ADO_EQUATES Declare subroutine Sql_Services, SRP_COM -Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services -Ans = "" +Declare function Sql_Services, Error_Services, SRP_COM, Environment_Services, Unassigned -// Make sure table is uppercase -Convert @LOWER_CASE to @UPPER_CASE in Table +Main: + + If Unassigned(LogError) else LogError = False$ + Ans = "" + Done = False$ + // Make sure table is uppercase + Convert @LOWER_CASE to @UPPER_CASE in Table + + Open 'SQL_PENDING' to pTable then -// The expected name of the handler -Handler = "DELETE_":Table:"_RECORD_FROM_SQL" + 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 - // 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 + // Find the stored procedure that handles this table + 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 + Delete pTable, pKey else Null + Unlock pTable, pKey else Null + 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 + 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 - 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 + // 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 diff --git a/LSL2/STPROC/ENVIRONMENT_SERVICES.txt b/LSL2/STPROC/ENVIRONMENT_SERVICES.txt index 10a01f7..1839a91 100644 --- a/LSL2/STPROC/ENVIRONMENT_SERVICES.txt +++ b/LSL2/STPROC/ENVIRONMENT_SERVICES.txt @@ -565,8 +565,19 @@ Service GetServiceManagerPort() 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 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -