|
@@ -1,5 +1,6 @@
|
|
{-# LANGUAGE EmptyDataDecls #-}
|
|
{-# LANGUAGE EmptyDataDecls #-}
|
|
{-# LANGUAGE GADTs #-}
|
|
{-# LANGUAGE GADTs #-}
|
|
|
|
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
@@ -7,10 +8,15 @@
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
|
|
+{-# LANGUAGE ViewPatterns #-}
|
|
|
|
+{-# LANGUAGE FlexibleInstances #-}
|
|
|
|
+{-# LANGUAGE FlexibleContexts #-}
|
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
|
module Main (main, resourcesApp, Widget, WorldId) where
|
|
module Main (main, resourcesApp, Widget, WorldId) where
|
|
import Control.Monad (replicateM)
|
|
import Control.Monad (replicateM)
|
|
|
|
+import Control.Monad.Logger (runNoLoggingT)
|
|
import Control.Monad.Primitive (PrimState)
|
|
import Control.Monad.Primitive (PrimState)
|
|
|
|
+import Control.Monad.Reader (ReaderT)
|
|
import Data.Conduit.Pool (Pool)
|
|
import Data.Conduit.Pool (Pool)
|
|
import Data.Int (Int64)
|
|
import Data.Int (Int64)
|
|
import Data.Text (Text)
|
|
import Data.Text (Text)
|
|
@@ -24,14 +30,18 @@ import System.Environment (getArgs)
|
|
import qualified System.Random.MWC as R
|
|
import qualified System.Random.MWC as R
|
|
import Yesod hiding (Field)
|
|
import Yesod hiding (Field)
|
|
|
|
|
|
-mkPersist sqlSettings [persistLowerCase|
|
|
|
|
|
|
+mkPersist sqlSettings { mpsGeneric = True } [persistLowerCase|
|
|
World sql=World
|
|
World sql=World
|
|
randomNumber Int sql=randomNumber
|
|
randomNumber Int sql=randomNumber
|
|
|
|
+#ifdef MONGODB
|
|
|
|
+ id Int64
|
|
|
|
+ UniqueId
|
|
|
|
+#endif
|
|
|]
|
|
|]
|
|
|
|
|
|
data App = App
|
|
data App = App
|
|
{ appGen :: !(R.Gen (PrimState IO))
|
|
{ appGen :: !(R.Gen (PrimState IO))
|
|
- , mySqlPool :: !(Pool My.Connection)
|
|
|
|
|
|
+ , mySqlPool :: !(Pool My.SqlBackend)
|
|
, mongoDBPool :: !(Pool Mongo.Connection)
|
|
, mongoDBPool :: !(Pool Mongo.Connection)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -43,8 +53,10 @@ mkYesod "App" [parseRoutes|
|
|
/db DbR GET
|
|
/db DbR GET
|
|
/dbs/#Int DbsR GET
|
|
/dbs/#Int DbsR GET
|
|
|
|
|
|
|
|
+#ifdef MONGODB
|
|
/mongo/db MongoDbR GET
|
|
/mongo/db MongoDbR GET
|
|
/mongo/dbs/#Int MongoDbsR GET
|
|
/mongo/dbs/#Int MongoDbsR GET
|
|
|
|
+#endif
|
|
|
|
|
|
/mongo/raw/db MongoRawDbR GET
|
|
/mongo/raw/db MongoRawDbR GET
|
|
/mongo/raw/dbs/#Int MongoRawDbsR GET
|
|
/mongo/raw/dbs/#Int MongoRawDbsR GET
|
|
@@ -60,10 +72,12 @@ getJsonR = return $ object ["message" .= ("Hello, World!" :: Text)]
|
|
|
|
|
|
|
|
|
|
getDbR :: Handler Value
|
|
getDbR :: Handler Value
|
|
-getDbR = getDb (intQuery runMySQL )
|
|
|
|
|
|
+getDbR = getDb (intQuery runMySQL My.toSqlKey)
|
|
|
|
|
|
|
|
+#ifdef MONGODB
|
|
getMongoDbR :: Handler Value
|
|
getMongoDbR :: Handler Value
|
|
-getMongoDbR = getDb (intQuery runMongoDB )
|
|
|
|
|
|
+getMongoDbR = getDb (intQuery runMongoDB (getBy . UniqueId))
|
|
|
|
+#endif
|
|
|
|
|
|
getMongoRawDbR :: Handler Value
|
|
getMongoRawDbR :: Handler Value
|
|
getMongoRawDbR = getDb rawMongoIntQuery
|
|
getMongoRawDbR = getDb rawMongoIntQuery
|
|
@@ -71,10 +85,12 @@ getMongoRawDbR = getDb rawMongoIntQuery
|
|
getDbsR :: Int -> Handler Value
|
|
getDbsR :: Int -> Handler Value
|
|
getDbsR cnt = do
|
|
getDbsR cnt = do
|
|
App {..} <- getYesod
|
|
App {..} <- getYesod
|
|
- multiRandomHandler (intQuery runMySQL) cnt
|
|
|
|
|
|
+ multiRandomHandler (intQuery runMySQL My.toSqlKey) cnt
|
|
|
|
|
|
|
|
+#ifdef MONGODB
|
|
getMongoDbsR :: Int -> Handler Value
|
|
getMongoDbsR :: Int -> Handler Value
|
|
-getMongoDbsR cnt = multiRandomHandler (intQuery runMongoDB) cnt
|
|
|
|
|
|
+getMongoDbsR cnt = multiRandomHandler (intQuery runMongoDB (getBy . UniqueId)) cnt
|
|
|
|
+#endif
|
|
|
|
|
|
getMongoRawDbsR :: Int -> Handler Value
|
|
getMongoRawDbsR :: Int -> Handler Value
|
|
getMongoRawDbsR cnt = multiRandomHandler rawMongoIntQuery cnt
|
|
getMongoRawDbsR cnt = multiRandomHandler rawMongoIntQuery cnt
|
|
@@ -100,13 +116,14 @@ runMySQL f = do
|
|
App {..} <- getYesod
|
|
App {..} <- getYesod
|
|
My.runSqlPool f mySqlPool
|
|
My.runSqlPool f mySqlPool
|
|
|
|
|
|
-intQuery :: forall (m :: * -> *) (m1 :: * -> *) val backend.
|
|
|
|
- (Monad m, PersistEntity val, PersistStore m1,
|
|
|
|
- PersistEntityBackend val ~ PersistMonadBackend m1) =>
|
|
|
|
- (m1 (Maybe val) -> m (Maybe (WorldGeneric backend)))
|
|
|
|
|
|
+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
|
|
-> Int64 -> m Value
|
|
-intQuery db i = do
|
|
|
|
- Just x <- db $ get (Key $ PersistInt64 i)
|
|
|
|
|
|
+intQuery db toKey i = do
|
|
|
|
+ Just x <- db $ get $ toKey i
|
|
return $ jsonResult (worldRandomNumber x)
|
|
return $ jsonResult (worldRandomNumber x)
|
|
where
|
|
where
|
|
jsonResult :: Int -> Value
|
|
jsonResult :: Int -> Value
|
|
@@ -114,7 +131,7 @@ intQuery db i = do
|
|
|
|
|
|
rawMongoIntQuery :: Mongo.Val v => v -> Handler Value
|
|
rawMongoIntQuery :: Mongo.Val v => v -> Handler Value
|
|
rawMongoIntQuery i = do
|
|
rawMongoIntQuery i = do
|
|
- Just x <- runMongoDB $ Mongo.findOne (Mongo.select ["id" =: i] "world")
|
|
|
|
|
|
+ Just x <- runMongoDB $ Mongo.findOne (Mongo.select ["id" =: i] "World")
|
|
return $ documentToJson x
|
|
return $ documentToJson x
|
|
|
|
|
|
multiRandomHandler :: ToJSON a
|
|
multiRandomHandler :: ToJSON a
|
|
@@ -145,7 +162,7 @@ instance ToJSON Mongo.Value where
|
|
main :: IO ()
|
|
main :: IO ()
|
|
main = R.withSystemRandom $ \gen -> do
|
|
main = R.withSystemRandom $ \gen -> do
|
|
[_cores, host] <- getArgs
|
|
[_cores, host] <- getArgs
|
|
- myPool <- My.createMySQLPool My.defaultConnectInfo
|
|
|
|
|
|
+ myPool <- runNoLoggingT $ My.createMySQLPool My.defaultConnectInfo
|
|
{ My.connectUser = "benchmarkdbuser"
|
|
{ My.connectUser = "benchmarkdbuser"
|
|
, My.connectPassword = "benchmarkdbpass"
|
|
, My.connectPassword = "benchmarkdbpass"
|
|
, My.connectDatabase = "hello_world"
|
|
, My.connectDatabase = "hello_world"
|