33
44module  Main  where 
55
6+ import  qualified  GHC.Conc 
67import            Control.Concurrent.Async 
78import            Control.Monad.IO.Class 
89import            Data.Aeson                     hiding  (json )
910import            Data.List                      (sort )
1011import            Data.Maybe                     (catMaybes , fromMaybe )
11- import            Data.Pool 
12+ import            Data.Pool                      (Pool )
13+ import  qualified  Data.Pool                      as  Pool 
1214import  qualified  Database.PostgreSQL.Simple     as  PG 
1315import            GHC.Exts 
1416import            Network.HTTP.Types.Status 
1517import            Text.Blaze.Html.Renderer.Utf8 
1618import  qualified  Text.Blaze.Html5               as  H 
17- import            Web.Spock.Safe  
19+ import            Web.Spock 
1820
1921import            Models.Fortune 
2022import            Models.World 
2123import            Views.Fortune 
22- 
23- 
24- creds  ::  PG. ConnectInfo
25- creds = 
26-     PG. ConnectInfo
27-         { PG. connectHost     =  " tfb-database" 
28-         , PG. connectPort     =  5432 
29-         , PG. connectUser     =  " benchmarkdbuser" 
30-         , PG. connectPassword =  " benchmarkdbpass" 
31-         , PG. connectDatabase =  " hello_world" 
32-         }
33- 
34- 
35- poolCfg  ::  PoolCfg 
36- poolCfg =  PoolCfg  50  50  60 
37- 
38- pcconn  ::  ConnBuilder  PG. Connection
39- pcconn =  ConnBuilder  (PG. connect creds) PG. close poolCfg
40- 
41- dbConn  ::  PoolOrConn  PG. Connection
42- dbConn =  PCConn  pcconn
24+ import  Web.Spock.Config 
25+ 
26+ 
27+ poolCfg  ::  Int   ->  PoolCfg 
28+ poolCfg numStripes =  PoolCfg 
29+     { pc_stripes =  numStripes
30+     , pc_resPerStripe =  20 
31+     , pc_keepOpenTime =  20 
32+     }
33+ 
34+ 
35+ mkPool  ::  PoolCfg  ->  IO   (Pool  PG. Connection )
36+ mkPool cfg =  Pool. createPool
37+             dbConnect
38+             PG. close
39+             (pc_stripes cfg)
40+             (pc_keepOpenTime cfg)
41+             (pc_resPerStripe cfg)
42+ 
43+ dbConnect  ::  IO   PG. Connection
44+ dbConnect =  PG. connect creds
45+   where 
46+     creds = 
47+         PG. ConnectInfo
48+             { PG. connectHost     =  " tfb-database" 
49+             , PG. connectPort     =  5432 
50+             , PG. connectUser     =  " benchmarkdbuser" 
51+             , PG. connectPassword =  " benchmarkdbpass" 
52+             , PG. connectDatabase =  " hello_world" 
53+             }
4354
4455
4556blaze  ::  MonadIO  m  =>  H. Html  ->  ActionCtxT  ctx  m  a 
@@ -77,7 +88,7 @@ test2 = do
7788test3  ::  Pool  PG. Connection  ->  ActionCtxT  ctx  (WebStateM  PG. Connection  b  () ) a 
7889test3 pool =  do 
7990    queries <-  getQueriesNumber
80-     worlds <-  liftIO $  mapConcurrently (const  (withResource pool getRandomWorld)) [1 .. queries]
91+     worlds <-  liftIO $  mapConcurrently (const  (Pool. withResource pool getRandomWorld)) [1 .. queries]
8192    setHeader " Content-Type"   " application/json" 
8293    lazyBytes $  encode worlds
8394{-# INLINE  test3 #-}
@@ -95,8 +106,8 @@ test4 = do
95106test5  ::  Pool  PG. Connection  ->  ActionCtxT  ctx  (WebStateM  PG. Connection  b  () ) a 
96107test5 pool =  do 
97108    queries <-  getQueriesNumber
98-     worlds <-  liftIO $  mapConcurrently (const  (withResource pool getRandomWorld)) [1 .. queries]
99-     updatedWorlds <-  liftIO $  mapConcurrently (withResource pool .  updateWorldRandom) (catMaybes worlds)
109+     worlds <-  liftIO $  mapConcurrently (const  (Pool. withResource pool getRandomWorld)) [1 .. queries]
110+     updatedWorlds <-  liftIO $  mapConcurrently (Pool. withResource pool .  updateWorldRandom) (catMaybes worlds)
100111    setHeader " Content-Type"   " application/json" 
101112    lazyBytes $  encode updatedWorlds
102113{-# INLINE  test5 #-}
@@ -111,10 +122,11 @@ test6 = do
111122
112123main  ::  IO   () 
113124main =  do 
114-     pool <-  createPool (cb_createConn pcconn) (cb_destroyConn pcconn)
115-                        (pc_stripes poolCfg) (pc_keepOpenTime poolCfg)
116-                        (pc_resPerStripe poolCfg)
117-     runSpock 3000  $  spock (defaultSpockCfg Nothing  dbConn () ) $  do 
125+     numCaps <-  GHC.Conc. getNumCapabilities
126+     let  numStripes =  max  1  numCaps
127+     pool <-  mkPool (poolCfg numStripes)
128+     spockCfg <-  defaultSpockCfg ()  (PCPool  pool) () 
129+     runSpock 3000  $  spock spockCfg $  do 
118130        get " json"          test1
119131        get " db"            test2
120132        get " queries"     $  test3 pool
0 commit comments