packages feed

eventstore-0.1.0.0: Database/EventStore/Internal/Operation/ReadAllEventsOperation.hs

{-# LANGUAGE OverloadedStrings #-}
--------------------------------------------------------------------------------
-- |
-- Module : Database.EventStore.Internal.Operation.ReadAllEventsOperation
-- Copyright : (C) 2014 Yorick Laupa
-- License : (see the file LICENSE)
--
-- Maintainer : Yorick Laupa <yo.eight@gmail.com>
-- Stability : provisional
-- Portability : non-portable
--
--------------------------------------------------------------------------------
module Database.EventStore.Internal.Operation.ReadAllEventsOperation
    ( readAllEventsOperation ) where

--------------------------------------------------------------------------------
import Control.Concurrent.STM
import Data.Int
import Data.Maybe

--------------------------------------------------------------------------------
import Database.EventStore.Internal.Operation.Common
import Database.EventStore.Internal.Types

--------------------------------------------------------------------------------
readAllEventsOperation :: Settings
                       -> ReadDirection
                       -> TMVar (OperationExceptional AllEventsSlice)
                       -> Int64
                       -> Int64
                       -> Int32
                       -> Bool
                       -> Operation
readAllEventsOperation settings dir mvar c_pos p_pos max_c res_link_tos =
    createOperation params
  where
    req = case dir of
              Forward  -> ReadAllEventsForwardCmd
              Backward -> ReadAllEventsBackwardCmd

    resp = case dir of
               Forward  -> ReadAllEventsForwardCompletedCmd
               Backward -> ReadAllEventsBackwardCompletedCmd

    params = OperationParams
             { opSettings    = settings
             , opRequestCmd  = req
             , opResponseCmd = resp

             , opRequest =
                 let req_master = _requireMaster settings
                     request    = newReadAllEvents c_pos
                                                   p_pos
                                                   max_c
                                                   res_link_tos
                                                   req_master in
                 return request

             , opSuccess = inspect mvar dir
             , opFailure = failed mvar
             }

--------------------------------------------------------------------------------
inspect :: TMVar (OperationExceptional AllEventsSlice)
        -> ReadDirection
        -> ReadAllEventsCompleted
        -> IO Decision
inspect mvar dir raec = go res
  where
    res     = fromMaybe RA_SUCCESS (getField $ readAECResult raec)
    may_err = getField $ readAECError raec

    go RA_ERROR         = failed mvar (ServerError may_err)
    go RA_ACCESS_DENIED = failed mvar (AccessDenied "$all")
    go _                = succeed mvar dir raec

--------------------------------------------------------------------------------
succeed :: TMVar (OperationExceptional AllEventsSlice)
        -> ReadDirection
        -> ReadAllEventsCompleted
        -> IO Decision
succeed mvar dir raec = do
    atomically $ putTMVar mvar (Right ses)
    return EndOperation
  where
    ses = newAllEventsSlice dir raec

--------------------------------------------------------------------------------
failed :: TMVar (OperationExceptional AllEventsSlice)
       -> OperationException
       -> IO Decision
failed mvar e = do
    atomically $ putTMVar mvar (Left e)
    return EndOperation