@@ -15,20 +15,22 @@ module Hakyll.Core.Store
1515
1616
1717--------------------------------------------------------------------------------
18−import Control.Applicative ((<$>))
19−import Control.Exception (IOException, handle)
20−import qualified Crypto.Hash.MD5 as MD5
21−import Data.Binary (Binary, decodeFile, encodeFile)
22−import qualified Data.ByteString as B
23−import qualified Data.Cache.LRU.IO as Lru
24−import Data.List (intercalate)
25−import qualified Data.Text as T
26−import qualified Data.Text.Encoding as T
27−import Data.Typeable (TypeRep, Typeable, cast, typeOf)
28−import System.Directory (createDirectoryIfMissing)
29−import System.Directory (doesFileExist, removeFile)
30−import System.FilePath ((</>))
31−import Text.Printf (printf)
18+import Control.Applicative ((<$>))
19+import Control.Exception (IOException, handle)
20+import qualified Crypto.Hash.MD5 as MD5
21+import Data.Binary (Binary, decode, encodeFile)
22+import qualified Data.ByteString as B
23+import qualified Data.ByteString.Lazy as BL
24+import qualified Data.Cache.LRU.IO as Lru
25+import Data.List (intercalate)
26+import qualified Data.Text as T
27+import qualified Data.Text.Encoding as T
28+import Data.Typeable (TypeRep, Typeable, cast, typeOf)
29+import System.Directory (createDirectoryIfMissing)
30+import System.Directory (doesFileExist, removeFile)
31+import System.FilePath ((</>))
32+import System.IO (IOMode (..), hClose, openFile)
33+import Text.Printf (printf)
3234
3335
3436--------------------------------------------------------------------------------
@@ -132,7 +134,7 @@ get store identifier = do
132134 then return NotFound
133135 -- Found in the filesystem
134136 else do
135− v <- decodeFile path
137+ v <- decodeClose
136138 cacheInsert store key v
137139 return $ Found v
138140 -- Found in the in-memory map (or wrong type), just return
@@ -141,6 +143,13 @@ get store identifier = do
141143 key = hash identifier
142144 path = storeDirectory store </> key
143145
146+ -- 'decodeFile' from Data.Binary which closes the file ASAP
147+ decodeClose = do
148+ h <- openFile path ReadMode
149+ lbs <- BL.hGetContents h
150+ BL.length lbs `seq` hClose h
151+ return $ decode lbs
152+
144153
145154--------------------------------------------------------------------------------
146155-- | Delete an item