@@ -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,46 @@ 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)
78+class AtkeyPQ pq => MonadPQ pq where
71 :: MonadBase IO io
81 :: MonadBase IO io
72 => Statement '[] '[] db0 db1
82 => Statement '[] '[] db0 db1
73 -> pq db0 db1 io (Maybe (Result '[]))
83 -> pq db0 db1 io (Maybe (Result '[]))
76− :: (MonadBase IO io, ToOids ps, AllZip HasEncoding ps xs)
77− => Statement ps ys db0 db1
79− -> pq db0 db1 io (Maybe (Result ys))
82 :: (MonadBase IO io, ToOids ps)
86 :: (MonadBase IO io, ToOids ps)
83 => ByteString
87 => ByteString
84 -> Statement ps xs db0 db1
88 -> Statement ps xs db0 db1
85 -> pq db0 db1 io (Maybe (Result '[]), PreparedStatement ps xs db0 db1)
89 -> pq db0 db1 io (Maybe (Result '[]), PreparedStatement ps xs db0 db1)
87− pqExecPrepared
91+class MonadQuery db m | m -> db where
88− :: (MonadBase IO io, AllZip HasEncoding ps xs)
94+ :: (ToOids ps, AllZip HasEncoding ps xs)
89− => PreparedStatement ps ys db0 db1
95+ => Statement ps ys db db
90 -> NP I xs
96 -> NP I xs
91− -> pq db0 db1 io (Maybe (Result ys))
97+ -> m (Maybe (Result ys))
94− :: (MonadPQ pq, MonadBase IO io)
95− => pq db0 db1 io (Maybe (Result '[]))
96− -> Statement '[] '[] db1 db2
100+ :: Statement '[] ys db db
97− -> pq db0 db2 io (Maybe (Result '[]))
101+ -> m (Maybe (Result ys))
98−pq1 &>> statement2 = pqBind (\ _ -> pqExec statement2) pq1
102+ pqExecNil statement = pqExecParams statement Nil
100−pqExecNil
104+ pqExecPrepared
101− :: (MonadPQ pq, MonadBase IO io)
105+ :: AllZip HasEncoding ps xs
102− => Statement '[] ys db0 db1
106+ => PreparedStatement ps ys db db
103− -> pq db0 db1 io (Maybe (Result ys))
108+ -> m (Maybe (Result ys))
104−pqExecNil statement = pqExecParams statement Nil
106−instance MonadPQ PQ where
110+instance AtkeyPQ PQ where
108 pqAp (PQ f) (PQ x) = PQ $ \ conn -> do
112 pqAp (PQ f) (PQ x) = PQ $ \ conn -> do
109 (f', conn') <- f conn
113 (f', conn') <- f conn
@@ -114,10 +118,23 @@ instance MonadPQ PQ where
114 (x', conn') <- x conn
118 (x', conn') <- x conn
115 runPQ (f x') conn'
119 runPQ (f x') conn'
121+instance MonadPQ PQ where
117 pqExec (UnsafeStatement q) = PQ $ \ (Connection conn) -> do
123 pqExec (UnsafeStatement q) = PQ $ \ (Connection conn) -> do
118 result <- liftBase $ LibPQ.exec conn q
124 result <- liftBase $ LibPQ.exec conn q
119 return (Result <$> result, Connection conn)
125 return (Result <$> result, Connection conn)
127+ pqPrepare statementName (UnsafeStatement q :: Statement ps ys db0 db1) =
128+ PQ $ \ (Connection conn) -> do
129+ result <- liftBase $
130+ LibPQ.prepare conn statementName q (Just (toOids (proxy# :: Proxy# ps)))
132+ ( ( Result <$> result
133+ , UnsafePreparedStatement statementName
134+ ) , Connection conn )
136+instance MonadBase IO io => MonadQuery db (PQ db db io) where
121 pqExecParams (UnsafeStatement q :: Statement ps ys db0 db1) params =
138 pqExecParams (UnsafeStatement q :: Statement ps ys db0 db1) params =
122 PQ $ \ (Connection conn) -> do
139 PQ $ \ (Connection conn) -> do
@@ -130,15 +147,6 @@ instance MonadPQ PQ where
130 result <- liftBase $ LibPQ.execParams conn q params' LibPQ.Binary
147 result <- liftBase $ LibPQ.execParams conn q params' LibPQ.Binary
131 return (Result <$> result, Connection conn)
148 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 =
150 pqExecPrepared (q :: PreparedStatement ps ys db0 db1) params =
143 PQ $ \ (Connection conn) -> do
151 PQ $ \ (Connection conn) -> do