module Hasql.Postgres.Connector where
import Hasql.Postgres.Prelude hiding (Error)
import qualified Database.PostgreSQL.LibPQ as L
import qualified Data.ByteString as B
import qualified Data.ByteString.Builder as BB
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text.Encoding as TE
data Settings =
Settings {
host :: ByteString,
port :: Word16,
user :: Text,
password :: Text,
database :: Text
}
settings :: Settings
settings =
Settings "127.0.0.1" 5432 "postgres" "" ""
data Error =
BadStatus (Maybe ByteString) |
UnsupportedVersion Int
deriving (Show, Typeable)
open :: Settings -> ExceptT Error IO L.Connection
open s =
do
c <- lift $ L.connectdb (settingsBS s)
do
s <- lift $ L.status c
when (s /= L.ConnectionOk) $
do
m <- lift $ L.errorMessage c
throwError $ BadStatus m
do
v <- lift $ L.serverVersion c
when (v < 80200) $ throwError $ UnsupportedVersion v
lift $ L.exec c $ mconcat $ map (<> ";") $
[
"SET client_encoding = 'UTF8'",
"SET client_min_messages TO WARNING"
]
return c
settingsBS :: Settings -> ByteString
settingsBS s =
BL.toStrict $ BB.toLazyByteString $
mconcat $ intersperse " " args
where
args =
[
"host=" <> BB.byteString (host s),
"port=" <> BB.word16Dec (port s),
"user=" <> TE.encodeUtf8Builder (user s),
"password=" <> TE.encodeUtf8Builder (password s),
"dbname=" <> TE.encodeUtf8Builder (database s)
]