77{-# LANGUAGE NoImplicitPrelude #-}
88{-# LANGUAGE LambdaCase #-}
99{-# LANGUAGE ScopedTypeVariables #-}
10+ {-# LANGUAGE GADTs #-}
1011
1112{-# OPTIONS_GHC -Wno-unused-matches #-}
1213
@@ -49,6 +50,7 @@ import Control.Monad.Extra (whenJust)
4950import Database.Persist.Sql
5051import Cardano.DbSync.Threads.Ledger
5152import Control.Concurrent.Class.MonadSTM.Strict (readTMVar )
53+ import qualified Cardano.DbSync.Era.Byron.Util as Byron
5254
5355insertListBlocks ::
5456 SyncEnv ->
@@ -104,7 +106,7 @@ applyAndInsertBlocks syncEnv firstAfterRollback = go
104106 where
105107 go [] = pure ()
106108 go ls@ (blk : rest) = do
107- prevBlockId <- DB. runDbLoggingExceptT backend tracer $ queryPrevBlockWithCache " applyAndInsertBlocks " (envCache syncEnv) (cardanoBlockHash blk)
109+ prevBlockId <- DB. runDbLoggingExceptT backend tracer $ getPrevBlockId syncEnv blk
108110 let newBlockId = 1 + DB. unBlockKey prevBlockId
109111 let flagList = firstAfterRollback : replicate (length rest) False
110112 let zippedArgs = zip (DB. BlockKey <$> [newBlockId.. ]) flagList
@@ -119,12 +121,12 @@ applyAndInsertByronBlock ::
119121 SyncEnv ->
120122 ((DB. BlockId , Bool ), ByronBlock ) ->
121123 ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
122- applyAndInsertByronBlock syncEnv ((_blockId , firstAfterRollback), blk) = do
124+ applyAndInsertByronBlock syncEnv ((blockId , firstAfterRollback), blk) = do
123125 (applyResult, tookSnapshot) <- liftIO (mkApplyResult syncEnv (BlockByron blk)) -- TODO use writeLedgerAction here as well for better performance
124126 let isStartEventOrRollback = hasEpochStartEvent (apEvents applyResult) || firstAfterRollback
125127 let details = apSlotDetails applyResult
126128 insertNewEpochLedgerEvents syncEnv (sdEpochNo (apSlotDetails applyResult)) (apEvents applyResult)
127- ExceptT $ insertByronBlock syncEnv isStartEventOrRollback blk details
129+ ExceptT $ insertByronBlock syncEnv isStartEventOrRollback blockId blk details
128130 insertBlockRest syncEnv blkNo applyResult tookSnapshot
129131 where
130132 cblk :: CardanoBlock = BlockByron blk
@@ -278,3 +280,19 @@ toGenericBlock iopts = \case
278280
279281cardanoBlockHash :: CardanoBlock -> ByteString
280282cardanoBlockHash = SBS. fromShort . Consensus. getOneEraHash . blockHash
283+
284+ getPrevBlockId :: MonadIO m => SyncEnv -> CardanoBlock -> ExceptT SyncNodeError (ReaderT SqlBackend m ) DB. BlockId
285+ getPrevBlockId syncEnv = \ case
286+ BlockByron blk -> getByHash $ Byron. prevHash blk
287+ BlockShelley blk -> getPrev $ Generic. blockPrevHash blk
288+ BlockAllegra blk -> getPrev $ Generic. blockPrevHash blk
289+ BlockMary blk -> getPrev $ Generic. blockPrevHash blk
290+ BlockAlonzo blk -> getPrev $ Generic. blockPrevHash blk
291+ BlockBabbage blk -> getPrev $ Generic. blockPrevHash blk
292+ BlockConway blk -> getPrev $ Generic. blockPrevHash blk
293+ where
294+ getPrev = \ case
295+ Nothing -> liftLookupFail " getPrevBlockId" DB. queryGenesis
296+ Just hsh -> getByHash hsh
297+
298+ getByHash = queryPrevBlockWithCache " getPrevBlockId" (envCache syncEnv)
0 commit comments