1
+ {-# LANGUAGE DataKinds #-}
1
2
{-# LANGUAGE FlexibleContexts #-}
2
3
{-# LANGUAGE GADTs #-}
3
4
{-# LANGUAGE OverloadedStrings #-}
@@ -23,9 +24,10 @@ module Cardano.Db.Operations.Core.Delete (
23
24
) where
24
25
25
26
import Cardano.BM.Trace (Trace , logWarning , nullTracer )
26
- import Cardano.Db.Operations.Core.MinId
27
- import Cardano.Db.Operations.Core.Query hiding ( isJust )
27
+ import Cardano.Db.Operations.Core.MinId ( MinIds ( .. ), TypedMinIds ( .. ), completeMinId , textToMinIds )
28
+ import Cardano.Db.Operations.Core.Query
28
29
import Cardano.Db.Schema.Core.Schema
30
+ import Cardano.Db.Types (TxOutTableType (.. ))
29
31
import Cardano.Prelude (Int64 )
30
32
import Cardano.Slotting.Slot (SlotNo (.. ))
31
33
import Control.Monad (void )
@@ -50,54 +52,70 @@ import Database.Persist.Sql (
50
52
(>=.) ,
51
53
)
52
54
53
- deleteBlocksSlotNoNoTrace :: MonadIO m => SlotNo -> ReaderT SqlBackend m Bool
55
+ deleteBlocksSlotNoNoTrace :: MonadIO m => TxOutTableType -> SlotNo -> ReaderT SqlBackend m Bool
54
56
deleteBlocksSlotNoNoTrace = deleteBlocksSlotNo nullTracer
55
57
56
58
-- | Delete a block if it exists. Returns 'True' if it did exist and has been
57
59
-- deleted and 'False' if it did not exist.
58
- deleteBlocksSlotNo :: MonadIO m => Trace IO Text -> SlotNo -> ReaderT SqlBackend m Bool
59
- deleteBlocksSlotNo trce (SlotNo slotNo) = do
60
+ deleteBlocksSlotNo :: MonadIO m => Trace IO Text -> TxOutTableType -> SlotNo -> ReaderT SqlBackend m Bool
61
+ deleteBlocksSlotNo trce txOutTableType (SlotNo slotNo) = do
60
62
mBlockId <- queryBlockSlotNo slotNo
61
63
case mBlockId of
62
64
Nothing -> pure False
63
65
Just blockId -> do
64
- void $ deleteBlocksBlockId trce blockId
66
+ void $ deleteBlocksBlockId trce txOutTableType blockId
65
67
pure True
66
68
67
- deleteBlocksBlockIdNotrace :: MonadIO m => BlockId -> ReaderT SqlBackend m ()
68
- deleteBlocksBlockIdNotrace = void . deleteBlocksBlockId nullTracer
69
+ deleteBlocksBlockIdNotrace :: MonadIO m => TxOutTableType -> BlockId -> ReaderT SqlBackend m ()
70
+ deleteBlocksBlockIdNotrace txOutTableType = void . deleteBlocksBlockId nullTracer txOutTableType
69
71
70
72
-- | Delete starting from a 'BlockId'.
71
- deleteBlocksBlockId :: MonadIO m => Trace IO Text -> BlockId -> ReaderT SqlBackend m (Maybe TxId , Int64 )
72
- deleteBlocksBlockId trce blockId = do
73
- mMinIds <- fmap (textToMinId =<< ) <$> queryReverseIndexBlockId blockId
74
- (cminIds, completed) <- findMinIdsRec mMinIds mempty
73
+ deleteBlocksBlockId ::
74
+ MonadIO m =>
75
+ Trace IO Text ->
76
+ TxOutTableType ->
77
+ BlockId ->
78
+ ReaderT SqlBackend m (Maybe TxId , Int64 )
79
+ deleteBlocksBlockId trce txOutTableType blockId = do
80
+ mMinIds <- fmap (textToMinIds =<< ) <$> queryReverseIndexBlockId blockId
81
+ (cminIds, completed) <- findMinIdsRec mMinIds (emptyTypedMinIds txOutTableType)
75
82
mTxId <- queryMinRefId TxBlockId blockId
76
- minIds <- if completed then pure cminIds else completeMinId mTxId cminIds
83
+ minIds <- if completed then pure cminIds else completeTypedMinId mTxId cminIds
77
84
blockCountInt <- deleteTablesAfterBlockId blockId mTxId minIds
78
85
pure (mTxId, blockCountInt)
79
86
where
80
- findMinIdsRec :: MonadIO m => [Maybe MinIds ] -> MinIds -> ReaderT SqlBackend m (MinIds , Bool )
87
+ findMinIdsRec :: MonadIO m => [Maybe TypedMinIds ] -> TypedMinIds -> ReaderT SqlBackend m (TypedMinIds , Bool )
81
88
findMinIdsRec [] minIds = pure (minIds, True )
82
89
findMinIdsRec (mMinIds : rest) minIds =
83
90
case mMinIds of
84
91
Nothing -> do
85
- liftIO $
86
- logWarning
87
- trce
88
- " Failed to find ReverseIndex. Deletion may take longer."
92
+ liftIO $ logWarning trce " Failed to find ReverseIndex. Deletion may take longer."
89
93
pure (minIds, False )
90
94
Just minIdDB -> do
91
- let minIds' = minIds <> minIdDB
92
- if isComplete minIds'
95
+ let minIds' = combineTypedMinIds minIds minIdDB
96
+ if isCompleteTypedMinIds minIds'
93
97
then pure (minIds', True )
94
98
else findMinIdsRec rest minIds'
95
99
96
- isComplete (MinIds m1 m2 m3) = isJust m1 && isJust m2 && isJust m3
100
+ emptyTypedMinIds :: TxOutTableType -> TypedMinIds
101
+ emptyTypedMinIds TxOutCore = CoreMinIds mempty
102
+ emptyTypedMinIds TxOutVariant = VariantMinIds mempty
97
103
104
+ combineTypedMinIds :: TypedMinIds -> TypedMinIds -> TypedMinIds
105
+ combineTypedMinIds (CoreMinIds a) (CoreMinIds b) = CoreMinIds (a <> b)
106
+ combineTypedMinIds (VariantMinIds a) (VariantMinIds b) = VariantMinIds (a <> b)
107
+ combineTypedMinIds _ _ = error " Mismatched TypedMinIds types"
98
108
99
- deleteTablesAfterBlockId :: MonadIO m => BlockId -> Maybe TxId -> MinIds -> ReaderT SqlBackend m Int64
100
- deleteTablesAfterBlockId blkId mtxId minIds = do
109
+ isCompleteTypedMinIds :: TypedMinIds -> Bool
110
+ isCompleteTypedMinIds (CoreMinIds (MinIds m1 m2 m3)) = isJust m1 && isJust m2 && isJust m3
111
+ isCompleteTypedMinIds (VariantMinIds (MinIds m1 m2 m3)) = isJust m1 && isJust m2 && isJust m3
112
+
113
+ completeTypedMinId :: MonadIO m => Maybe TxId -> TypedMinIds -> ReaderT SqlBackend m TypedMinIds
114
+ completeTypedMinId mTxId (CoreMinIds minIds) = CoreMinIds <$> completeMinId @ 'TxOutCore mTxId minIds
115
+ completeTypedMinId mTxId (VariantMinIds minIds) = VariantMinIds <$> completeMinId @ 'TxOutVariant mTxId minIds
116
+
117
+ deleteTablesAfterBlockId :: MonadIO m => BlockId -> Maybe TxId -> TypedMinIds -> ReaderT SqlBackend m Int64
118
+ deleteTablesAfterBlockId blkId mtxId typedMinIds = do
101
119
deleteWhere [AdaPotsBlockId >=. blkId]
102
120
deleteWhere [ReverseIndexBlockId >=. blkId]
103
121
deleteWhere [EpochParamBlockId >=. blkId]
@@ -114,9 +132,13 @@ deleteTablesAfterBlockId blkId mtxId minIds = do
114
132
queryFirstAndDeleteAfter OffChainVoteDataVotingAnchorId vaId
115
133
queryFirstAndDeleteAfter OffChainVoteFetchErrorVotingAnchorId vaId
116
134
deleteWhere [VotingAnchorId >=. vaId]
117
- deleteTablesAfterTxId mtxId (minTxInId minIds )
135
+ deleteTablesAfterTxId mtxId (typedMinTxInId typedMinIds )
118
136
deleteWhereCount [BlockId >=. blkId]
119
137
138
+ typedMinTxInId :: TypedMinIds -> Maybe TxInId
139
+ typedMinTxInId (CoreMinIds minIds) = minTxInId minIds
140
+ typedMinTxInId (VariantMinIds minIds) = minTxInId minIds
141
+
120
142
deleteTablesAfterTxId :: MonadIO m => Maybe TxId -> Maybe TxInId -> ReaderT SqlBackend m ()
121
143
deleteTablesAfterTxId mtxId mtxInId = do
122
144
whenJust mtxInId $ \ txInId -> deleteWhere [TxInId >=. txInId]
@@ -195,27 +217,15 @@ deleteDelistedPool poolHash = do
195
217
mapM_ delete keys
196
218
pure $ not (null keys)
197
219
198
- whenNothingQueryMinRefId ::
199
- forall m record field .
200
- (MonadIO m , PersistEntity record , PersistField field ) =>
201
- Maybe (Key record ) ->
202
- EntityField record field ->
203
- field ->
204
- ReaderT SqlBackend m (Maybe (Key record ))
205
- whenNothingQueryMinRefId mKey efield field = do
206
- case mKey of
207
- Just k -> pure $ Just k
208
- Nothing -> queryMinRefId efield field
209
-
210
220
-- | Delete a block if it exists. Returns 'True' if it did exist and has been
211
221
-- deleted and 'False' if it did not exist.
212
- deleteBlock :: MonadIO m => Block -> ReaderT SqlBackend m Bool
213
- deleteBlock block = do
222
+ deleteBlock :: MonadIO m => TxOutTableType -> Block -> ReaderT SqlBackend m Bool
223
+ deleteBlock txOutTableType block = do
214
224
mBlockId <- listToMaybe <$> selectKeysList [BlockHash ==. blockHash block] []
215
225
case mBlockId of
216
226
Nothing -> pure False
217
227
Just blockId -> do
218
- void $ deleteBlocksBlockId nullTracer blockId
228
+ void $ deleteBlocksBlockId nullTracer txOutTableType blockId
219
229
pure True
220
230
221
231
deleteEpochRows :: MonadIO m => Word64 -> ReaderT SqlBackend m ()
0 commit comments