on dev help sign in
Merge pull request #26 from echatav/prepare

Prepare

commitd6e613026f9f1e72131c92bacbb5e2aa9f64ec63 authorEitan Chatav <eitan.chatav@gmail.com> dateTue 18 Jul 2017, 09:55 (9 years ago) parent7fe976d8540599
2 files changed+69−46
squeel-postgresql/exe/Example.hs+15−11 squeel-postgresql/src/Squeel/PostgreSQL/PQ.hs+54−35
squeel-postgresql/exe/Example.hs+15−11
@@ -27,18 +27,22 @@ main = do
2727 connectionString <- pure
2828 "host=localhost port=5432 dbname=exampledb"
2929 Char8.putStrLn $ "connecting to " <> connectionString
30− connection0 <- connectdb connectionString
30+ connection0 :: Connection '[] <- connectdb connectionString
3131 Char8.putStrLn "setting up database"
3232 connection1 <- flip execPQ connection0 $
33− pqExec ( createTable #students
34− ( (text & notNull) `As` #name
35− :* Nil ) )
36− &>> createTable #table1
37− ( (int4 & notNull) `As` #col1
38− :* (int4 & notNull) `As` #col2
39− :* Nil )
40− &>> insertInto #table1 ( 1 `As` #col1 :* 2 `As` #col2 :* Nil )
41− &>> insertInto #table1 ( 3 `As` #col1 :* 4 `As` #col2 :* Nil )
33+ pqExec
34+ ( createTable #students
35+ ( (text & notNull) `As` #name
36+ :* Nil ) )
37+ & pqThenExec
38+ ( createTable #table1
39+ ( (int4 & notNull) `As` #col1
40+ :* (int4 & notNull) `As` #col2
41+ :* Nil ) )
42+ & pqThenExec
43+ ( insertInto #table1 ( 1 `As` #col1 :* 2 `As` #col2 :* Nil ) )
44+ & pqThenExec
45+ ( insertInto #table1 ( 3 `As` #col1 :* 4 `As` #col2 :* Nil ) )
4246 Char8.putStrLn "querying"
4347 connection2 <- flip execPQ connection1 $ do
4448 Just result <- pqExecNil $ select $ starFrom #table1
@@ -59,7 +63,7 @@ main = do
5963 Char8.putStrLn "tearing down database"
6064 connection3 :: Connection '[] <- flip execPQ connection2 $ pqExec
6165 (dropTable #table1 :: Statement '[] '[] Tables '["students" ::: StudentsColumns])
62− &>> dropTable #students
66+ & pqThenExec (dropTable #students)
6367 finish connection3
6468
6569type Columns =
squeel-postgresql/src/Squeel/PostgreSQL/PQ.hs+54−35
@@ -24,6 +24,7 @@ import Control.Monad.Except
2424import Control.Monad.Trans.Maybe
2525import Control.Monad.Trans.Control
2626import Data.ByteString (ByteString)
27+import Data.Function ((&))
2728import Data.Maybe
2829import Data.Proxy (Proxy)
2930import Data.Text (Text)
@@ -53,7 +54,7 @@ evalPQ (PQ pq) = fmap fst . pq
5354execPQ :: Functor m => PQ db0 db1 m x -> Connection db0 -> m (Connection db1)
5455execPQ (PQ pq) = fmap snd . pq
5556
56−class MonadPQ pq where
57+class AtkeyPQ pq where
5758
5859 pqAp
5960 :: Monad m
@@ -67,43 +68,59 @@ class MonadPQ pq where
6768 -> pq db0 db1 m x
6869 -> pq db0 db2 m y
6970
71+ pqThen
72+ :: Monad m
73+ => pq db1 db2 m y
74+ -> pq db0 db1 m x
75+ -> pq db0 db2 m y
76+ pqThen pq2 pq1 = pq1 & pqBind (\ _ -> pq2)
77+
7078 pqExec
7179 :: MonadBase IO io
7280 => Statement '[] '[] db0 db1
7381 -> pq db0 db1 io (Maybe (Result '[]))
7482
83+ pqThenExec
84+ :: MonadBase IO io
85+ => Statement '[] '[] db1 db2
86+ -> pq db0 db1 io x
87+ -> pq db0 db2 io (Maybe (Result '[]))
88+ pqThenExec = pqThen . pqExec
89+
90+ -- pqPrepare
91+ -- :: (MonadBase IO io, ToOids ps)
92+ -- => ByteString
93+ -- -> Statement ps xs db0 db1
94+ -- -> pq db0 db1 io (Maybe (Result '[]), PreparedStatement ps xs db0 db1)
95+
96+ -- pqThenPrepare
97+ -- :: MonadBase IO io
98+ -- => ByteString
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
103+
104+class MonadPQ db m | m -> db where
105+
75106 pqExecParams
76− :: (MonadBase IO io, ToOids ps, AllZip HasEncoding ps xs)
77− => Statement ps ys db0 db1
107+ :: (ToOids ps, AllZip HasEncoding ps xs)
108+ => Statement ps ys db db
78109 -> NP I xs
79− -> pq db0 db1 io (Maybe (Result ys))
110+ -> m (Maybe (Result ys))
80111
81− pqPrepare
82− :: (MonadBase IO io, ToOids ps)
83− => ByteString
84− -> Statement ps xs db0 db1
85− -> pq db0 db1 io (Maybe (Result '[]), PreparedStatement ps xs db0 db1)
112+ pqExecNil
113+ :: Statement '[] ys db db
114+ -> m (Maybe (Result ys))
115+ pqExecNil statement = pqExecParams statement Nil
86116
87117 pqExecPrepared
88− :: (MonadBase IO io, AllZip HasEncoding ps xs)
89− => PreparedStatement ps ys db0 db1
118+ :: AllZip HasEncoding ps xs
119+ => PreparedStatement ps ys db db
90120 -> NP I xs
91− -> pq db0 db1 io (Maybe (Result ys))
92−
93−(&>>)
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
121+ -> m (Maybe (Result ys))
99122
100−pqExecNil
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
105−
106−instance MonadPQ PQ where
123+instance AtkeyPQ PQ where
107124
108125 pqAp (PQ f) (PQ x) = PQ $ \ conn -> do
109126 (f', conn') <- f conn
@@ -118,6 +135,17 @@ instance MonadPQ PQ where
118135 result <- liftBase $ LibPQ.exec conn q
119136 return (Result <$> result, Connection conn)
120137
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)))
142+ -- return
143+ -- ( ( Result <$> result
144+ -- , UnsafePreparedStatement statementName
145+ -- ) , Connection conn )
146+
147+instance MonadBase IO io => MonadPQ db (PQ db db io) where
148+
121149 pqExecParams (UnsafeStatement q :: Statement ps ys db0 db1) params =
122150 PQ $ \ (Connection conn) -> do
123151 let
@@ -130,15 +158,6 @@ instance MonadPQ PQ where
130158 result <- liftBase $ LibPQ.execParams conn q params' LibPQ.Binary
131159 return (Result <$> result, Connection conn)
132160
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)))
137− return
138− ( ( Result <$> result
139− , UnsafePreparedStatement statementName
140− ) , Connection conn )
141−
142161 pqExecPrepared (q :: PreparedStatement ps ys db0 db1) params =
143162 PQ $ \ (Connection conn) -> do
144163 let