Per-request caching
This commit is contained in:
parent
3aa567a631
commit
49df963196
@ -97,6 +97,12 @@ module Yesod.Handler
|
|||||||
, liftIOHandler
|
, liftIOHandler
|
||||||
-- * i18n
|
-- * i18n
|
||||||
, getMessageRender
|
, getMessageRender
|
||||||
|
-- * Per-request caching
|
||||||
|
, CacheKey
|
||||||
|
, mkCacheKey
|
||||||
|
, cacheLookup
|
||||||
|
, cacheInsert
|
||||||
|
, cacheDelete
|
||||||
-- * Internal Yesod
|
-- * Internal Yesod
|
||||||
, runHandler
|
, runHandler
|
||||||
, YesodApp (..)
|
, YesodApp (..)
|
||||||
@ -163,6 +169,9 @@ import Yesod.Message (RenderMessage (..))
|
|||||||
import Text.Blaze (toHtml, preEscapedText)
|
import Text.Blaze (toHtml, preEscapedText)
|
||||||
import Yesod.Internal.TestApi (catchIter)
|
import Yesod.Internal.TestApi (catchIter)
|
||||||
|
|
||||||
|
import qualified Yesod.Internal.Cache as Cache
|
||||||
|
import Yesod.Internal.Cache (mkCacheKey, CacheKey)
|
||||||
|
|
||||||
-- | The type-safe URLs associated with a site argument.
|
-- | The type-safe URLs associated with a site argument.
|
||||||
type family Route a
|
type family Route a
|
||||||
|
|
||||||
@ -259,6 +268,7 @@ data GHState = GHState
|
|||||||
{ ghsSession :: SessionMap
|
{ ghsSession :: SessionMap
|
||||||
, ghsRBC :: Maybe RequestBodyContents
|
, ghsRBC :: Maybe RequestBodyContents
|
||||||
, ghsIdent :: Int
|
, ghsIdent :: Int
|
||||||
|
, ghsCache :: Cache.Cache
|
||||||
}
|
}
|
||||||
|
|
||||||
type GHInner s m monad =
|
type GHInner s m monad =
|
||||||
@ -380,7 +390,7 @@ runHandler handler mrender sroute tomr ma sa =
|
|||||||
, handlerRender = mrender
|
, handlerRender = mrender
|
||||||
, handlerToMaster = tomr
|
, handlerToMaster = tomr
|
||||||
}
|
}
|
||||||
let initSession' = GHState initSession Nothing 1
|
let initSession' = GHState initSession Nothing 1 mempty
|
||||||
(contents', finalSession, headers) <- catchIter (
|
(contents', finalSession, headers) <- catchIter (
|
||||||
fmap (\(a, b, c) -> (a, ghsSession b, c))
|
fmap (\(a, b, c) -> (a, ghsSession b, c))
|
||||||
$ (\m -> runRWST m hd initSession')
|
$ (\m -> runRWST m hd initSession')
|
||||||
@ -882,3 +892,16 @@ getMessageRender = do
|
|||||||
m <- getYesod
|
m <- getYesod
|
||||||
l <- reqLangs `liftM` getRequest
|
l <- reqLangs `liftM` getRequest
|
||||||
return $ renderMessage m l
|
return $ renderMessage m l
|
||||||
|
|
||||||
|
cacheLookup :: Monad mo => CacheKey a -> GGHandler sub master mo (Maybe a)
|
||||||
|
cacheLookup k = do
|
||||||
|
gs <- GHandler $ lift get
|
||||||
|
return $ Cache.lookup k $ ghsCache gs
|
||||||
|
|
||||||
|
cacheInsert :: Monad mo => CacheKey a -> a -> GGHandler sub master mo ()
|
||||||
|
cacheInsert k v = GHandler $ lift $ modify $ \gs ->
|
||||||
|
gs { ghsCache = Cache.insert k v $ ghsCache gs }
|
||||||
|
|
||||||
|
cacheDelete :: Monad mo => CacheKey a -> GGHandler sub master mo ()
|
||||||
|
cacheDelete k = GHandler $ lift $ modify $ \gs ->
|
||||||
|
gs { ghsCache = Cache.delete k $ ghsCache gs }
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import YesodCoreTest.Links
|
|||||||
import YesodCoreTest.NoOverloadedStrings
|
import YesodCoreTest.NoOverloadedStrings
|
||||||
import YesodCoreTest.InternalRequest
|
import YesodCoreTest.InternalRequest
|
||||||
import YesodCoreTest.ErrorHandling
|
import YesodCoreTest.ErrorHandling
|
||||||
|
import YesodCoreTest.Cache
|
||||||
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
|
|
||||||
@ -21,4 +22,5 @@ specs =
|
|||||||
, noOverloadedTest
|
, noOverloadedTest
|
||||||
, internalRequestTest
|
, internalRequestTest
|
||||||
, errorHandlingTest
|
, errorHandlingTest
|
||||||
|
, cacheTest
|
||||||
]
|
]
|
||||||
|
|||||||
@ -24,6 +24,7 @@ extra-source-files:
|
|||||||
test/YesodCoreTest/Links.hs
|
test/YesodCoreTest/Links.hs
|
||||||
test/YesodCoreTest/InternalRequest.hs
|
test/YesodCoreTest/InternalRequest.hs
|
||||||
test/YesodCoreTest/ErrorHandling.hs
|
test/YesodCoreTest/ErrorHandling.hs
|
||||||
|
test/YesodCoreTest/Cache.hs
|
||||||
test.hs
|
test.hs
|
||||||
|
|
||||||
flag test
|
flag test
|
||||||
@ -89,6 +90,7 @@ library
|
|||||||
Yesod.Config
|
Yesod.Config
|
||||||
Yesod.Internal.TestApi
|
Yesod.Internal.TestApi
|
||||||
other-modules: Yesod.Internal
|
other-modules: Yesod.Internal
|
||||||
|
Yesod.Internal.Cache
|
||||||
Yesod.Internal.Core
|
Yesod.Internal.Core
|
||||||
Yesod.Internal.Session
|
Yesod.Internal.Session
|
||||||
Yesod.Internal.Request
|
Yesod.Internal.Request
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user