@@ -24,6 +24,7 @@ import Control.Monad.Except
24import Control.Monad.Trans.Maybe
24import Control.Monad.Trans.Maybe
25import Control.Monad.Trans.Control
25import Control.Monad.Trans.Control
26import Data.ByteString (ByteString)
26import Data.ByteString (ByteString)
27+import Data.Function ((&))
27import Data.Maybe
28import Data.Maybe
28import Data.Proxy (Proxy)
29import Data.Proxy (Proxy)
29import Data.Text (Text)
30import Data.Text (Text)
@@ -53,7 +54,7 @@ evalPQ (PQ pq) = fmap fst . pq
53execPQ :: Functor m => PQ db0 db1 m x -> Connection db0 -> m (Connection db1)
54execPQ :: Functor m => PQ db0 db1 m x -> Connection db0 -> m (Connection db1)
54execPQ (PQ pq) = fmap snd . pq
55execPQ (PQ pq) = fmap snd . pq
56−class MonadPQ pq where
57+class AtkeyPQ pq where
59 :: Monad m
60 :: Monad m
@@ -67,43 +68,59 @@ class MonadPQ pq where
67 -> pq db0 db1 m x
68 -> pq db0 db1 m x
68 -> pq db0 db2 m y
69 -> pq db0 db2 m y
76+ pqThen pq2 pq1 = pq1 & pqBind (\ _ -> pq2)
71 :: MonadBase IO io
79 :: MonadBase IO io
72 => Statement '[] '[] db0 db1
80 => Statement '[] '[] db0 db1
73 -> pq db0 db1 io (Maybe (Result '[]))
81 -> pq db0 db1 io (Maybe (Result '[]))
85+ => Statement '[] '[] db1 db2
87+ -> pq db0 db2 io (Maybe (Result '[]))
88+ pqThenExec = pqThen . pqExec
91+ -- :: (MonadBase IO io, ToOids ps)
93+ -- -> Statement ps xs db0 db1
94+ -- -> pq db0 db1 io (Maybe (Result '[]), PreparedStatement ps xs db0 db1)
97+ -- :: MonadBase IO io
99+ -- -> Statement ps xs schema0 schema1
100+ -- -> pq db0 db1 io x
101+ -- -> pq db1 db1 io (Maybe (Result '[]), PreparedStatement ps xs schema0 schema1)
102+ -- pqThenPrepare name st pq = pqThen (pqPrepare name st) pq
104+class MonadPQ db m | m -> db where
75 pqExecParams
106 pqExecParams
76− :: (MonadBase IO io, ToOids ps, AllZip HasEncoding ps xs)
107+ :: (ToOids ps, AllZip HasEncoding ps xs)
77− => Statement ps ys db0 db1
108+ => Statement ps ys db db
78 -> NP I xs
109 -> NP I xs
79− -> pq db0 db1 io (Maybe (Result ys))
110+ -> m (Maybe (Result ys))
81− pqPrepare
112+ pqExecNil
82− :: (MonadBase IO io, ToOids ps)
84− -> Statement ps xs db0 db1
113+ :: Statement '[] ys db db
85− -> pq db0 db1 io (Maybe (Result '[]), PreparedStatement ps xs db0 db1)
114+ -> m (Maybe (Result ys))
115+ pqExecNil statement = pqExecParams statement Nil
87 pqExecPrepared
117 pqExecPrepared
88− :: (MonadBase IO io, AllZip HasEncoding ps xs)
118+ :: AllZip HasEncoding ps xs
89− => PreparedStatement ps ys db0 db1
119+ => PreparedStatement ps ys db db
90 -> NP I xs
120 -> NP I xs
91− -> pq db0 db1 io (Maybe (Result ys))
121+ -> m (Maybe (Result ys))
94− :: (MonadPQ pq, MonadBase IO io)
95− => pq db0 db1 io (Maybe (Result '[]))
96− -> Statement '[] '[] db1 db2
97− -> pq db0 db2 io (Maybe (Result '[]))
98−pq1 &>> statement2 = pqBind (\ _ -> pqExec statement2) pq1
101− :: (MonadPQ pq, MonadBase IO io)
102− => Statement '[] ys db0 db1
103− -> pq db0 db1 io (Maybe (Result ys))
104−pqExecNil statement = pqExecParams statement Nil
106−instance MonadPQ PQ where
123+instance AtkeyPQ PQ where
108 pqAp (PQ f) (PQ x) = PQ $ \ conn -> do
125 pqAp (PQ f) (PQ x) = PQ $ \ conn -> do
109 (f', conn') <- f conn
126 (f', conn') <- f conn
@@ -118,6 +135,17 @@ instance MonadPQ PQ where
118 result <- liftBase $ LibPQ.exec conn q
135 result <- liftBase $ LibPQ.exec conn q
119 return (Result <$> result, Connection conn)
136 return (Result <$> result, Connection conn)
138+ -- pqPrepare statementName (UnsafeStatement q :: Statement ps ys db0 db1) =
139+ -- PQ $ \ (Connection conn) -> do
140+ -- result <- liftBase $
141+ -- LibPQ.prepare conn statementName q (Just (toOids (proxy# :: Proxy# ps)))
143+ -- ( ( Result <$> result
144+ -- , UnsafePreparedStatement statementName
145+ -- ) , Connection conn )
147+instance MonadBase IO io => MonadPQ db (PQ db db io) where
121 pqExecParams (UnsafeStatement q :: Statement ps ys db0 db1) params =
149 pqExecParams (UnsafeStatement q :: Statement ps ys db0 db1) params =
122 PQ $ \ (Connection conn) -> do
150 PQ $ \ (Connection conn) -> do
@@ -130,15 +158,6 @@ instance MonadPQ PQ where
130 result <- liftBase $ LibPQ.execParams conn q params' LibPQ.Binary
158 result <- liftBase $ LibPQ.execParams conn q params' LibPQ.Binary
131 return (Result <$> result, Connection conn)
159 return (Result <$> result, Connection conn)
133− pqPrepare statementName (UnsafeStatement q :: Statement ps ys db0 db1) =
134− PQ $ \ (Connection conn) -> do
135− result <- liftBase $
136− LibPQ.prepare conn statementName q (Just (toOids (proxy# :: Proxy# ps)))
138− ( ( Result <$> result
139− , UnsafePreparedStatement statementName
140− ) , Connection conn )
142 pqExecPrepared (q :: PreparedStatement ps ys db0 db1) params =
161 pqExecPrepared (q :: PreparedStatement ps ys db0 db1) params =
143 PQ $ \ (Connection conn) -> do
162 PQ $ \ (Connection conn) -> do