aws-0.0.4: Aws/SimpleDb/Commands/Select.hs
{-# LANGUAGE RecordWildCards, TypeFamilies, FlexibleInstances, MultiParamTypeClasses, OverloadedStrings #-}
module Aws.SimpleDb.Commands.Select
where
import Aws.Response
import Aws.Signature
import Aws.SimpleDb.Info
import Aws.SimpleDb.Metadata
import Aws.SimpleDb.Model
import Aws.SimpleDb.Query
import Aws.SimpleDb.Response
import Aws.Transaction
import Aws.Util
import Aws.Xml
import Control.Monad
import Data.Maybe
import Text.XML.Enumerator.Cursor (($//), (&|))
import qualified Data.ByteString.UTF8 as BU
import qualified Text.XML.Enumerator.Cursor as Cu
data Select
= Select {
sSelectExpression :: String
, sConsistentRead :: Bool
, sNextToken :: String
}
deriving (Show)
data SelectResponse
= SelectResponse {
srItems :: [Item [Attribute String]]
, srNextToken :: Maybe String
}
deriving (Show)
select :: String -> Select
select expr = Select { sSelectExpression = expr, sConsistentRead = False, sNextToken = "" }
instance SignQuery Select where
type Info Select = SdbInfo
signQuery Select{..}
= sdbSignQuery $
[("Action", "Select"), ("SelectExpression", BU.fromString sSelectExpression)] ++
(guard sConsistentRead >> [("ConsistentRead", awsTrue)]) ++
(guard (not $ null sNextToken) >> [("NextToken", BU.fromString sNextToken)])
instance ResponseIteratee SelectResponse where
type ResponseMetadata SelectResponse = SdbMetadata
responseIteratee = sdbResponseIteratee parse
where parse cursor = do
sdbCheckResponseType () "SelectResponse" cursor
items <- sequence $ cursor $// Cu.laxElement "Item" &| readItem
let nextToken = listToMaybe $ cursor $// elCont "NextToken"
return $ SelectResponse items nextToken
instance Transaction Select SelectResponse