@@ -0,0 +1,70 @@
1+{-# LANGUAGE
2+ DataKinds
3+ , PolyKinds
4+ , ScopedTypeVariables
5+ , TypeApplications
6+ , TypeOperators
7+#-}
8+
9+module Squeel.PostgreSQL.PQ where
10+
11+import Control.Monad.IO.Class
12+import Data.ByteString (ByteString)
13+import Data.Proxy
14+import Data.Text (Text)
15+
16+import qualified Database.PostgreSQL.LibPQ as LibPQ
17+
18+import Squeel.PostgreSQL.Query
19+import Squeel.PostgreSQL.Value
20+
21+newtype Connection db = Connection { unConnection :: LibPQ.Connection }
22+
23+newtype PQ m db0 db1 x = PQ
24+ { runPQ :: Connection db0 -> m (x, Connection db1) }
25+
26+connectdb :: MonadIO io => ByteString -> io (Connection db)
27+connectdb = fmap Connection . liftIO . LibPQ.connectdb
28+
29+connectStart :: MonadIO io => ByteString -> io (Connection db)
30+connectStart = fmap Connection . liftIO . LibPQ.connectStart
31+
32+newNullConnection :: MonadIO io => io (Connection db)
33+newNullConnection = Connection <$> liftIO LibPQ.newNullConnection
34+
35+finish :: MonadIO io => Connection db -> io ()
36+finish = liftIO . LibPQ.finish . unConnection
37+
38+newtype Result xs = Result { unResult :: LibPQ.Result }
39+
40+exec :: MonadIO io => Query db0 db1 '[] xs -> PQ io db0 db1 (Result xs)
41+exec = undefined
42+
43+newtype RowNumber = RowNumber { unRowNumber :: LibPQ.Row }
44+
45+newtype ColumnNumber cs c = ColumnNumber { unColumnNumber :: LibPQ.Column }
46+
47+colNum0 :: ColumnNumber (c0:cs) c0
48+colNum0 = ColumnNumber 0
49+
50+colNum1 :: ColumnNumber (c0:c1:cs) c1
51+colNum1 = ColumnNumber 1
52+
53+colNum2 :: ColumnNumber (c0:c1:c2:cs) c2
54+colNum2 = ColumnNumber 2
55+
56+colNum3 :: ColumnNumber (c0:c1:c2:c3:cs) c3
57+colNum3 = ColumnNumber 3
58+
59+colNum4 :: ColumnNumber (c0:c1:c2:c3:c4:cs) c4
60+colNum4 = ColumnNumber 4
61+
62+getvalue
63+ :: (FromValue x y, MonadIO io)
64+ => Proxy x
65+ -> Result xs
66+ -> RowNumber
67+ -> ColumnNumber xs x
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)