@@ -0,0 +1,70 @@
9+module Squeel.PostgreSQL.PQ where
11+import Control.Monad.IO.Class
12+import Data.ByteString (ByteString)
14+import Data.Text (Text)
16+import qualified Database.PostgreSQL.LibPQ as LibPQ
18+import Squeel.PostgreSQL.Query
19+import Squeel.PostgreSQL.Value
21+newtype Connection db = Connection { unConnection :: LibPQ.Connection }
23+newtype PQ m db0 db1 x = PQ
24+ { runPQ :: Connection db0 -> m (x, Connection db1) }
26+connectdb :: MonadIO io => ByteString -> io (Connection db)
27+connectdb = fmap Connection . liftIO . LibPQ.connectdb
29+connectStart :: MonadIO io => ByteString -> io (Connection db)
30+connectStart = fmap Connection . liftIO . LibPQ.connectStart
32+newNullConnection :: MonadIO io => io (Connection db)
33+newNullConnection = Connection <$> liftIO LibPQ.newNullConnection
35+finish :: MonadIO io => Connection db -> io ()
36+finish = liftIO . LibPQ.finish . unConnection
38+newtype Result xs = Result { unResult :: LibPQ.Result }
40+exec :: MonadIO io => Query db0 db1 '[] xs -> PQ io db0 db1 (Result xs)
43+newtype RowNumber = RowNumber { unRowNumber :: LibPQ.Row }
45+newtype ColumnNumber cs c = ColumnNumber { unColumnNumber :: LibPQ.Column }
47+colNum0 :: ColumnNumber (c0:cs) c0
48+colNum0 = ColumnNumber 0
50+colNum1 :: ColumnNumber (c0:c1:cs) c1
51+colNum1 = ColumnNumber 1
53+colNum2 :: ColumnNumber (c0:c1:c2:cs) c2
54+colNum2 = ColumnNumber 2
56+colNum3 :: ColumnNumber (c0:c1:c2:c3:cs) c3
57+colNum3 = ColumnNumber 3
59+colNum4 :: ColumnNumber (c0:c1:c2:c3:c4:cs) c4
60+colNum4 = ColumnNumber 4
63+ :: (FromValue x y, MonadIO io)
68+ -> io (Maybe (Either Text y))
69+getvalue proxy (Result result) (RowNumber r) (ColumnNumber c) = liftIO $
70+ fmap (fmap (decodeValue proxy)) (LibPQ.getvalue result r c)