bamboo-2009.5.23: src/Bamboo/Type/Cache.hs
{-# LANGUAGE NoImplicitPrelude #-}
module Bamboo.Type.Cache (cache, cache'') where
import Bamboo.Helper.Env hiding (body, name, get)
import qualified Bamboo.Config.Global as G
import qualified Data.ByteString.Char8 as C
import qualified Database.TokyoCabinet as TC
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Lazy.Char8 as L
import qualified Data.ByteString.Char8 as S
cache_file = G.cache_uri
set k v = TC.runTCM $ putsample cache_file [(k.l2s, v.l2s)]
get k = do
v <- TC.runTCM $ getsample cache_file (k.l2s)
return $ v ^ s2l
cache g f x =
if G.use_cache
then cache' g f x
else f x
cache'' _ f x = f x
-- etag generator -> value function -> model -> value
cache' :: (a -> IO L.ByteString) -> (a -> IO L.ByteString) -> a -> (IO L.ByteString)
cache' g f x = do
k <- g x
c <- get k
case c of
Nothing -> do
v <- f x
set k v
return v
Just v -> do
-- putStrLn $ "Cached: " ++ (v.take 20.u2b)
return v
putsample :: String -> [(ByteString, ByteString)] -> TC.TCM Bool
putsample file kv =
do tc <- TC.new :: TC.TCM TC.HDB -- alternatively you can use BDB or FDB
TC.open tc file [TC.OWRITER, TC.OCREAT]
mapM (uncurry $ TC.put tc) kv
TC.close tc
getsample :: String -> ByteString -> TC.TCM (Maybe ByteString)
getsample file key =
do tc <- TC.new :: TC.TCM TC.HDB -- alternatively you can use BDB or FDB
TC.open tc file [TC.OREADER]
val <- TC.get tc key
TC.close tc
return val