module Database.PCLT.UpdatableCatalog where
import Control.Concurrent
import Control.Exception
import Data.List
import qualified Data.Map as M
import Data.Map (Map, (!))
import Data.Maybe
import Data.MyHelpers
import Data.Either
import Database.HDBC
import Database.HDBC.PostgreSQL
import Database.PCLT.InterfaceWithDB
import Text.PCLT
import Text.PCLT.Catalog
import Text.PCLT.Config
import Database.ReadableFromDB__
import Database.PCLT.InterfaceWithDB__
import Text.PCLT.HasStaticRawPCLTs
import Text.PCLT.InitialDefaultCatalog (PCLTRawCatalog__Text_PCLT_InitialDefaultCatalog)
data PCLTRawCatalog__Database_PCLT_UpdatableCatalog = PCLTRawCatalog__Database_PCLT_UpdatableCatalog
instance HasStaticRawPCLTs PCLTRawCatalog__Database_PCLT_UpdatableCatalog where
widenessOfStaticRawPCLTsSet _ = Package_RPSW
getStaticRawPCLTs inner_cfg _ =
mergeRawCatalogDataSets2 True
[ getStaticRawPCLTs inner_cfg (undefined :: PCLTRawCatalog__Text_PCLT_InitialDefaultCatalog)
, getStaticRawPCLTs inner_cfg (undefined :: PCLTRawCatalog__Database_PCLT_InterfaceWithDB)
, getStaticRawPCLTs inner_cfg (undefined :: PCLTRawCatalog__Database_ReadableFromDB)
]
catalogUpdatorIteration :: Connection -> PCLT_CatalogID -> (PCLT_Catalog -> CatalogUpdateFromDBErrors -> IO ()) -> PCLT_Catalog -> IO (Maybe PCLT_Catalog)
catalogUpdatorIteration db_conn cat_id errorsReporter old_cat = do
(mb_new_catalog, mb_cu_errors) <- considerCatalogUpdate db_conn cat_id
case mb_cu_errors of
Just cue ->
case emptyCUE cue of
False -> errorsReporter (maybe old_cat id mb_new_catalog) cue
True -> return ()
Nothing -> return ()
return mb_new_catalog
type DisconnectDBConnWhenFinished_shouldwe = Bool
type MakeIterationAndContinueCycle_shouldwe = Bool
runCatalogUpdatorService
:: HasStaticRawPCLTs a
=> (PCLT_CatalogID, PCLT_InnerConfig, a)
-> (Connection, DisconnectDBConnWhenFinished_shouldwe)
-> (PCLT_Catalog -> CatalogUpdateFromDBErrors -> IO ())
-> Chan MakeIterationAndContinueCycle_shouldwe
-> IO (MVar PCLT_Catalog, ThreadId)
runCatalogUpdatorService
(cat_id, inner_config, instance_of_hasStaticRawPCLTs)
(db_conn, disconnectDBConWhenFinished_shouldwe)
errorsReporter
aliveChan = do
cat_mv <- let (cat, cfhie) = initCatalogFromHSRT instance_of_hasStaticRawPCLTs inner_config cat_id
cue = cfhie2cue cfhie
in newMVar cat << case emptyCUE cue of
False -> errorsReporter cat cue
True -> return ()
updator_TID <- forkIO $ do
let dbFinalizer =
case disconnectDBConWhenFinished_shouldwe of
True -> disconnect db_conn
False -> return ()
let serviceCycle :: IO ()
serviceCycle = do
continue_shouldwe <- readChan aliveChan
case continue_shouldwe of
False -> return ()
True -> do
old_cat <- readMVar cat_mv
mb_new_cat <- catalogUpdatorIteration db_conn cat_id errorsReporter old_cat
case mb_new_cat of
Just new_catalog -> modifyMVar_ cat_mv (\ _ -> return new_catalog)
Nothing -> return ()
serviceCycle
finally serviceCycle dbFinalizer
return (cat_mv, updator_TID)
runCatalogUpdatorService_wDefaultInitial
:: PCLT_CatalogID
-> (Connection, DisconnectDBConnWhenFinished_shouldwe)
-> (PCLT_Catalog -> CatalogUpdateFromDBErrors -> IO ())
-> Chan MakeIterationAndContinueCycle_shouldwe
-> IO (MVar PCLT_Catalog, ThreadId)
runCatalogUpdatorService_wDefaultInitial cat_id (db_conn, disconnectDBConWhenFinished_shouldwe) errorsReporter aliveChan =
runCatalogUpdatorService
( cat_id
, defaultPCLTInnerConfig
, PCLTRawCatalog__Database_PCLT_UpdatableCatalog
)
(db_conn, disconnectDBConWhenFinished_shouldwe)
errorsReporter
aliveChan