|Maintainer||Uwe Schmidt (firstname.lastname@example.org)|
Caching of XML document trees and other binary data
- withCache :: String -> Int -> Bool -> SysConfig
- withoutCache :: SysConfig
- isInCache :: IOStateArrow s String String
- lookupCache :: (NFData b, Binary b) => String -> IOStateArrow s a b
- readCache :: (NFData c, Binary c) => String -> IOStateArrow s b c
- writeCache :: Binary b => String -> IOStateArrow s b ()
- sha1HashValue :: (Arrow a, Binary b) => a b Integer
- sha1HashString :: (Arrow a, Binary b) => a b String
withCache enables reading documents with caching.
When the cache is configured and enabled, every document read and parsed is serialized and stored in binary form in the cache. When reading the same document again, it is just deserialized, no parsing is performed.
The cache is configured by a path pointing to a directory for storing the documents, by a maximal time span in second for valid documents. After that time span, the documents are read again and the cache is updated. The flag contols, whether documents returning 404 or other errors will be cached. If set, the cache is even activated for 404 (not found) responses, default is false.
The serialized documents can be compressed, e.g. with bzip, to save disk space and IO time.
The compression can be configured by
import Text.XML.HXT.Core import Text.XML.HXT.Cache import Codec.Compression.BZip (compress, decompress) ... readDocument [ withCache "/tmp/cache" 3600 False , withCompression (compress, decompress) , .... ] "http://www.haskell.org/"
In the example the document is read and stored in binary serialized form under /tmp/cache. The cached document remains valid for the next hour. It is compressed, before written to disk.
Predicate arrow for checking if a document is in the cache. The arrow fails if document not there or is not longer valid, else the file name is returned.
Compute the SHA1 hash is hexadecimal format for an arbitray serializable value