module Control.TSession.Happstack
( atomicTransactionPart
, createTransaction
, readVal
, safeLoadVal
, writeVal
, setStatus
, getStatus
, getReadSet
, commit
, finishSession
, TouchedValue(..)
, TouchedValues(..)
, TransactionBase(..)
, Trans(..)
, TSessionId
)
where
import qualified Control.TSession as TS (atomicTransactionPart)
import Control.TSession hiding (atomicTransactionPart)
import Happstack.Server
import Control.Monad
import Control.Monad.IO.Class
import Control.Applicative
import Data.IORef
import Data.Tuple
atomicTransactionPart
:: (Ord k, Eq v, MonadIO m,
Functor m, HasRqData m, FilterMonad Response m, MonadPlus m)
=> TransactionBase k v status
-> Trans k v status a -> m a
atomicTransactionPart = TS.atomicTransactionPart tsessionIdFromCookie
tsessionIdFromCookie
:: (MonadIO m, MonadPlus m, Functor m,
HasRqData m, FilterMonad Response m)
=> TransactionBase k v status
-> m TSessionId
tsessionIdFromCookie tr@TransactionBase{..} =
msum [ transactionIdFromCookie tr
, case _tsessionIdGenerator of
TSessionIdGenerator{..} -> do
nextTsessionId <- liftIO $
atomicModifyIORef _tsessionIdGeneratorRef (swap._tsessionIdGeneratorGenFun)
addCookie Session $
mkCookie ("transation_" ++ _trBaseName) $
show nextTsessionId
return nextTsessionId
]
transactionIdFromCookie
:: (Monad m, Functor m, HasRqData m)
=> TransactionBase k v status
-> m TSessionId
transactionIdFromCookie tr@TransactionBase{..} = do
transactionId <-
read <$> lookCookieValue ("transation_" ++ _trBaseName)
return transactionId
transactionIdFromCookieMaybe
:: (MonadPlus m, Functor m, HasRqData m)
=> TransactionBase k v status
-> m (Maybe TSessionId)
transactionIdFromCookieMaybe tr@TransactionBase{..} = do
msum [ Just . read <$> lookCookieValue
("transation_" ++ _trBaseName)
, return Nothing ]