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.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 }
instance SignQuery Select where
type Info Select = SdbInfo
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