1
1
{-# LANGUAGE EmptyDataDecls #-}
2
2
{-# LANGUAGE GADTs #-}
3
+ {-# LANGUAGE GeneralizedNewtypeDeriving #-}
3
4
{-# LANGUAGE MultiParamTypeClasses #-}
4
5
{-# LANGUAGE OverloadedStrings #-}
5
6
{-# LANGUAGE QuasiQuotes #-}
6
7
{-# LANGUAGE RankNTypes #-}
7
8
{-# LANGUAGE RecordWildCards #-}
8
9
{-# LANGUAGE TemplateHaskell #-}
9
10
{-# LANGUAGE TypeFamilies #-}
11
+ {-# LANGUAGE ViewPatterns #-}
12
+ {-# LANGUAGE FlexibleInstances #-}
13
+ {-# LANGUAGE FlexibleContexts #-}
10
14
{-# OPTIONS_GHC -fno-warn-orphans #-}
11
15
module Main (main , resourcesApp , Widget , WorldId ) where
12
16
import Control.Monad (replicateM )
17
+ import Control.Monad.Logger (runNoLoggingT )
13
18
import Control.Monad.Primitive (PrimState )
19
+ import Control.Monad.Reader (ReaderT )
14
20
import Data.Conduit.Pool (Pool )
15
21
import Data.Int (Int64 )
16
22
import Data.Text (Text )
@@ -24,14 +30,18 @@ import System.Environment (getArgs)
24
30
import qualified System.Random.MWC as R
25
31
import Yesod hiding (Field )
26
32
27
- mkPersist sqlSettings [persistLowerCase |
33
+ mkPersist sqlSettings { mpsGeneric = True } [persistLowerCase |
28
34
World sql=World
29
35
randomNumber Int sql=randomNumber
36
+ #ifdef MONGODB
37
+ id Int64
38
+ UniqueId
39
+ #endif
30
40
|]
31
41
32
42
data App = App
33
43
{ appGen :: ! (R. Gen (PrimState IO ))
34
- , mySqlPool :: ! (Pool My. Connection )
44
+ , mySqlPool :: ! (Pool My. SqlBackend )
35
45
, mongoDBPool :: ! (Pool Mongo. Connection )
36
46
}
37
47
@@ -43,8 +53,10 @@ mkYesod "App" [parseRoutes|
43
53
/db DbR GET
44
54
/dbs/#Int DbsR GET
45
55
56
+ #ifdef MONGODB
46
57
/mongo/db MongoDbR GET
47
58
/mongo/dbs/#Int MongoDbsR GET
59
+ #endif
48
60
49
61
/mongo/raw/db MongoRawDbR GET
50
62
/mongo/raw/dbs/#Int MongoRawDbsR GET
@@ -60,21 +72,25 @@ getJsonR = return $ object ["message" .= ("Hello, World!" :: Text)]
60
72
61
73
62
74
getDbR :: Handler Value
63
- getDbR = getDb (intQuery runMySQL )
75
+ getDbR = getDb (intQuery runMySQL My. toSqlKey )
64
76
77
+ #ifdef MONGODB
65
78
getMongoDbR :: Handler Value
66
- getMongoDbR = getDb (intQuery runMongoDB )
79
+ getMongoDbR = getDb (intQuery runMongoDB (getBy . UniqueId ))
80
+ #endif
67
81
68
82
getMongoRawDbR :: Handler Value
69
83
getMongoRawDbR = getDb rawMongoIntQuery
70
84
71
85
getDbsR :: Int -> Handler Value
72
86
getDbsR cnt = do
73
87
App {.. } <- getYesod
74
- multiRandomHandler (intQuery runMySQL) cnt
88
+ multiRandomHandler (intQuery runMySQL My. toSqlKey ) cnt
75
89
90
+ #ifdef MONGODB
76
91
getMongoDbsR :: Int -> Handler Value
77
- getMongoDbsR cnt = multiRandomHandler (intQuery runMongoDB) cnt
92
+ getMongoDbsR cnt = multiRandomHandler (intQuery runMongoDB (getBy . UniqueId )) cnt
93
+ #endif
78
94
79
95
getMongoRawDbsR :: Int -> Handler Value
80
96
getMongoRawDbsR cnt = multiRandomHandler rawMongoIntQuery cnt
@@ -100,21 +116,22 @@ runMySQL f = do
100
116
App {.. } <- getYesod
101
117
My. runSqlPool f mySqlPool
102
118
103
- intQuery :: forall (m :: * -> * ) (m1 :: * -> * ) val backend .
104
- (Monad m , PersistEntity val , PersistStore m1 ,
105
- PersistEntityBackend val ~ PersistMonadBackend m1 ) =>
106
- (m1 (Maybe val ) -> m (Maybe (WorldGeneric backend )))
119
+ intQuery :: (MonadIO m , PersistEntity val , PersistStore backend
120
+ , backend ~ PersistEntityBackend val
121
+ ) =>
122
+ (ReaderT backend m (Maybe val ) -> m (Maybe (WorldGeneric backend )))
123
+ -> (Int64 -> Key val )
107
124
-> Int64 -> m Value
108
- intQuery db i = do
109
- Just x <- db $ get ( Key $ PersistInt64 i)
125
+ intQuery db toKey i = do
126
+ Just x <- db $ get $ toKey i
110
127
return $ jsonResult (worldRandomNumber x)
111
128
where
112
129
jsonResult :: Int -> Value
113
130
jsonResult n = object [" id" .= i, " randomNumber" .= n]
114
131
115
132
rawMongoIntQuery :: Mongo. Val v => v -> Handler Value
116
133
rawMongoIntQuery i = do
117
- Just x <- runMongoDB $ Mongo. findOne (Mongo. select [" id" =: i] " world " )
134
+ Just x <- runMongoDB $ Mongo. findOne (Mongo. select [" id" =: i] " World " )
118
135
return $ documentToJson x
119
136
120
137
multiRandomHandler :: ToJSON a
@@ -145,7 +162,7 @@ instance ToJSON Mongo.Value where
145
162
main :: IO ()
146
163
main = R. withSystemRandom $ \ gen -> do
147
164
[_cores, host] <- getArgs
148
- myPool <- My. createMySQLPool My. defaultConnectInfo
165
+ myPool <- runNoLoggingT $ My. createMySQLPool My. defaultConnectInfo
149
166
{ My. connectUser = " benchmarkdbuser"
150
167
, My. connectPassword = " benchmarkdbpass"
151
168
, My. connectDatabase = " hello_world"
0 commit comments