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. 
	
	History
	-------
	02/06/2023    DJS    Adapted from Copy_Backlog_Records_To_SQL
\*****************************************************************************/

$Insert APP_INSERTS

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

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

        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

            Repeat
        end
        Unlock hSysLists, 'Copy_Pending_Records_To_SQL' else Null
    end
end

Return


