1
1
{-# LANGUAGE OverloadedStrings #-}
2
2
3
- module Cardano.DbSync.Fix.ConsumedBy (fixConsumedBy ) where
3
+ module Cardano.DbSync.Fix.ConsumedBy (FixEntry , fixConsumedBy , fixEntriesConsumed ) where
4
4
5
5
import Cardano.BM.Trace (Trace , logWarning )
6
6
import qualified Cardano.Chain.Block as Byron hiding (blockHash )
@@ -12,44 +12,45 @@ import Cardano.DbSync.Era.Byron.Util (blockPayload, unTxHash)
12
12
import Cardano.DbSync.Era.Util
13
13
import Cardano.DbSync.Error
14
14
import Cardano.DbSync.Types
15
- import Cardano.Prelude hiding (length )
15
+ import Cardano.Prelude hiding (length , (.) )
16
16
import Database.Persist.SqlBackend.Internal
17
17
import Ouroboros.Consensus.Byron.Ledger (ByronBlock (.. ))
18
18
import Ouroboros.Consensus.Cardano.Block (HardForkBlock (.. ))
19
19
20
- fixConsumedBy :: SqlBackend -> Trace IO Text -> Integer -> CardanoBlock -> IO (Integer , Bool )
21
- fixConsumedBy backend tracer lastSize cblk = case cblk of
22
- BlockByron blk -> (\ (n, bl) -> (n + lastSize, bl)) <$> fixBlock backend tracer blk
23
- _ -> pure (lastSize, True )
20
+ type FixEntry = (DB. TxOutId , DB. TxId )
24
21
25
- fixBlock :: SqlBackend -> Trace IO Text -> ByronBlock -> IO (Integer , Bool )
22
+ -- | Nothing when the syncing must stop.
23
+ fixConsumedBy :: SqlBackend -> Trace IO Text -> CardanoBlock -> IO (Maybe [FixEntry ])
24
+ fixConsumedBy backend tracer cblk = case cblk of
25
+ BlockByron blk -> fixBlock backend tracer blk
26
+ _ -> pure Nothing
27
+
28
+ fixBlock :: SqlBackend -> Trace IO Text -> ByronBlock -> IO (Maybe [FixEntry ])
26
29
fixBlock backend tracer bblk = case byronBlockRaw bblk of
27
- Byron. ABOBBoundary _ -> pure ( 0 , False )
30
+ Byron. ABOBBoundary _ -> pure $ Just []
28
31
Byron. ABOBBlock blk -> do
29
- runReaderT (fix 0 (blockPayload blk)) backend
30
- where
31
- fix totalSize [] = pure (totalSize, False )
32
- fix totalSize (tx : txs) = do
33
- mn <- runExceptT $ fixTx tx
34
- case mn of
35
- Right n -> fix (totalSize + n) txs
36
- Left err -> do
37
- liftIO $
38
- logWarning tracer $
39
- mconcat
40
- [ " While fixing tx "
41
- , textShow tx
42
- , " , encountered error "
43
- , textShow err
44
- ]
45
- pure (totalSize, True )
32
+ mEntries <- runReaderT (runExceptT $ mapM fixTx (blockPayload blk)) backend
33
+ case mEntries of
34
+ Right newEntries -> pure $ Just $ concat newEntries
35
+ Left err -> do
36
+ liftIO $
37
+ logWarning tracer $
38
+ mconcat
39
+ [ " While fixing block "
40
+ , textShow bblk
41
+ , " , encountered error "
42
+ , textShow err
43
+ ]
44
+ pure Nothing
46
45
47
- fixTx :: MonadIO m => Byron. TxAux -> ExceptT SyncNodeError (ReaderT SqlBackend m ) Integer
46
+ fixTx :: MonadIO m => Byron. TxAux -> ExceptT SyncNodeError (ReaderT SqlBackend m ) [ FixEntry ]
48
47
fixTx tx = do
49
48
txId <- liftLookupFail " resolving tx" $ DB. queryTxId txHash
50
49
resolvedInputs <- mapM resolveTxInputs (toList $ Byron. txInputs (Byron. taTx tx))
51
- lift $ DB. updateListTxOutConsumedByTxId (prepUpdate txId <$> resolvedInputs)
52
- pure $ fromIntegral $ length resolvedInputs
50
+ pure (prepUpdate txId <$> resolvedInputs)
53
51
where
54
52
txHash = unTxHash $ Crypto. serializeCborHash (Byron. taTx tx)
55
53
prepUpdate txId (_, _, txOutId, _) = (txOutId, txId)
54
+
55
+ fixEntriesConsumed :: SqlBackend -> Trace IO Text -> [FixEntry ] -> IO ()
56
+ fixEntriesConsumed backend tracer = DB. runDbIohkLogging backend tracer . DB. updateListTxOutConsumedByTxId
0 commit comments