module Database.Sql.Simple.PostgreSQL
( PostgreSQL
, ConnectInfo(..)
, postgreSQL
, psql
, module Data.Default.Class
) where
import Control.Applicative
import Control.Monad
import qualified Data.Text.Encoding as T
import Data.Typeable
import Data.Word
import Database.Sql.Simple.Internal
import qualified Database.PostgreSQL.Simple as PSql
import qualified Database.PostgreSQL.Simple.ToRow as PSql
import qualified Database.PostgreSQL.Simple.FromRow as PSql
import qualified Database.PostgreSQL.Simple.ToField as PSql
import qualified Database.PostgreSQL.Simple.FromField as PSql
import qualified Database.PostgreSQL.Simple.Types as PSql
import Data.Default.Class
#if !MIN_VERSION_base(4,7,0)
import Data.Proxy
#endif
data PostgreSQL = PostgreSQL PSql.Connection
deriving Typeable
instance PSql.ToField a => PSql.ToRow (Only a) where
toRow (Only v) = PSql.toRow $ PSql.Only v
instance PSql.FromField a => PSql.FromRow (Only a) where
fromRow = Only . PSql.fromOnly <$> PSql.fromRow
instance (PSql.ToRow a, PSql.ToRow b) => PSql.ToRow (a :. b) where
toRow (a :. b) = PSql.toRow $ a PSql.:. b
instance (PSql.FromRow a, PSql.FromRow b) => PSql.FromRow (a :. b) where
fromRow = (\(a PSql.:. b) -> a :. b) <$> PSql.fromRow
instance Backend PostgreSQL where
data ConnectInfo PostgreSQL = ConnectInfo
{ connectHost :: String
, connectPort :: Word16
, connectUser :: String
, connectPassword :: String
, connectDatabase :: String
} deriving (Eq, Read, Show)
type ToRow PostgreSQL = PSql.ToRow
type FromRow PostgreSQL = PSql.FromRow
connect (ConnectInfo h p u w d) =
PostgreSQL <$> PSql.connect (PSql.ConnectInfo h p u w d)
close (PostgreSQL c) = PSql.close c
execute (PostgreSQL c) t q = void . Sql $ PSql.execute c (psqlQuery t) q
execute_ (PostgreSQL c) t = void . Sql $ PSql.execute_ c (psqlQuery t)
query (PostgreSQL c) t q = Sql $ PSql.query c (psqlQuery t) q
query_ (PostgreSQL c) t = Sql $ PSql.query_ c (psqlQuery t)
fold (PostgreSQL c) q = PSql.fold c (psqlQuery q)
fold_ (PostgreSQL c) q = PSql.fold_ c (psqlQuery q)
begin (PostgreSQL c) = Sql $ PSql.begin c
commit (PostgreSQL c) = Sql $ PSql.commit c
rollback (PostgreSQL c) = Sql $ PSql.rollback c
instance Default (ConnectInfo PostgreSQL) where
def = ConnectInfo h p u w d
where
PSql.ConnectInfo h p u w d = PSql.defaultConnectInfo
psqlQuery :: Query -> PSql.Query
psqlQuery = PSql.Query . T.encodeUtf8 . getQuery (typeOf (undefined :: PostgreSQL))
postgreSQL :: Proxy '[PostgreSQL]
postgreSQL = Proxy
psql :: Proxy '[PostgreSQL]
psql = postgreSQL