@@ -11,7 +11,7 @@ a `Definition` and `MonadPQ` for executing a `Manipulation` or `Query`,
11and a `PQ` type with instances for them.
11and a `PQ` type with instances for them.
13Using Squeal in your application will come down to defining
13Using Squeal in your application will come down to defining
14−the @schema@ of your database and including @PQ schema schema@ in your
14+the @db@ of your database and including @PQ db db@ in your
15application's monad transformer stack, giving it an instance of `MonadPQ`.
15application's monad transformer stack, giving it an instance of `MonadPQ`.
17This module also provides functions for retrieving rows from the `LibPQ.Result`
17This module also provides functions for retrieving rows from the `LibPQ.Result`
@@ -130,22 +130,22 @@ Note that, for now, squeal doesn't offer any protection from connecting
130with the wrong schema!
130with the wrong schema!
133− :: forall schema io
133+ :: forall db io
134 . MonadBase IO io
134 . MonadBase IO io
135 => ByteString -- ^ conninfo
135 => ByteString -- ^ conninfo
136− -> io (K LibPQ.Connection schema)
136+ -> io (K LibPQ.Connection db)
137connectdb = fmap K . liftBase . LibPQ.connectdb
137connectdb = fmap K . liftBase . LibPQ.connectdb
139-- | Closes the connection to the server.
139-- | Closes the connection to the server.
140−finish :: MonadBase IO io => K LibPQ.Connection schema -> io ()
140+finish :: MonadBase IO io => K LibPQ.Connection db -> io ()
141finish = liftBase . LibPQ.finish . unK
141finish = liftBase . LibPQ.finish . unK
143-- | Do `connectdb` and `finish` before and after a computation.
143-- | Do `connectdb` and `finish` before and after a computation.
144withConnection
144withConnection
145− :: forall schema0 schema1 io x
145+ :: forall db0 db1 io x
146 . MonadBaseControl IO io
146 . MonadBaseControl IO io
147 => ByteString
147 => ByteString
148− -> PQ schema0 schema1 io x
148+ -> PQ db0 db1 io x
150withConnection connString action = do
150withConnection connString action = do
151 K x <- bracket (connectdb connString) finish (unPQ action)
151 K x <- bracket (connectdb connString) finish (unPQ action)
@@ -153,20 +153,20 @@ withConnection connString action = do
154-- | Safely `lowerConnection` to a smaller schema.
154-- | Safely `lowerConnection` to a smaller schema.
155lowerConnection
155lowerConnection
156− :: K LibPQ.Connection (table ': schema)
156+ :: K LibPQ.Connection (schema ': db)
157− -> K LibPQ.Connection schema
157+ -> K LibPQ.Connection db
158lowerConnection (K conn) = K conn
158lowerConnection (K conn) = K conn
160-- | We keep track of the schema via an Atkey indexed state monad transformer,
160-- | We keep track of the schema via an Atkey indexed state monad transformer,
162newtype PQ
162newtype PQ
163− (schema0 :: SchemaType)
163+ (db0 :: DBType)
164− (schema1 :: SchemaType)
164+ (db1 :: DBType)
165 (m :: Type -> Type)
165 (m :: Type -> Type)
166 (x :: Type) =
166 (x :: Type) =
167− PQ { unPQ :: K LibPQ.Connection schema0 -> m (K x schema1) }
167+ PQ { unPQ :: K LibPQ.Connection db0 -> m (K x db1) }
169−instance Monad m => Functor (PQ schema0 schema1 m) where
169+instance Monad m => Functor (PQ db0 db1 m) where
170 fmap f (PQ pq) = PQ $ \ conn -> do
170 fmap f (PQ pq) = PQ $ \ conn -> do
171 K x <- pq conn
171 K x <- pq conn
172 return $ K (f x)
172 return $ K (f x)
@@ -174,9 +174,9 @@ instance Monad m => Functor (PQ schema0 schema1 m) where
174-- | Run a `PQ` and keep the result and the `Connection`.
174-- | Run a `PQ` and keep the result and the `Connection`.
176 :: Functor m
176 :: Functor m
177− => PQ schema0 schema1 m x
177+ => PQ db0 db1 m x
178− -> K LibPQ.Connection schema0
178+ -> K LibPQ.Connection db0
179− -> m (x, K LibPQ.Connection schema1)
179+ -> m (x, K LibPQ.Connection db1)
180runPQ (PQ pq) conn = (\ x -> (unK x, K (unK conn))) <$> pq conn
180runPQ (PQ pq) conn = (\ x -> (unK x, K (unK conn))) <$> pq conn
181 -- K x <- pq conn
181 -- K x <- pq conn
182 -- return (x, K (unK conn))
182 -- return (x, K (unK conn))
@@ -184,16 +184,16 @@ runPQ (PQ pq) conn = (\ x -> (unK x, K (unK conn))) <$> pq conn
184-- | Execute a `PQ` and discard the result but keep the `Connection`.
184-- | Execute a `PQ` and discard the result but keep the `Connection`.
186 :: Functor m
186 :: Functor m
187− => PQ schema0 schema1 m x
187+ => PQ db0 db1 m x
188− -> K LibPQ.Connection schema0
188+ -> K LibPQ.Connection db0
189− -> m (K LibPQ.Connection schema1)
189+ -> m (K LibPQ.Connection db1)
190execPQ (PQ pq) conn = mapKK (\ _ -> unK conn) <$> pq conn
190execPQ (PQ pq) conn = mapKK (\ _ -> unK conn) <$> pq conn
192-- | Evaluate a `PQ` and discard the `Connection` but keep the result.
192-- | Evaluate a `PQ` and discard the `Connection` but keep the result.
194 :: Functor m
194 :: Functor m
195− => PQ schema0 schema1 m x
195+ => PQ db0 db1 m x
196− -> K LibPQ.Connection schema0
196+ -> K LibPQ.Connection db0
198evalPQ (PQ pq) conn = unK <$> pq conn
198evalPQ (PQ pq) conn = unK <$> pq conn
@@ -208,53 +208,53 @@ class IndexedMonadTransPQ pq where
208 -- | indexed analog of `<*>`
208 -- | indexed analog of `<*>`
210 :: Monad m
210 :: Monad m
211− => pq schema0 schema1 m (x -> y)
211+ => pq db0 db1 m (x -> y)
212− -> pq schema1 schema2 m x
212+ -> pq db1 db2 m x
213− -> pq schema0 schema2 m y
213+ -> pq db0 db2 m y
215 -- | indexed analog of `join`
215 -- | indexed analog of `join`
217 :: Monad m
217 :: Monad m
218− => pq schema0 schema1 m (pq schema1 schema2 m y)
218+ => pq db0 db1 m (pq db1 db2 m y)
219− -> pq schema0 schema2 m y
219+ -> pq db0 db2 m y
220 pqJoin pq = pq & pqBind id
220 pqJoin pq = pq & pqBind id
222 -- | indexed analog of `=<<`
222 -- | indexed analog of `=<<`
224 :: Monad m
224 :: Monad m
225− => (x -> pq schema1 schema2 m y)
225+ => (x -> pq db1 db2 m y)
226− -> pq schema0 schema1 m x
226+ -> pq db0 db1 m x
227− -> pq schema0 schema2 m y
227+ -> pq db0 db2 m y
229 -- | indexed analog of flipped `>>`
229 -- | indexed analog of flipped `>>`
231 :: Monad m
231 :: Monad m
232− => pq schema1 schema2 m y
232+ => pq db1 db2 m y
233− -> pq schema0 schema1 m x
233+ -> pq db0 db1 m x
234− -> pq schema0 schema2 m y
234+ -> pq db0 db2 m y
235 pqThen pq2 pq1 = pq1 & pqBind (\ _ -> pq2)
235 pqThen pq2 pq1 = pq1 & pqBind (\ _ -> pq2)
237 -- | indexed analog of `<=<`
237 -- | indexed analog of `<=<`
238 pqAndThen
238 pqAndThen
239 :: Monad m
239 :: Monad m
240− => (y -> pq schema1 schema2 m z)
240+ => (y -> pq db1 db2 m z)
241− -> (x -> pq schema0 schema1 m y)
241+ -> (x -> pq db0 db1 m y)
242− -> x -> pq schema0 schema2 m z
242+ -> x -> pq db0 db2 m z
243 pqAndThen g f x = pqBind g (f x)
243 pqAndThen g f x = pqBind g (f x)
245 -- | Safely embed a computation in a larger schema.
245 -- | Safely embed a computation in a larger schema.
247 :: Monad m
247 :: Monad m
248− => pq schema0 schema1 m x
248+ => pq db0 db1 m x
249− -> pq (table ': schema0) (table : schema1) m x
249+ -> pq (table ': db0) (table : db1) m x
251 -- | Run a `Definition` with `LibPQ.exec`, we expect that libpq obeys the law
251 -- | Run a `Definition` with `LibPQ.exec`, we expect that libpq obeys the law
253 -- @define statement1 & pqThen (define statement2) = define (statement1 >>> statement2)@
253 -- @define statement1 & pqThen (define statement2) = define (statement1 >>> statement2)@
255 :: MonadBase IO io
255 :: MonadBase IO io
256− => Definition schema0 schema1
256+ => Definition db0 db1
257− -> pq schema0 schema1 io (K LibPQ.Result '[])
257+ -> pq db0 db1 io (K LibPQ.Result '[])
259instance IndexedMonadTransPQ PQ where
259instance IndexedMonadTransPQ PQ where
@@ -312,66 +312,66 @@ To define an instance, you can minimally define only `manipulateParams`,
312a default instance.
312a default instance.
315−class Monad pq => MonadPQ schema pq | pq -> schema where
315+class Monad pq => MonadPQ db pq | pq -> db where
316 manipulateParams
316 manipulateParams
317 :: ToParams x params
317 :: ToParams x params
318− => Manipulation schema params ys
318+ => Manipulation db params ys
319 -- ^ `insertRows`, `update` or `deleteFrom`
319 -- ^ `insertRows`, `update` or `deleteFrom`
320 -> x -> pq (K LibPQ.Result ys)
320 -> x -> pq (K LibPQ.Result ys)
321 default manipulateParams
321 default manipulateParams
322− :: (MonadTrans t, MonadPQ schema pq1, pq ~ t pq1)
322+ :: (MonadTrans t, MonadPQ db pq1, pq ~ t pq1)
323 => ToParams x params
323 => ToParams x params
324− => Manipulation schema params ys
324+ => Manipulation db params ys
325 -- ^ `insertRows`, `update` or `deleteFrom`
325 -- ^ `insertRows`, `update` or `deleteFrom`
326 -> x -> pq (K LibPQ.Result ys)
326 -> x -> pq (K LibPQ.Result ys)
327 manipulateParams manipulation params = lift $
327 manipulateParams manipulation params = lift $
328 manipulateParams manipulation params
328 manipulateParams manipulation params
330− manipulate :: Manipulation schema '[] ys -> pq (K LibPQ.Result ys)
330+ manipulate :: Manipulation db '[] ys -> pq (K LibPQ.Result ys)
331 manipulate statement = manipulateParams statement ()
331 manipulate statement = manipulateParams statement ()
333 runQueryParams
333 runQueryParams
334 :: ToParams x params
334 :: ToParams x params
335− => Query schema params ys
335+ => Query db params ys
336 -- ^ `select` and friends
336 -- ^ `select` and friends
337 -> x -> pq (K LibPQ.Result ys)
337 -> x -> pq (K LibPQ.Result ys)
338 runQueryParams = manipulateParams . queryStatement
338 runQueryParams = manipulateParams . queryStatement
341− :: Query schema '[] ys
341+ :: Query db '[] ys
342 -- ^ `select` and friends
342 -- ^ `select` and friends
343 -> pq (K LibPQ.Result ys)
343 -> pq (K LibPQ.Result ys)
344 runQuery q = runQueryParams q ()
344 runQuery q = runQueryParams q ()
346 traversePrepared
346 traversePrepared
347 :: (ToParams x params, Traversable list)
347 :: (ToParams x params, Traversable list)
348− => Manipulation schema params ys
348+ => Manipulation db params ys
349 -- ^ `insertRows`, `update`, or `deleteFrom`, and friends
349 -- ^ `insertRows`, `update`, or `deleteFrom`, and friends
350 -> list x -> pq (list (K LibPQ.Result ys))
350 -> list x -> pq (list (K LibPQ.Result ys))
351 default traversePrepared
351 default traversePrepared
352− :: (MonadTrans t, MonadPQ schema pq1, pq ~ t pq1)
352+ :: (MonadTrans t, MonadPQ db pq1, pq ~ t pq1)
353 => (ToParams x params, Traversable list)
353 => (ToParams x params, Traversable list)
354− => Manipulation schema params ys -> list x -> pq (list (K LibPQ.Result ys))
354+ => Manipulation db params ys -> list x -> pq (list (K LibPQ.Result ys))
355 traversePrepared manipulation params = lift $
355 traversePrepared manipulation params = lift $
356 traversePrepared manipulation params
356 traversePrepared manipulation params
358 forPrepared
358 forPrepared
359 :: (ToParams x params, Traversable list)
359 :: (ToParams x params, Traversable list)
360 => list x
360 => list x
361− -> Manipulation schema params ys
361+ -> Manipulation db params ys
362 -- ^ `insertRows`, `update` or `deleteFrom`
362 -- ^ `insertRows`, `update` or `deleteFrom`
363 -> pq (list (K LibPQ.Result ys))
363 -> pq (list (K LibPQ.Result ys))
364 forPrepared = flip traversePrepared
364 forPrepared = flip traversePrepared
366 traversePrepared_
366 traversePrepared_
367 :: (ToParams x params, Foldable list)
367 :: (ToParams x params, Foldable list)
368− => Manipulation schema params '[]
368+ => Manipulation db params '[]
369 -- ^ `insertRows`, `update` or `deleteFrom`
369 -- ^ `insertRows`, `update` or `deleteFrom`
370 -> list x -> pq ()
370 -> list x -> pq ()
371 default traversePrepared_
371 default traversePrepared_
372− :: (MonadTrans t, MonadPQ schema pq1, pq ~ t pq1)
372+ :: (MonadTrans t, MonadPQ db pq1, pq ~ t pq1)
373 => (ToParams x params, Foldable list)
373 => (ToParams x params, Foldable list)
374− => Manipulation schema params '[]
374+ => Manipulation db params '[]
375 -- ^ `insertRows`, `update` or `deleteFrom`
375 -- ^ `insertRows`, `update` or `deleteFrom`
376 -> list x -> pq ()
376 -> list x -> pq ()
377 traversePrepared_ manipulation params = lift $
377 traversePrepared_ manipulation params = lift $
@@ -380,22 +380,22 @@ class Monad pq => MonadPQ schema pq | pq -> schema where
380 forPrepared_
380 forPrepared_
381 :: (ToParams x params, Foldable list)
381 :: (ToParams x params, Foldable list)
382 => list x
382 => list x
383− -> Manipulation schema params '[]
383+ -> Manipulation db params '[]
384 -- ^ `insertRows`, `update` or `deleteFrom`
384 -- ^ `insertRows`, `update` or `deleteFrom`
386 forPrepared_ = flip traversePrepared_
386 forPrepared_ = flip traversePrepared_
388 liftPQ :: (LibPQ.Connection -> IO a) -> pq a
388 liftPQ :: (LibPQ.Connection -> IO a) -> pq a
389 default liftPQ
389 default liftPQ
390− :: (MonadTrans t, MonadPQ schema pq1, pq ~ t pq1)
390+ :: (MonadTrans t, MonadPQ db pq1, pq ~ t pq1)
391 => (LibPQ.Connection -> IO a) -> pq a
391 => (LibPQ.Connection -> IO a) -> pq a
392 liftPQ = lift . liftPQ
392 liftPQ = lift . liftPQ
394−instance (MonadBase IO io, schema0 ~ schema, schema1 ~ schema)
394+instance (MonadBase IO io, db0 ~ db, db1 ~ db)
395− => MonadPQ schema (PQ schema0 schema1 io) where
395+ => MonadPQ db (PQ db0 db1 io) where
397 manipulateParams
397 manipulateParams
398− (UnsafeManipulation q :: Manipulation schema ps ys) (params :: x) =
398+ (UnsafeManipulation q :: Manipulation db ps ys) (params :: x) =
399 PQ $ \ (K conn) -> do
399 PQ $ \ (K conn) -> do
401 toParam' encoding =
401 toParam' encoding =
@@ -411,7 +411,7 @@ instance (MonadBase IO io, schema0 ~ schema, schema1 ~ schema)
411 return $ K (K result)
411 return $ K (K result)
413 traversePrepared
413 traversePrepared
414− (UnsafeManipulation q :: Manipulation schema xs ys) (list :: list x) =
414+ (UnsafeManipulation q :: Manipulation db xs ys) (list :: list x) =
415 PQ $ \ (K conn) -> liftBase $ do
415 PQ $ \ (K conn) -> liftBase $ do
416 let temp = "temporary_statement"
416 let temp = "temporary_statement"
417 prepResultMaybe <- LibPQ.prepare conn temp q Nothing
417 prepResultMaybe <- LibPQ.prepare conn temp q Nothing
@@ -438,7 +438,7 @@ instance (MonadBase IO io, schema0 ~ schema, schema1 ~ schema)
438 return (K results)
438 return (K results)
440 traversePrepared_
440 traversePrepared_
441− (UnsafeManipulation q :: Manipulation schema xs '[]) (list :: list x) =
441+ (UnsafeManipulation q :: Manipulation db xs '[]) (list :: list x) =
442 PQ $ \ (K conn) -> liftBase $ do
442 PQ $ \ (K conn) -> liftBase $ do
443 let temp = "temporary_statement"
443 let temp = "temporary_statement"
444 prepResultMaybe <- LibPQ.prepare conn temp q Nothing
444 prepResultMaybe <- LibPQ.prepare conn temp q Nothing
@@ -466,56 +466,56 @@ instance (MonadBase IO io, schema0 ~ schema, schema1 ~ schema)
466 y <- liftBase $ pq conn
466 y <- liftBase $ pq conn
467 return (K y)
467 return (K y)
469−instance MonadPQ schema m => MonadPQ schema (IdentityT m)
469+instance MonadPQ db m => MonadPQ db (IdentityT m)
470−instance MonadPQ schema m => MonadPQ schema (ReaderT r m)
470+instance MonadPQ db m => MonadPQ db (ReaderT r m)
471−instance MonadPQ schema m => MonadPQ schema (Strict.StateT s m)
471+instance MonadPQ db m => MonadPQ db (Strict.StateT s m)
472−instance MonadPQ schema m => MonadPQ schema (Lazy.StateT s m)
472+instance MonadPQ db m => MonadPQ db (Lazy.StateT s m)
473−instance (Monoid w, MonadPQ schema m) => MonadPQ schema (Strict.WriterT w m)
473+instance (Monoid w, MonadPQ db m) => MonadPQ db (Strict.WriterT w m)
474−instance (Monoid w, MonadPQ schema m) => MonadPQ schema (Lazy.WriterT w m)
474+instance (Monoid w, MonadPQ db m) => MonadPQ db (Lazy.WriterT w m)
475−instance MonadPQ schema m => MonadPQ schema (MaybeT m)
475+instance MonadPQ db m => MonadPQ db (MaybeT m)
476−instance MonadPQ schema m => MonadPQ schema (ExceptT e m)
476+instance MonadPQ db m => MonadPQ db (ExceptT e m)
477−instance (Monoid w, MonadPQ schema m) => MonadPQ schema (Strict.RWST r w s m)
477+instance (Monoid w, MonadPQ db m) => MonadPQ db (Strict.RWST r w s m)
478−instance (Monoid w, MonadPQ schema m) => MonadPQ schema (Lazy.RWST r w s m)
478+instance (Monoid w, MonadPQ db m) => MonadPQ db (Lazy.RWST r w s m)
479−instance MonadPQ schema m => MonadPQ schema (ContT r m)
479+instance MonadPQ db m => MonadPQ db (ContT r m)
481−instance (Monad m, schema0 ~ schema1)
481+instance (Monad m, db0 ~ db1)
482− => Applicative (PQ schema0 schema1 m) where
482+ => Applicative (PQ db0 db1 m) where
483 pure x = PQ $ \ _conn -> pure (K x)
483 pure x = PQ $ \ _conn -> pure (K x)
484 (<*>) = pqAp
484 (<*>) = pqAp
486−instance (Monad m, schema0 ~ schema1)
486+instance (Monad m, db0 ~ db1)
487− => Monad (PQ schema0 schema1 m) where
487+ => Monad (PQ db0 db1 m) where
488 return = pure
488 return = pure
489 (>>=) = flip pqBind
489 (>>=) = flip pqBind
491−instance schema0 ~ schema1 => MFunctor (PQ schema0 schema1) where
491+instance db0 ~ db1 => MFunctor (PQ db0 db1) where
492 hoist f (PQ pq) = PQ (f . pq)
492 hoist f (PQ pq) = PQ (f . pq)
494−instance schema0 ~ schema1 => MonadTrans (PQ schema0 schema1) where
494+instance db0 ~ db1 => MonadTrans (PQ db0 db1) where
495 lift m = PQ $ \ _conn -> do
495 lift m = PQ $ \ _conn -> do
497 return (K x)
497 return (K x)
499−instance schema0 ~ schema1 => MMonad (PQ schema0 schema1) where
499+instance db0 ~ db1 => MMonad (PQ db0 db1) where
500 embed f (PQ pq) = PQ $ \ conn -> do
500 embed f (PQ pq) = PQ $ \ conn -> do
501 evalPQ (f (pq conn)) conn
501 evalPQ (f (pq conn)) conn
503−instance (MonadBase b m, schema0 ~ schema1)
503+instance (MonadBase b m, db0 ~ db1)
504− => MonadBase b (PQ schema0 schema1 m) where
504+ => MonadBase b (PQ db0 db1 m) where
505 liftBase = lift . liftBase
505 liftBase = lift . liftBase
507-- | A snapshot of the state of a `PQ` computation.
507-- | A snapshot of the state of a `PQ` computation.
508−type PQRun schema =
508+type PQRun db =
509− forall m x. Monad m => PQ schema schema m x -> m (K x schema)
509+ forall m x. Monad m => PQ db db m x -> m (K x db)
511-- | Helper function in defining `MonadBaseControl` instance for `PQ`.
511-- | Helper function in defining `MonadBaseControl` instance for `PQ`.
512−pqliftWith :: Functor m => (PQRun schema -> m a) -> PQ schema schema m a
512+pqliftWith :: Functor m => (PQRun db -> m a) -> PQ db db m a
513pqliftWith f = PQ $ \ conn ->
513pqliftWith f = PQ $ \ conn ->
514 fmap K (f $ \ pq -> unPQ pq conn)
514 fmap K (f $ \ pq -> unPQ pq conn)
516−instance (MonadBaseControl b m, schema0 ~ schema1)
516+instance (MonadBaseControl b m, db0 ~ db1)
517− => MonadBaseControl b (PQ schema0 schema1 m) where
517+ => MonadBaseControl b (PQ db0 db1 m) where
518− type StM (PQ schema0 schema1 m) x = StM m (K x schema0)
518+ type StM (PQ db0 db1 m) x = StM m (K x db0)
519 liftBaseWith f =
519 liftBaseWith f =
520 pqliftWith $ \ run -> liftBaseWith $ \ runInBase -> f $ runInBase . run
520 pqliftWith $ \ run -> liftBaseWith $ \ runInBase -> f $ runInBase . run
521 restoreM = PQ . const . restoreM
521 restoreM = PQ . const . restoreM