module Network.Orchid.Backend.CachingBackend (cachingBackend) where #if (__GLASGOW_HASKELL__ < 609) import Control.Exception hiding (IOException) #else import Control.Exception #endif import System.Posix.Files import System.Directory import qualified System.IO.UTF8 as U import Network.Orchid.Core.Backend #if (__GLASGOW_HASKELL__ < 609) type IOException = Exception #endif cachingBackend :: FilePath -> Backend -> Backend cachingBackend cache backend = Backend { store = store backend , delete = delete backend , retrieve = cachedRetrieve cache backend , history = history backend } -------- backend procedures --------------------------------------------------- cachedRetrieve :: FilePath -> Backend -> FilePath -> Revision -> IO (Maybe String) cachedRetrieve cache backend file rev = do hit <- (try $ U.readFile $ concat [cache, file, "?", name rev]) :: IO (Either IOException String) case hit of -- Cache hit, use this one. Right doc -> return $ Just doc -- No cache hit, forward to backend and store in cache dir. Left e -> do doc <- retrieve backend file rev -- maybe (return ()) (U.writeFile $ concat [cache, file, "?", name rev]) doc return doc