{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TupleSections #-}
module Database.PostgreSQL.Simple.Options
( Options(..)
, defaultOptions
, toArgs
, toConnectionString
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BSC
import Data.Maybe (Maybe, maybeToList)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
data Options = Options
{ oHost :: Maybe String
, oHostaddr :: Maybe String
, oPort :: Maybe Int
, oUser :: Maybe String
, oPassword :: Maybe String
, oDbname :: String
, oConnectTimeout :: Maybe Int
, oClientEncoding :: Maybe String
, oOptions :: Maybe String
, oFallbackApplicationName :: Maybe String
, oKeepalives :: Maybe Int
, oKeepalivesIdle :: Maybe Int
, oKeepalivesCount :: Maybe Int
, oSslmode :: Maybe String
, oRequiressl :: Maybe Int
, oSslcompression :: Maybe Int
, oSslcert :: Maybe String
, oSslkey :: Maybe String
, oSslrootcert :: Maybe String
, oRequirepeer :: Maybe String
, oKrbsrvname :: Maybe String
, oGsslib :: Maybe String
, oService :: Maybe String
} deriving (Show, Eq, Read, Ord, Generic, Typeable)
toArgs :: Options -> [String]
toArgs Options {..} =
[ "--dbname=" <> oDbname
]
++ (("--host=" <>) <$> maybeToList oHost)
++ (("--username=" <>) <$> maybeToList oUser)
++ (("--password=" <>) <$> maybeToList oPassword)
++ ((\x -> "--host=" <> show x) <$> maybeToList oPort)
toConnectionString :: Options -> ByteString
toConnectionString Options {..} = BSC.pack $ unwords $ map (\(k, v) -> k <> "=" <> v)
$ maybeToPairStr "host" oHost
<> maybeToPairStr "hostaddr" oHostaddr
<> [ ("dbname", oDbname)
]
<> maybeToPair "port" oPort
<> maybeToPairStr "password" oPassword
<> maybeToPairStr "user" oUser
<> maybeToPair "connect_timeout" oConnectTimeout
<> maybeToPairStr "client_encoding" oClientEncoding
<> maybeToPairStr "options" oOptions
<> maybeToPairStr "fallback_applicationName" oFallbackApplicationName
<> maybeToPair "keepalives" oKeepalives
<> maybeToPair "keepalives_idle" oKeepalivesIdle
<> maybeToPair "keepalives_count" oKeepalivesCount
<> maybeToPairStr "sslmode" oSslmode
<> maybeToPair "requiressl" oRequiressl
<> maybeToPair "sslcompression" oSslcompression
<> maybeToPairStr "sslcert" oSslcert
<> maybeToPairStr "sslkey" oSslkey
<> maybeToPairStr "sslrootcert" oSslrootcert
<> maybeToPairStr "requirepeer" oRequirepeer
<> maybeToPairStr "krbsrvname" oKrbsrvname
<> maybeToPairStr "gsslib" oGsslib
<> maybeToPairStr "service" oService
where
maybeToPairStr :: String -> Maybe String -> [(String, String)]
maybeToPairStr k mv = (k,) <$> maybeToList mv
maybeToPair :: Show a => String -> Maybe a -> [(String, String)]
maybeToPair k mv = (\v -> (k, show v)) <$> maybeToList mv
defaultOptions :: String -> Options
defaultOptions dbName = Options {
oHost = Nothing
, oHostaddr = Nothing
, oPort = Nothing
, oUser = Nothing
, oPassword = Nothing
, oDbname = dbName
, oConnectTimeout = Nothing
, oClientEncoding = Nothing
, oOptions = Nothing
, oFallbackApplicationName = Nothing
, oKeepalives = Nothing
, oKeepalivesIdle = Nothing
, oKeepalivesCount = Nothing
, oSslmode = Nothing
, oRequiressl = Nothing
, oSslcompression = Nothing
, oSslcert = Nothing
, oSslkey = Nothing
, oSslrootcert = Nothing
, oRequirepeer = Nothing
, oKrbsrvname = Nothing
, oGsslib = Nothing
, oService = Nothing
}