@@ -91,6 +91,8 @@ import Cardano.DbSync.Ledger.Types (HasLedgerEnv (..), LedgerStateFile (..), Sna
9191import Cardano.DbSync.LocalStateQuery
9292import Cardano.DbSync.Types
9393import Cardano.DbSync.Util
94+ import qualified Hasql.Pipeline as HsqlP
95+ import qualified Hasql.Session as HsqlSes
9496
9597setConsistentLevel :: SyncEnv -> ConsistentLevel -> IO ()
9698setConsistentLevel env cst = do
@@ -256,7 +258,7 @@ hasLedgerState syncEnv =
256258getDbLatestBlockInfo :: DB. DbEnv -> IO (Maybe TipInfo )
257259getDbLatestBlockInfo dbEnv = do
258260 runMaybeT $ do
259- block <- MaybeT $ DB. runDbDirectSilent dbEnv DB. queryLatestBlock
261+ block <- MaybeT $ DB. runDbTransSilent dbEnv ( Just DB. ReadCommitted ) DB. queryLatestBlock
260262 -- The EpochNo, SlotNo and BlockNo can only be zero for the Byron
261263 -- era, but we need to make the types match, hence `fromMaybe`.
262264 pure $
@@ -267,6 +269,19 @@ getDbLatestBlockInfo dbEnv = do
267269 , bBlockNo = BlockNo . fromMaybe 0 $ DB. blockBlockNo block
268270 }
269271
272+ -- | Pipeline block and points queries in a single transaction for better performance
273+ loadBlockAndPointsData :: DB. DbEnv -> IO (Maybe DB. Block , [(Maybe Word64 , ByteString )])
274+ loadBlockAndPointsData dbEnv =
275+ DB. runDbTransSilent dbEnv (Just DB. ReadCommitted ) $ do
276+ (mBlockEntity, points) <- DB. runSession DB. mkDbCallStack $
277+ HsqlSes. pipeline $ do
278+ blk <- HsqlP. statement () DB. queryLatestBlockStmt
279+ pts <- HsqlP. statement () DB. queryLatestPointsStmt
280+ pure (blk, pts)
281+
282+ let mBlock = DB. entityVal <$> mBlockEntity
283+ pure (mBlock, points)
284+
270285getDbTipBlockNo :: SyncEnv -> IO (Point. WithOrigin BlockNo )
271286getDbTipBlockNo env = do
272287 mblk <- getDbLatestBlockInfo (envDbEnv env)
0 commit comments