module Database.PostgreSQL.Stream.Connection (
PoolSettings(..),
ConnSettings(..),
defaultPoolSettings,
pgPool,
pgPoolSettings,
withPgConnection,
connect,
connect_alt,
) where
import Data.Monoid
import Data.Pool
import Control.Applicative
import Data.Time.Clock (NominalDiffTime)
import Data.ByteString (ByteString)
import qualified Database.PostgreSQL.LibPQ as PQ
data PoolSettings = PoolSettings
{ _stripes :: Int
, _keepalive :: NominalDiffTime
, _affinity :: Int
} deriving (Eq, Ord, Show)
defaultPoolSettings :: PoolSettings
defaultPoolSettings = PoolSettings { _stripes = 1, _keepalive = 10, _affinity = 10 }
pgPool :: PQ.Connection -> IO (Pool PQ.Connection)
pgPool conn = createPool (pure conn) PQ.finish 1 10 10
pgPoolSettings :: PoolSettings -> PQ.Connection -> IO (Pool PQ.Connection)
pgPoolSettings PoolSettings{..} conn = createPool (pure conn) PQ.finish _stripes _keepalive _affinity
withPgConnection :: PQ.Connection -> (PQ.Connection -> IO b) -> IO b
withPgConnection conn action = do
pool <- pgPool conn
withResource pool action
data ConnSettings = ConnSettings
{ _host :: ByteString
, _dbname :: ByteString
, _user :: ByteString
, _password :: Maybe ByteString
} deriving (Eq, Ord, Show, Read)
_connect :: ByteString -> IO (Either PQ.ConnStatus PQ.Connection)
_connect connstr = do
conn <- PQ.connectdb connstr
rc <- PQ.status conn
case rc of
PQ.ConnectionOk -> return (Right conn)
_ -> return (Left rc)
connect_alt :: ByteString -> IO (Either PQ.ConnStatus PQ.Connection)
connect_alt = _connect
connect :: ConnSettings -> IO (Either PQ.ConnStatus PQ.Connection)
connect (ConnSettings host db user Nothing) = _connect $
mconcat [ "dbname=" <> db , " host=" <> host , " user=" <> user ]
connect (ConnSettings host db user (Just password)) =_connect $
mconcat [ "dbname=" <> db , " host=" <> host , " user=" <> user, " password=" <> password ]