#{entityKey fortune}
| #{fortuneMessage $ entityVal fortune}
|]
getUpdatesR :: Int -> Handler Value
getUpdatesR cnt = do
worldRows <- runPg $ forM [1..sanitizedCount] (\_ -> fmap fromJust getRandomRow)
app <- getYesod
updatedWorldRows <- runPg $ mapM (replaceWorldRow app) worldRows
returnJson updatedWorldRows
where
sanitizedCount
| cnt<1 = 1
| cnt>500 = 500
| otherwise = cnt
replaceWorldRow app (Entity wId wRow) = do
randomNumber <- liftIO $ ((R.uniformR (1, 10000) (appGen app)) :: IO Int)
-- TODO: Should I be using replace, or update, or updateGet -- which is
-- idiomatic Yesod code for this operation?
let newRow =wRow{worldRandomNumber=randomNumber}
replace wId newRow
return (Entity wId newRow)
getDefaultUpdatesR :: Text -> Handler Value
getDefaultUpdatesR _ = getUpdatesR 1
-- Getmongorawdbr :: Handler Value
-- getMongoRawDbR = getDb rawMongoIntQuery
-- getDbsR :: Int -> Handler Value
-- getDbsR cnt = do
-- App {..} <- getYesod
-- multiRandomHandler randomNumber (intQuery runMySQL My.toSqlKey) cnt'
-- where
-- cnt' | cnt < 1 = 1
-- | cnt > 500 = 500
-- | otherwise = cnt
-- getDbsDefaultR :: Text -> Handler Value
-- getDbsDefaultR _ = getDbsR 1
-- getMongoRawDbsR :: Int -> Handler Value
-- getMongoRawDbsR cnt = multiRandomHandler randomNumber rawMongoIntQuery cnt'
-- where
-- cnt' | cnt < 1 = 1
-- | cnt > 500 = 500
-- | otherwise = cnt
-- getMongoRawDbsDefaultR :: Text -> Handler Value
-- getMongoRawDbsDefaultR _ = getMongoRawDbsR 1
-- getUpdatesR :: Int -> Handler Value
-- getUpdatesR cnt = multiRandomHandler randomPair go cnt'
-- where
-- cnt' | cnt < 1 = 1
-- | cnt > 500 = 500
-- | otherwise = cnt
-- go = uncurry (intUpdate runMySQL My.toSqlKey)
-- getUpdatesDefaultR :: Text -> Handler Value
-- getUpdatesDefaultR _ = getUpdatesR 1
-- randomNumber :: R.Gen (PrimState IO) -> IO Int64
-- randomNumber appGen = R.uniformR (1, 10000) appGen
-- randomPair :: R.Gen (PrimState IO) -> IO (Int64, Int64)
-- randomPair appGen = liftA2 (,) (randomNumber appGen) (randomNumber appGen)
-- getDb :: (Int64 -> Handler Value) -> Handler Value
-- getDb query = do
-- app <- getYesod
-- i <- liftIO (randomNumber (appGen app))
-- value <- query i
-- sendWaiResponse
-- $ responseBuilder
-- status200
-- [("Content-Type", simpleContentType typeJson)]
-- $ copyByteString
-- $ L.toSfortfortunestrict
-- $ encode value
-- runMongoDB :: Mongo.Action Handler b -> Handler b
-- runMongoDB f = do
-- App {..} <- getYesod
-- withResource mongoDBPool $ \pipe ->
-- Mongo.access pipe Mongo.ReadStaleOk "hello_world" f
-- runMySQL :: My.SqlPersistT Handler b -> Handler b
-- runMySQL f = do
-- App {..} <- getYesod
-- My.runSqlPool f mySqlPool
-- intQuery :: (MonadIO m, PersistEntity val, PersistStore backend
-- , backend ~ PersistEntityBackend val
-- ) =>
-- (ReaderT backend m (Maybe val) -> m (Maybe (WorldGeneric backend)))
-- -> (Int64 -> Key val)
-- -> Int64 -> m Value
-- intQuery db toKey i = do
-- Just x <- db $ get $ toKey i
-- return $ jsonResult (worldRandomNumber x)
-- where
-- jsonResult :: Int -> Value
-- jsonResult n = object ["id" .= i, "randomNumber" .= n]
-- rawMongoIntQuery :: Mongo.Val v => v -> Handler Value
-- rawMongoIntQuery i = do
-- Just x <- runMongoDB $ Mongo.findOne (Mongo.select ["id" =: i] "World")
-- return $ documentToJson x
-- intUpdate :: (Functor m, Monad m, MonadIO m
-- , PersistStore backend) =>
-- (ReaderT backend m (Maybe (WorldGeneric backend))
-- -> m (Maybe (WorldGeneric backend)))
-- -> (Int64 -> Key (WorldGeneric backend))
-- -> Int64 -> Int64 -> m Value
-- intUpdate db toKey i v = do
-- Just x <- db $ get k
-- _ <- db $ fmap (const Nothing) $
-- update k [WorldRandomNumber =. fromIntegral v]
-- return $ object ["id" .= i, "randomNumber" .= v]
-- where
-- k = toKey i
-- multiRandomHandler :: ToJSON a
-- => (R.Gen (PrimState IO) -> IO b)
-- -> (b -> Handler a)
-- -> Int
-- -> Handler Value
-- multiRandomHandler rand operation cnt = do
-- App {..} <- getYesod
-- nums <- liftIO $ replicateM cnt (rand appGen)
-- return . array =<< mapM operation nums
-- documentToJson :: [Field] -> Value
-- documentToJson = object . map toAssoc
-- where
-- toAssoc :: Field -> (Text, Value)
-- toAssoc ("_id" := v) = ("id", toJSON v)
-- toAssoc (l := v) = (l, toJSON v)
-- instance ToJSON Mongo.Value where
-- toJSON (Mongo.Int32 i) = toJSON i
-- toJSON (Mongo.Int64 i) = toJSON i
-- toJSON (Mongo.Float f) = toJSON f
-- toJSON (Mongo.Doc d) = documentToJson d
-- toJSON s = error $ "no convert for: " ++ show s
-- getFortunesR :: Handler ()
-- getFortunesR = do
-- es <- runMySQL $ My.selectList [] []
-- sendWaiResponse
-- $ responseBuilder status200 [("Content-type", typeHtml)]
-- $ fortuneTemplate (messages es)
-- where
-- messages es = sortBy (compare `on` snd)
-- ((0, "Additional fortune added at request time.") : map stripEntity es)
-- stripEntity e =
-- (My.fromSqlKey (My.entityKey e), fortuneMessage . My.entityVal $ e)
getPlaintextR :: Handler Text
getPlaintextR = return "Hello, World!"
-- sendWaiResponse
-- $ responseBuilder
-- status200
-- [("Content-Type", simpleContentType typePlain)]
-- $ copyByteString
-- fortuneTemplate :: [(Int64, Text)] -> Builder
-- fortuneTemplate messages = renderHtmlBuilder $ [shamlet|
-- $doctype 5
--
--
-- Fortunes
--
--
--
-- id
-- | message
-- $forall message <- messages
-- |
-- #{fst message}
-- | #{snd message}
-- |]
main :: IO ()
main = R.withSystemRandom $ \gen -> do
[cores, host] <- getArgs
let connString = ("host=" ++ host ++ " port=5432 user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world")
dbPool <- runNoLoggingT $ Pg.createPostgresqlPool (C8.pack connString) 256
app <- toWaiAppPlain App
{ appGen = gen
, appDbPool = dbPool
}
runInUnboundThread $ Warp.runSettings
( Warp.setPort 8000
$ Warp.setHost "*"
$ Warp.setOnException (\_ _ -> return ())
Warp.defaultSettings
) app
| |