{-# LANGUAGE
CPP
, DeriveFunctor
, FlexibleContexts
, FlexibleInstances
, InstanceSigs
, MultiParamTypeClasses
, PolyKinds
, RankNTypes
, ScopedTypeVariables
, TypeFamilies
, DataKinds
, PolyKinds
, UndecidableInstances
#-}
module Squeal.PostgreSQL.Session.Pool
(
Pool
, createConnectionPool
, usingConnectionPool
, destroyConnectionPool
) where
import Control.Monad.Catch
import Control.Monad.IO.Class
import Data.ByteString
import Data.Time
import Data.Pool
import Squeal.PostgreSQL.Type.Schema
import Squeal.PostgreSQL.Session (PQ (..))
import Squeal.PostgreSQL.Session.Connection
createConnectionPool
:: forall (db :: SchemasType) io. MonadIO io
=> ByteString
-> Int
-> NominalDiffTime
-> Int
-> io (Pool (K Connection db))
createConnectionPool :: forall (db :: SchemasType) (io :: * -> *).
MonadIO io =>
ByteString
-> Int -> NominalDiffTime -> Int -> io (Pool (K Connection db))
createConnectionPool ByteString
conninfo Int
stripes NominalDiffTime
idle Int
maxResrc =
#if MIN_VERSION_resource_pool(0,4,0)
IO (Pool (K Connection db)) -> io (Pool (K Connection db))
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Pool (K Connection db)) -> io (Pool (K Connection db)))
-> (PoolConfig (K Connection db) -> IO (Pool (K Connection db)))
-> PoolConfig (K Connection db)
-> io (Pool (K Connection db))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PoolConfig (K Connection db) -> IO (Pool (K Connection db))
forall a. PoolConfig a -> IO (Pool a)
newPool (PoolConfig (K Connection db) -> io (Pool (K Connection db)))
-> PoolConfig (K Connection db) -> io (Pool (K Connection db))
forall a b. (a -> b) -> a -> b
$ Maybe Int
-> PoolConfig (K Connection db) -> PoolConfig (K Connection db)
forall a. Maybe Int -> PoolConfig a -> PoolConfig a
setNumStripes
(Int -> Maybe Int
forall a. a -> Maybe a
Just Int
stripes)
(IO (K Connection db)
-> (K Connection db -> IO ())
-> Double
-> Int
-> PoolConfig (K Connection db)
forall a. IO a -> (a -> IO ()) -> Double -> Int -> PoolConfig a
defaultPoolConfig (ByteString -> IO (K Connection db)
forall (db :: SchemasType) (io :: * -> *).
MonadIO io =>
ByteString -> io (K Connection db)
connectdb ByteString
conninfo) K Connection db -> IO ()
forall {k} (io :: * -> *) (db :: k).
MonadIO io =>
K Connection db -> io ()
finish (NominalDiffTime -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac NominalDiffTime
idle) Int
maxResrc)
#else
liftIO $ createPool (connectdb conninfo) finish stripes idle maxResrc
#endif
usingConnectionPool
:: (MonadIO io, MonadMask io)
=> Pool (K Connection db)
-> PQ db db io x
-> io x
usingConnectionPool :: forall (io :: * -> *) (db :: SchemasType) x.
(MonadIO io, MonadMask io) =>
Pool (K Connection db) -> PQ db db io x -> io x
usingConnectionPool Pool (K Connection db)
pool (PQ K Connection db -> io (K x db)
session) = ((forall a. io a -> io a) -> io x) -> io x
forall b.
HasCallStack =>
((forall a. io a -> io a) -> io b) -> io b
forall (m :: * -> *) b.
(MonadMask m, HasCallStack) =>
((forall a. m a -> m a) -> m b) -> m b
mask (((forall a. io a -> io a) -> io x) -> io x)
-> ((forall a. io a -> io a) -> io x) -> io x
forall a b. (a -> b) -> a -> b
$ \forall a. io a -> io a
restore -> do
(K Connection db
conn, LocalPool (K Connection db)
local) <- IO (K Connection db, LocalPool (K Connection db))
-> io (K Connection db, LocalPool (K Connection db))
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (K Connection db, LocalPool (K Connection db))
-> io (K Connection db, LocalPool (K Connection db)))
-> IO (K Connection db, LocalPool (K Connection db))
-> io (K Connection db, LocalPool (K Connection db))
forall a b. (a -> b) -> a -> b
$ Pool (K Connection db)
-> IO (K Connection db, LocalPool (K Connection db))
forall a. Pool a -> IO (a, LocalPool a)
takeResource Pool (K Connection db)
pool
K x db
ret <- io (K x db) -> io (K x db)
forall a. io a -> io a
restore (K Connection db -> io (K x db)
session K Connection db
conn) io (K x db) -> io () -> io (K x db)
forall (m :: * -> *) a b.
(HasCallStack, MonadCatch m) =>
m a -> m b -> m a
`onException`
IO () -> io ()
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Pool (K Connection db)
-> LocalPool (K Connection db) -> K Connection db -> IO ()
forall a. Pool a -> LocalPool a -> a -> IO ()
destroyResource Pool (K Connection db)
pool LocalPool (K Connection db)
local K Connection db
conn)
IO () -> io ()
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> IO () -> io ()
forall a b. (a -> b) -> a -> b
$ LocalPool (K Connection db) -> K Connection db -> IO ()
forall a. LocalPool a -> a -> IO ()
putResource LocalPool (K Connection db)
local K Connection db
conn
x -> io x
forall a. a -> io a
forall (m :: * -> *) a. Monad m => a -> m a
return (x -> io x) -> x -> io x
forall a b. (a -> b) -> a -> b
$ K x db -> x
forall {k} a (b :: k). K a b -> a
unK K x db
ret
destroyConnectionPool
:: MonadIO io
=> Pool (K Connection db)
-> io ()
destroyConnectionPool :: forall {k} (io :: * -> *) (db :: k).
MonadIO io =>
Pool (K Connection db) -> io ()
destroyConnectionPool = IO () -> io ()
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ())
-> (Pool (K Connection db) -> IO ())
-> Pool (K Connection db)
-> io ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pool (K Connection db) -> IO ()
forall a. Pool a -> IO ()
destroyAllResources