{-# LANGUAGE RecordWildCards, TypeFamilies, FlexibleInstances, MultiParamTypeClasses, OverloadedStrings, TupleSections #-} module Aws.SimpleDb.Commands.Select where import Aws.Core import Aws.SimpleDb.Core import Control.Applicative import Control.Monad import Data.Maybe import Text.XML.Cursor (($//), (&|)) import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Text.XML.Cursor as Cu data Select = Select { sSelectExpression :: T.Text , sConsistentRead :: Bool , sNextToken :: Maybe T.Text } deriving (Show) data SelectResponse = SelectResponse { srItems :: [Item [Attribute T.Text]] , srNextToken :: Maybe T.Text } deriving (Show) select :: T.Text -> Select select expr = Select { sSelectExpression = expr, sConsistentRead = False, sNextToken = Nothing } -- | ServiceConfiguration: 'SdbConfiguration' instance SignQuery Select where type ServiceConfiguration Select = SdbConfiguration signQuery Select{..} = sdbSignQuery . catMaybes $ [ Just ("Action", "Select") , Just ("SelectExpression", T.encodeUtf8 sSelectExpression) , ("ConsistentRead", awsTrue) <$ guard sConsistentRead , (("NextToken",) . T.encodeUtf8) <$> sNextToken ] instance ResponseConsumer r SelectResponse where type ResponseMetadata SelectResponse = SdbMetadata responseConsumer _ = sdbResponseConsumer parse where parse cursor = do sdbCheckResponseType () "SelectResponse" cursor items <- sequence $ cursor $// Cu.laxElement "Item" &| readItem let nextToken = listToMaybe $ cursor $// elContent "NextToken" return $ SelectResponse items nextToken instance Transaction Select SelectResponse