module DB (createDBPool, withDB, DBPool, Connection) where
import Control.Monad.Trans
import Data.Pool
import Database.PostgreSQL.Simple
import Data.ByteString (ByteString)
type DBPool = Pool Connection
-- Initialize our connection pool
createDBPool :: ByteString -> IO DBPool
createDBPool connectionString =
createPool (connectPostgreSQL connectionString)
close
1 -- stripe count
100 -- amount of secs it stays alive
50 -- at most 50 concurrent connections
-- Pick a connection handle from the pool and use it to
-- execute the given request.
-- The MonadIO bit lets me avoid caring about where this will run,
-- although we're always using it in the `ActionT SproxyError IO` monad
-- but the more general type signature keeps us from doing anything irrelevant
withDB :: MonadIO m
=> DBPool
-> (Connection -> IO a)
-> m a
withDB pool act = liftIO $ withResource pool (liftIO . act)