module Web.RedisSession (
setSession, setSessionExpiring,
getSession,
newKey,
Redis
) where
import Database.Redis
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BC
import Network.Socket.Internal (PortNumber)
import System.Random
import Control.Monad
import Control.Monad.Trans (liftIO)
setSessionExpiring :: Connection -> ByteString -> [(ByteString, ByteString)] -> Integer -> IO ()
setSessionExpiring conn key values timeout = runRedis conn $ do
del [key]
forM_ values (\x -> hset key (fst x) (snd x))
expire key timeout
return ()
setSession :: Connection -> ByteString -> [(ByteString, ByteString)] -> IO ()
setSession conn key values = runRedis conn $ do
oldsess <- liftIO $ getSession conn key
let todelete = case oldsess of
Just o -> o
Nothing -> []
hdel key $ map fst todelete
forM_ values (\x -> hset key (fst x) (snd x))
return ()
getSession :: Connection -> ByteString -> IO (Maybe [(ByteString, ByteString)])
getSession conn key = runRedis conn $ do
result <- hgetall key
let output = case result of
(Right b) -> Just b
_ -> Nothing
return output
newKey = do
let n = 30
gen <- newStdGen
let chars = ['0'..'9']++['a'..'z']++['A'..'B']
let numbers = randomRs (0, (length chars 1)) gen
return $ BC.pack $ take n $ map (chars!!) numbers