GetStackageDatabase typeclass

This commit is contained in:
Michael Snoyman 2015-05-12 11:42:19 +03:00
parent f08978fadf
commit 7758078625
4 changed files with 32 additions and 27 deletions

View File

@ -275,5 +275,7 @@ getExtra = fmap (appExtra . settings) getYesod
-- --
-- https://github.com/yesodweb/yesod/wiki/Sending-email -- https://github.com/yesodweb/yesod/wiki/Sending-email
getStackageDatabase :: Handler StackageDatabase instance GetStackageDatabase Handler where
getStackageDatabase = getYesod >>= readIORef . stackageDatabase getStackageDatabase = getYesod >>= readIORef . stackageDatabase
instance GetStackageDatabase (WidgetT App IO) where
getStackageDatabase = getYesod >>= readIORef . stackageDatabase

View File

@ -24,35 +24,32 @@ parseLtsSuffix t0 = do
getOldLtsR :: [Text] -> Handler () getOldLtsR :: [Text] -> Handler ()
getOldLtsR pieces = do getOldLtsR pieces = do
db <- getStackageDatabase
(x, y, pieces') <- case pieces of (x, y, pieces') <- case pieces of
t:ts | Just suffix <- parseLtsSuffix t -> do t:ts | Just suffix <- parseLtsSuffix t -> do
(x, y) <- case suffix of (x, y) <- case suffix of
LSMajor x -> do LSMajor x -> do
y <- newestLTSMajor db x >>= maybe notFound return y <- newestLTSMajor x >>= maybe notFound return
return (x, y) return (x, y)
LSMinor x y -> return (x, y) LSMinor x y -> return (x, y)
return (x, y, ts) return (x, y, ts)
_ -> do _ -> do
(x, y) <- newestLTS db >>= maybe notFound return (x, y) <- newestLTS >>= maybe notFound return
return (x, y, pieces) return (x, y, pieces)
let name = concat ["lts-", tshow x, ".", tshow y] let name = concat ["lts-", tshow x, ".", tshow y]
redirect $ concatMap (cons '/') $ name : pieces' redirect $ concatMap (cons '/') $ name : pieces'
getOldLtsMajorR :: LtsMajor -> [Text] -> Handler () getOldLtsMajorR :: LtsMajor -> [Text] -> Handler ()
getOldLtsMajorR (LtsMajor x) pieces = do getOldLtsMajorR (LtsMajor x) pieces = do
db <- getStackageDatabase y <- newestLTSMajor x >>= maybe notFound return
y <- newestLTSMajor db x >>= maybe notFound return
let name = concat ["lts-", tshow x, ".", tshow y] let name = concat ["lts-", tshow x, ".", tshow y]
redirect $ concatMap (cons '/') $ name : pieces redirect $ concatMap (cons '/') $ name : pieces
getOldNightlyR :: [Text] -> Handler () getOldNightlyR :: [Text] -> Handler ()
getOldNightlyR pieces = do getOldNightlyR pieces = do
db <- getStackageDatabase
(day, pieces') <- case pieces of (day, pieces') <- case pieces of
t:ts | Just day <- fromPathPiece t -> return (day, ts) t:ts | Just day <- fromPathPiece t -> return (day, ts)
_ -> do _ -> do
day <- newestNightly db >>= maybe notFound return day <- newestNightly >>= maybe notFound return
return (day, pieces) return (day, pieces)
let name = "nightly-" ++ tshow day let name = "nightly-" ++ tshow day
redirect $ concatMap (cons '/') $ name : pieces' redirect $ concatMap (cons '/') $ name : pieces'

View File

@ -12,8 +12,7 @@ import Stackage.Database
getStackageHomeR :: SnapName -> Handler Html getStackageHomeR :: SnapName -> Handler Html
getStackageHomeR name = do getStackageHomeR name = do
db <- getStackageDatabase Entity sid snapshot <- lookupSnapshot name >>= maybe notFound return
Entity sid snapshot <- lookupSnapshot db name >>= maybe notFound return
let hoogleForm = let hoogleForm =
let queryText = "" :: Text let queryText = "" :: Text
@ -21,7 +20,7 @@ getStackageHomeR name = do
in $(widgetFile "hoogle-form") in $(widgetFile "hoogle-form")
defaultLayout $ do defaultLayout $ do
setTitle $ toHtml $ snapshotTitle snapshot setTitle $ toHtml $ snapshotTitle snapshot
packages <- getPackages db sid packages <- getPackages sid
$(widgetFile "stackage-home") $(widgetFile "stackage-home")
where strip x = fromMaybe x (stripSuffix "." x) where strip x = fromMaybe x (stripSuffix "." x)

View File

@ -1,5 +1,6 @@
module Stackage.Database module Stackage.Database
( StackageDatabase ( StackageDatabase
, GetStackageDatabase (..)
, SnapName (..) , SnapName (..)
, Snapshot (..) , Snapshot (..)
, loadStackageDatabase , loadStackageDatabase
@ -60,6 +61,9 @@ SnapshotPackage
newtype StackageDatabase = StackageDatabase ConnectionPool newtype StackageDatabase = StackageDatabase ConnectionPool
class MonadIO m => GetStackageDatabase m where
getStackageDatabase :: m StackageDatabase
sourceBuildPlans :: MonadResource m => Producer m (SnapName, BuildPlan) sourceBuildPlans :: MonadResource m => Producer m (SnapName, BuildPlan)
sourceBuildPlans = do sourceBuildPlans = do
root <- liftIO $ fmap (</> "database") $ fmap fpFromString $ getAppUserDataDirectory "stackage" root <- liftIO $ fmap (</> "database") $ fmap fpFromString $ getAppUserDataDirectory "stackage"
@ -147,25 +151,28 @@ addPlan (name, bp) = do
$ fmap (, True) (siCorePackages $ bpSystemInfo bp) $ fmap (, True) (siCorePackages $ bpSystemInfo bp)
++ fmap ((, False) . ppVersion) (bpPackages bp) ++ fmap ((, False) . ppVersion) (bpPackages bp)
run :: MonadIO m => StackageDatabase -> SqlPersistT IO a -> m a
run (StackageDatabase pool) inner = liftIO $ runSqlPool inner pool
newestLTS :: MonadIO m => StackageDatabase -> m (Maybe (Int, Int)) run :: GetStackageDatabase m => SqlPersistT IO a -> m a
newestLTS db = run inner = do
run db $ liftM (fmap go) $ selectFirst [] [Desc LtsMajor, Desc LtsMinor] StackageDatabase pool <- getStackageDatabase
liftIO $ runSqlPool inner pool
newestLTS :: GetStackageDatabase m => m (Maybe (Int, Int))
newestLTS =
run $ liftM (fmap go) $ selectFirst [] [Desc LtsMajor, Desc LtsMinor]
where where
go (Entity _ lts) = (ltsMajor lts, ltsMinor lts) go (Entity _ lts) = (ltsMajor lts, ltsMinor lts)
newestLTSMajor :: MonadIO m => StackageDatabase -> Int -> m (Maybe Int) newestLTSMajor :: GetStackageDatabase m => Int -> m (Maybe Int)
newestLTSMajor db x = newestLTSMajor x =
run db $ liftM (fmap $ ltsMinor . entityVal) $ selectFirst [LtsMajor ==. x] [Desc LtsMinor] run $ liftM (fmap $ ltsMinor . entityVal) $ selectFirst [LtsMajor ==. x] [Desc LtsMinor]
newestNightly :: MonadIO m => StackageDatabase -> m (Maybe Day) newestNightly :: GetStackageDatabase m => m (Maybe Day)
newestNightly db = newestNightly =
run db $ liftM (fmap $ nightlyDay . entityVal) $ selectFirst [] [Desc NightlyDay] run $ liftM (fmap $ nightlyDay . entityVal) $ selectFirst [] [Desc NightlyDay]
lookupSnapshot :: MonadIO m => StackageDatabase -> SnapName -> m (Maybe (Entity Snapshot)) lookupSnapshot :: GetStackageDatabase m => SnapName -> m (Maybe (Entity Snapshot))
lookupSnapshot db name = run db $ getBy $ UniqueSnapshot name lookupSnapshot name = run $ getBy $ UniqueSnapshot name
snapshotTitle :: Snapshot -> Text snapshotTitle :: Snapshot -> Text
snapshotTitle s = snapshotTitle s =
@ -182,8 +189,8 @@ data PackageListingInfo = PackageListingInfo
, pliSynopsis :: !Text , pliSynopsis :: !Text
} }
getPackages :: MonadIO m => StackageDatabase -> SnapshotId -> m [PackageListingInfo] getPackages :: GetStackageDatabase m => SnapshotId -> m [PackageListingInfo]
getPackages db sid = liftM (map toPLI) $ run db $ do getPackages sid = liftM (map toPLI) $ run $ do
E.select $ E.from $ \(p,sp) -> do E.select $ E.from $ \(p,sp) -> do
E.where_ $ E.where_ $
(p E.^. PackageId E.==. sp E.^. SnapshotPackagePackage) E.&&. (p E.^. PackageId E.==. sp E.^. SnapshotPackagePackage) E.&&.