@@ -763,6 +763,122 @@ func (c *ClickHouseConnector) GetTraces(qf QueryFilter) (traces []common.Trace,
763763 return traces , nil
764764}
765765
766+ func (c * ClickHouseConnector ) GetLastReorgCheckedBlockNumber (chainId * big.Int ) (* big.Int , error ) {
767+ query := fmt .Sprintf ("SELECT cursor_value FROM %s.cursors FINAL WHERE cursor_type = 'reorg'" , c .cfg .Database )
768+ if chainId .Sign () > 0 {
769+ query += fmt .Sprintf (" AND chain_id = %s" , chainId .String ())
770+ }
771+ var blockNumberString string
772+ err := c .conn .QueryRow (context .Background (), query ).Scan (& blockNumberString )
773+ if err != nil {
774+ return nil , err
775+ }
776+ blockNumber , ok := new (big.Int ).SetString (blockNumberString , 10 )
777+ if ! ok {
778+ return nil , fmt .Errorf ("failed to parse block number: %s" , blockNumberString )
779+ }
780+ return blockNumber , nil
781+ }
782+
783+ func (c * ClickHouseConnector ) SetLastReorgCheckedBlockNumber (chainId * big.Int , blockNumber * big.Int ) error {
784+ query := fmt .Sprintf ("INSERT INTO %s.cursors (chain_id, cursor_type, cursor_value) VALUES (%s, 'reorg', '%s')" , c .cfg .Database , chainId , blockNumber .String ())
785+ err := c .conn .Exec (context .Background (), query )
786+ return err
787+ }
788+
789+ func (c * ClickHouseConnector ) LookbackBlockHeaders (chainId * big.Int , limit int , lookbackStart * big.Int ) (blockHeaders []common.BlockHeader , err error ) {
790+ query := fmt .Sprintf ("SELECT number, hash, parent_hash FROM %s.blocks WHERE chain_id = %s AND number <= %s AND is_deleted = 0 ORDER BY number DESC" , c .cfg .Database , chainId .String (), lookbackStart .String ())
791+ if chainId .Sign () > 0 {
792+ query += fmt .Sprintf (" AND chain_id = %s" , chainId .String ())
793+ }
794+ query += getLimitClause (limit )
795+
796+ rows , err := c .conn .Query (context .Background (), query )
797+ if err != nil {
798+ return nil , err
799+ }
800+ defer rows .Close ()
801+
802+ for rows .Next () {
803+ var blockHeader common.BlockHeader
804+ err := rows .Scan (& blockHeader .Number , & blockHeader .Hash , & blockHeader .ParentHash )
805+ if err != nil {
806+ return nil , err
807+ }
808+ blockHeaders = append (blockHeaders , blockHeader )
809+ }
810+ return blockHeaders , nil
811+ }
812+
813+ func (c * ClickHouseConnector ) DeleteBlockData (chainId * big.Int , blockNumbers []* big.Int ) error {
814+ var saveErr error
815+ var saveErrMutex sync.Mutex
816+ var wg sync.WaitGroup
817+ wg .Add (4 )
818+
819+ go func () {
820+ defer wg .Done ()
821+ if err := c .deleteBatch (chainId , blockNumbers , "blocks" , "chain_id, number, is_deleted" ); err != nil {
822+ saveErrMutex .Lock ()
823+ saveErr = fmt .Errorf ("error deleting blocks: %v" , err )
824+ saveErrMutex .Unlock ()
825+ }
826+ }()
827+
828+ go func () {
829+ defer wg .Done ()
830+ if err := c .deleteBatch (chainId , blockNumbers , "logs" , "chain_id, block_number, is_deleted" ); err != nil {
831+ saveErrMutex .Lock ()
832+ saveErr = fmt .Errorf ("error deleting logs: %v" , err )
833+ saveErrMutex .Unlock ()
834+ }
835+ }()
836+
837+ go func () {
838+ defer wg .Done ()
839+ if err := c .deleteBatch (chainId , blockNumbers , "transactions" , "chain_id, block_number, is_deleted" ); err != nil {
840+ saveErrMutex .Lock ()
841+ saveErr = fmt .Errorf ("error deleting transactions: %v" , err )
842+ saveErrMutex .Unlock ()
843+ }
844+ }()
845+
846+ go func () {
847+ defer wg .Done ()
848+ if err := c .deleteBatch (chainId , blockNumbers , "traces" , "chain_id, block_number, is_deleted" ); err != nil {
849+ saveErrMutex .Lock ()
850+ saveErr = fmt .Errorf ("error deleting traces: %v" , err )
851+ saveErrMutex .Unlock ()
852+ }
853+ }()
854+
855+ wg .Wait ()
856+
857+ if saveErr != nil {
858+ return saveErr
859+ }
860+ return nil
861+ }
862+
863+ func (c * ClickHouseConnector ) deleteBatch (chainId * big.Int , blockNumbers []* big.Int , table string , columns string ) error {
864+ query := fmt .Sprintf ("INSERT INTO %s.%s (%s)" , c .cfg .Database , table , columns )
865+ batch , err := c .conn .PrepareBatch (context .Background (), query )
866+ if err != nil {
867+ return err
868+ }
869+ for _ , blockNumber := range blockNumbers {
870+ err = batch .Append (
871+ chainId ,
872+ blockNumber ,
873+ 1 ,
874+ )
875+ if err != nil {
876+ return err
877+ }
878+ }
879+ return batch .Send ()
880+ }
881+
766882// TODO make this atomic
767883func (c * ClickHouseConnector ) InsertBlockData (data * []common.BlockData ) error {
768884 blocks := make ([]common.Block , 0 , len (* data ))
0 commit comments