{-# LANGUAGE RecordWildCards #-}
module Ouroboros.Consensus.Storage.LeiosDB.Impl.SQLite.Statements
( VolStmts (..)
, prepareVolStmts
, finalizeVolStmts
, ImmStmts (..)
, prepareImmStmts
, finalizeImmStmts
, GcStmts (..)
, prepareGcStmts
, finalizeGcStmts
, CopierStmts (..)
, prepareCopierStmts
, finalizeCopierStmts
, SweeperStmts (..)
, prepareSweeperStmts
, finalizeSweeperStmts
) where
import Control.Exception (mask_, onException)
import Data.IORef (modifyIORef', newIORef, readIORef)
import Data.String (fromString)
import qualified Database.SQLite3.Direct as DB
import GHC.Stack (HasCallStack)
import Ouroboros.Consensus.Storage.LeiosDB.Impl.SQLite.Primitives (dbFinalize, dbPrepare)
import Ouroboros.Consensus.Storage.LeiosDB.Impl.SQLite.Queries
preparingStmts ::
HasCallStack => DB.Database -> ((String -> IO DB.Statement) -> IO a) -> IO a
preparingStmts :: forall a.
HasCallStack =>
Database -> ((String -> IO Statement) -> IO a) -> IO a
preparingStmts Database
db (String -> IO Statement) -> IO a
k = do
preparedVar <- [Statement] -> IO (IORef [Statement])
forall a. a -> IO (IORef a)
newIORef []
let prep String
sql = IO Statement -> IO Statement
forall a. IO a -> IO a
mask_ (IO Statement -> IO Statement) -> IO Statement -> IO Statement
forall a b. (a -> b) -> a -> b
$ do
stmt <- HasCallStack => Database -> Utf8 -> IO Statement
Database -> Utf8 -> IO Statement
dbPrepare Database
db (String -> Utf8
forall a. IsString a => String -> a
fromString String
sql)
modifyIORef' preparedVar (stmt :)
pure stmt
k prep `onException` (readIORef preparedVar >>= mapM_ dbFinalize)
data CopierStmts = CopierStmts
{ CopierStmts -> Statement
ccCompleteness :: !DB.Statement
, CopierStmts -> Statement
ccInsertEb :: !DB.Statement
, CopierStmts -> Statement
ccInsertEbTxs :: !DB.Statement
, CopierStmts -> Statement
ccInsertEbTxBytes :: !DB.Statement
}
prepareCopierStmts :: HasCallStack => DB.Database -> IO CopierStmts
prepareCopierStmts :: HasCallStack => Database -> IO CopierStmts
prepareCopierStmts Database
db = Database
-> ((String -> IO Statement) -> IO CopierStmts) -> IO CopierStmts
forall a.
HasCallStack =>
Database -> ((String -> IO Statement) -> IO a) -> IO a
preparingStmts Database
db (((String -> IO Statement) -> IO CopierStmts) -> IO CopierStmts)
-> ((String -> IO Statement) -> IO CopierStmts) -> IO CopierStmts
forall a b. (a -> b) -> a -> b
$ \String -> IO Statement
prep -> do
ccCompleteness <- String -> IO Statement
prep String
sql_copy_completeness
ccInsertEb <- prep sql_copy_insert_eb
ccInsertEbTxs <- prep sql_copy_insert_ebTxs
ccInsertEbTxBytes <- prep sql_copy_insert_ebTxBytes
pure CopierStmts{..}
finalizeCopierStmts :: CopierStmts -> IO ()
finalizeCopierStmts :: CopierStmts -> IO ()
finalizeCopierStmts CopierStmts{Statement
ccCompleteness :: CopierStmts -> Statement
ccInsertEb :: CopierStmts -> Statement
ccInsertEbTxs :: CopierStmts -> Statement
ccInsertEbTxBytes :: CopierStmts -> Statement
ccCompleteness :: Statement
ccInsertEb :: Statement
ccInsertEbTxs :: Statement
ccInsertEbTxBytes :: Statement
..} = do
Statement -> IO ()
dbFinalize Statement
ccCompleteness
Statement -> IO ()
dbFinalize Statement
ccInsertEb
Statement -> IO ()
dbFinalize Statement
ccInsertEbTxs
Statement -> IO ()
dbFinalize Statement
ccInsertEbTxBytes
data GcStmts = GcStmts
{ GcStmts -> Statement
gsHasWork :: !DB.Statement
, GcStmts -> Statement
gsMarkEbForGC :: !DB.Statement
}
prepareGcStmts :: HasCallStack => DB.Database -> IO GcStmts
prepareGcStmts :: HasCallStack => Database -> IO GcStmts
prepareGcStmts Database
db = Database -> ((String -> IO Statement) -> IO GcStmts) -> IO GcStmts
forall a.
HasCallStack =>
Database -> ((String -> IO Statement) -> IO a) -> IO a
preparingStmts Database
db (((String -> IO Statement) -> IO GcStmts) -> IO GcStmts)
-> ((String -> IO Statement) -> IO GcStmts) -> IO GcStmts
forall a b. (a -> b) -> a -> b
$ \String -> IO Statement
prep -> do
gsHasWork <- String -> IO Statement
prep String
sql_gc_has_work
gsMarkEbForGC <- prep sql_gc_mark
pure GcStmts{..}
finalizeGcStmts :: GcStmts -> IO ()
finalizeGcStmts :: GcStmts -> IO ()
finalizeGcStmts GcStmts{Statement
gsHasWork :: GcStmts -> Statement
gsMarkEbForGC :: GcStmts -> Statement
gsHasWork :: Statement
gsMarkEbForGC :: Statement
..} = do
Statement -> IO ()
dbFinalize Statement
gsHasWork
Statement -> IO ()
dbFinalize Statement
gsMarkEbForGC
data SweeperStmts = SweeperStmts
{ SweeperStmts -> Statement
swPickMarked :: !DB.Statement
, SweeperStmts -> Statement
swEvictEbTxBytes :: !DB.Statement
, SweeperStmts -> Statement
swEvictEbTxs :: !DB.Statement
, SweeperStmts -> Statement
swEvictEbs :: !DB.Statement
}
prepareSweeperStmts :: HasCallStack => DB.Database -> IO SweeperStmts
prepareSweeperStmts :: HasCallStack => Database -> IO SweeperStmts
prepareSweeperStmts Database
db = Database
-> ((String -> IO Statement) -> IO SweeperStmts) -> IO SweeperStmts
forall a.
HasCallStack =>
Database -> ((String -> IO Statement) -> IO a) -> IO a
preparingStmts Database
db (((String -> IO Statement) -> IO SweeperStmts) -> IO SweeperStmts)
-> ((String -> IO Statement) -> IO SweeperStmts) -> IO SweeperStmts
forall a b. (a -> b) -> a -> b
$ \String -> IO Statement
prep -> do
swPickMarked <- String -> IO Statement
prep String
sql_sweep_pick_marked
swEvictEbTxBytes <- prep sql_gc_ebTxBytes
swEvictEbTxs <- prep sql_gc_ebTxs
swEvictEbs <- prep sql_gc_ebs_by_hash
pure SweeperStmts{..}
finalizeSweeperStmts :: SweeperStmts -> IO ()
finalizeSweeperStmts :: SweeperStmts -> IO ()
finalizeSweeperStmts SweeperStmts{Statement
swPickMarked :: SweeperStmts -> Statement
swEvictEbTxBytes :: SweeperStmts -> Statement
swEvictEbTxs :: SweeperStmts -> Statement
swEvictEbs :: SweeperStmts -> Statement
swPickMarked :: Statement
swEvictEbTxBytes :: Statement
swEvictEbTxs :: Statement
swEvictEbs :: Statement
..} = do
Statement -> IO ()
dbFinalize Statement
swPickMarked
Statement -> IO ()
dbFinalize Statement
swEvictEbTxBytes
Statement -> IO ()
dbFinalize Statement
swEvictEbTxs
Statement -> IO ()
dbFinalize Statement
swEvictEbs
data VolStmts = VolStmts
{ VolStmts -> Statement
stScanEbPoints :: !DB.Statement
, VolStmts -> Statement
stInsertEbPoint :: !DB.Statement
, VolStmts -> Statement
stLookupEbBody :: !DB.Statement
, VolStmts -> Statement
stInsertEbTxsRow :: !DB.Statement
, VolStmts -> Statement
stPreallocEbTxBytes :: !DB.Statement
, VolStmts -> Statement
stInitMissingCount :: !DB.Statement
, VolStmts -> Statement
stFillEbTxBytes :: !DB.Statement
, VolStmts -> Statement
stDecrMissingCount :: !DB.Statement
, VolStmts -> Statement
stMarkPointNotified :: !DB.Statement
, VolStmts -> Statement
stBatchRetrieveTxs :: !DB.Statement
, VolStmts -> Statement
stLookupEbClosure :: !DB.Statement
, VolStmts -> Statement
stScanCompleteEbsSince :: !DB.Statement
}
data ImmStmts = ImmStmts
{ ImmStmts -> Statement
immStLookupEbBody :: !DB.Statement
, ImmStmts -> Statement
immStLookupEbClosure :: !DB.Statement
, ImmStmts -> Statement
immStBatchRetrieveTxs :: !DB.Statement
, ImmStmts -> Statement
immStFilterPresent :: !DB.Statement
}
prepareImmStmts :: HasCallStack => DB.Database -> IO ImmStmts
prepareImmStmts :: HasCallStack => Database -> IO ImmStmts
prepareImmStmts Database
db = Database
-> ((String -> IO Statement) -> IO ImmStmts) -> IO ImmStmts
forall a.
HasCallStack =>
Database -> ((String -> IO Statement) -> IO a) -> IO a
preparingStmts Database
db (((String -> IO Statement) -> IO ImmStmts) -> IO ImmStmts)
-> ((String -> IO Statement) -> IO ImmStmts) -> IO ImmStmts
forall a b. (a -> b) -> a -> b
$ \String -> IO Statement
prep -> do
immStLookupEbBody <- String -> IO Statement
prep String
sql_lookup_ebBodies
immStLookupEbClosure <- prep sql_lookup_eb_closure
immStBatchRetrieveTxs <- prep sql_retrieve_from_ebTxs_json
immStFilterPresent <- prep sql_imm_filter_present
pure ImmStmts{..}
finalizeImmStmts :: ImmStmts -> IO ()
finalizeImmStmts :: ImmStmts -> IO ()
finalizeImmStmts ImmStmts{Statement
immStLookupEbBody :: ImmStmts -> Statement
immStLookupEbClosure :: ImmStmts -> Statement
immStBatchRetrieveTxs :: ImmStmts -> Statement
immStFilterPresent :: ImmStmts -> Statement
immStLookupEbBody :: Statement
immStLookupEbClosure :: Statement
immStBatchRetrieveTxs :: Statement
immStFilterPresent :: Statement
..} = do
Statement -> IO ()
dbFinalize Statement
immStLookupEbBody
Statement -> IO ()
dbFinalize Statement
immStLookupEbClosure
Statement -> IO ()
dbFinalize Statement
immStBatchRetrieveTxs
Statement -> IO ()
dbFinalize Statement
immStFilterPresent
prepareVolStmts :: DB.Database -> IO VolStmts
prepareVolStmts :: Database -> IO VolStmts
prepareVolStmts Database
db = Database
-> ((String -> IO Statement) -> IO VolStmts) -> IO VolStmts
forall a.
HasCallStack =>
Database -> ((String -> IO Statement) -> IO a) -> IO a
preparingStmts Database
db (((String -> IO Statement) -> IO VolStmts) -> IO VolStmts)
-> ((String -> IO Statement) -> IO VolStmts) -> IO VolStmts
forall a b. (a -> b) -> a -> b
$ \String -> IO Statement
prep -> do
stScanEbPoints <- String -> IO Statement
prep String
sql_scan_ebs
stInsertEbPoint <- prep sql_insert_eb
stLookupEbBody <- prep sql_lookup_ebBodies
stInsertEbTxsRow <- prep sql_insert_ebBody
stPreallocEbTxBytes <- prep sql_prealloc_ebTxBytes
stInitMissingCount <- prep sql_init_missing_tx_count
stFillEbTxBytes <- prep sql_fill_ebTxBytes
stDecrMissingCount <- prep sql_decrement_missing_tx_count
stMarkPointNotified <- prep sql_mark_point_notified
stBatchRetrieveTxs <- prep sql_retrieve_from_ebTxs_json
stLookupEbClosure <- prep sql_lookup_eb_closure
stScanCompleteEbsSince <- prep sql_scan_complete_ebs_since
pure VolStmts{..}
finalizeVolStmts :: VolStmts -> IO ()
finalizeVolStmts :: VolStmts -> IO ()
finalizeVolStmts VolStmts{Statement
stScanEbPoints :: VolStmts -> Statement
stInsertEbPoint :: VolStmts -> Statement
stLookupEbBody :: VolStmts -> Statement
stInsertEbTxsRow :: VolStmts -> Statement
stPreallocEbTxBytes :: VolStmts -> Statement
stInitMissingCount :: VolStmts -> Statement
stFillEbTxBytes :: VolStmts -> Statement
stDecrMissingCount :: VolStmts -> Statement
stMarkPointNotified :: VolStmts -> Statement
stBatchRetrieveTxs :: VolStmts -> Statement
stLookupEbClosure :: VolStmts -> Statement
stScanCompleteEbsSince :: VolStmts -> Statement
stScanEbPoints :: Statement
stInsertEbPoint :: Statement
stLookupEbBody :: Statement
stInsertEbTxsRow :: Statement
stPreallocEbTxBytes :: Statement
stInitMissingCount :: Statement
stFillEbTxBytes :: Statement
stDecrMissingCount :: Statement
stMarkPointNotified :: Statement
stBatchRetrieveTxs :: Statement
stLookupEbClosure :: Statement
stScanCompleteEbsSince :: Statement
..} = do
Statement -> IO ()
dbFinalize Statement
stScanEbPoints
Statement -> IO ()
dbFinalize Statement
stInsertEbPoint
Statement -> IO ()
dbFinalize Statement
stLookupEbBody
Statement -> IO ()
dbFinalize Statement
stInsertEbTxsRow
Statement -> IO ()
dbFinalize Statement
stPreallocEbTxBytes
Statement -> IO ()
dbFinalize Statement
stInitMissingCount
Statement -> IO ()
dbFinalize Statement
stFillEbTxBytes
Statement -> IO ()
dbFinalize Statement
stDecrMissingCount
Statement -> IO ()
dbFinalize Statement
stMarkPointNotified
Statement -> IO ()
dbFinalize Statement
stBatchRetrieveTxs
Statement -> IO ()
dbFinalize Statement
stLookupEbClosure
Statement -> IO ()
dbFinalize Statement
stScanCompleteEbsSince