4 Commits

Author SHA1 Message Date
2ab53c43b2 chore: prepare v1.2.1 2024-04-05 21:53:42 -05:00
500e67d793 fix: FromRow t bound on cursor 2024-04-05 21:53:37 -05:00
ca95e0aa94 chore: prepare v1.2.0 2024-04-05 21:49:36 -05:00
bc120b072c feat: UnresultT 2024-04-05 21:49:31 -05:00
5 changed files with 80 additions and 48 deletions

View File

@@ -255,59 +255,59 @@ the api of [`node-postgres`]:
- release clients with [`Pool.release`] or [`Pool.destroy`]
- release with [`Pool.end`]
[`Pool`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Pool#t:Pool
[`Config`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Pool#t:Config
[`Pool.make`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Pool#v:make
[`Pool.end`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Pool#v:end
[`Pool.connect`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Pool#v:connect
[`Pool.destroy`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Pool#v:destroy
[`Pool.release`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Pool#v:release
[`Pool`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Pool#t:Pool
[`Config`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Pool#t:Config
[`Pool.make`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Pool#v:make
[`Pool.end`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Pool#v:end
[`Pool.connect`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Pool#v:connect
[`Pool.destroy`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Pool#v:destroy
[`Pool.release`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Pool#v:release
[`Client`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Client#t:Client
[`Client.end`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Client#v:end
[`Client.make`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Client#v:make
[`Client.connected`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Client#v:connected
[`Client.query`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Client#v:query
[`Client.queryRaw`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Client#v:queryRaw
[`Client.exec`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Effect.Aff.Postgres.Client#v:exec
[`Client`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Client#t:Client
[`Client.end`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Client#v:end
[`Client.make`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Client#v:make
[`Client.connected`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Client#v:connected
[`Client.query`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Client#v:query
[`Client.queryRaw`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Client#v:queryRaw
[`Client.exec`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Effect.Aff.Postgres.Client#v:exec
[`Range`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Range#t:Range
[`Range.gt`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Range#v:gt
[`Range.gte`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Range#v:gte
[`Range.lt`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Range#v:lt
[`Range.lte`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Range#v:lte
[`Range`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Range#t:Range
[`Range.gt`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Range#v:gt
[`Range.gte`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Range#v:gte
[`Range.lt`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Range#v:lt
[`Range.lte`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Range#v:lte
[`Raw`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Raw#t:Raw
[`Null`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Raw#t:Null
[`Raw`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Raw#t:Raw
[`Null`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Raw#t:Null
[`Serialize`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres#t:Serialize
[`Deserialize`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres#t:Deserialize
[`Rep`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres#t:Rep
[`modifyPgTypes`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres#v:modifyPgTypes
[`Serialize`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres#t:Serialize
[`Deserialize`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres#t:Deserialize
[`Rep`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres#t:Rep
[`modifyPgTypes`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres#v:modifyPgTypes
[`Result`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Result#t:Result
[`FromRow`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Result#t:FromRow
[`FromRows`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Result#t:FromRows
[`Result`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Result#t:Result
[`FromRow`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Result#t:FromRow
[`FromRows`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Result#t:FromRows
[`Query`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Query#t:Query
[`AsQuery`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Query#t:AsQuery
[`Query`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Query#t:Query
[`AsQuery`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Query#t:AsQuery
[`Query.Builder`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Query.Builder#t:Builder
[`Query.Builder.param`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Query.Builder#v:param
[`Query.Builder.build`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Data.Postgres.Query.Builder#v:build
[`Query.Builder`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Query.Builder#t:Builder
[`Query.Builder.param`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Query.Builder#v:param
[`Query.Builder.build`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Data.Postgres.Query.Builder#v:build
[`MonadCursor`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#t:MonadCursor
[`MonadSession`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#t:MonadSession
[`CursorT`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#t:CursorT
[`SessionT`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#t:SessionT
[`PostgresT`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#t:PostgresT
[`cursor`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#v:cursor
[`session`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#v:session
[`transaction`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#v:transaction
[`runPostgres`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#v:runPostgres
[`query`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#v:query
[`exec`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#v:exec
[`exec_`]: https://pursuit.purescript.org///////packages/purescript-postgresql/1.1.1/docs/Control.Monad.Postgres#v:exec_
[`MonadCursor`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#t:MonadCursor
[`MonadSession`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#t:MonadSession
[`CursorT`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#t:CursorT
[`SessionT`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#t:SessionT
[`PostgresT`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#t:PostgresT
[`cursor`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#v:cursor
[`session`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#v:session
[`transaction`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#v:transaction
[`runPostgres`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#v:runPostgres
[`query`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#v:query
[`exec`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#v:exec
[`exec_`]: https://pursuit.purescript.org/////////packages/purescript-postgresql/1.2.1/docs/Control.Monad.Postgres#v:exec_
[`node-postgres`]: https://node-postgres.com/
[`pg-types`]: https://github.com/brianc/node-pg-types/

View File

@@ -1,7 +1,7 @@
package:
name: postgresql
publish:
version: '1.1.1'
version: '1.2.1'
license: 'GPL-3.0-or-later'
location:
githubOwner: 'cakekindel'

View File

@@ -103,7 +103,7 @@ fetchOne = Array.head <$> fetch 1
-- | Create a server-side cursor for a query in a transaction,
-- | and execute a `CursorT` with a view to the new cursor.
cursor :: forall m @t a q. AsQuery q => MonadAff m => MonadBracket Error Fiber m => MonadSession (SessionT m) => String -> q -> CursorT t (SessionT m) a -> PostgresT m a
cursor :: forall m @t a q. FromRow t => AsQuery q => MonadAff m => MonadBracket Error Fiber m => MonadSession (SessionT m) => String -> q -> CursorT t (SessionT m) a -> PostgresT m a
cursor cur q m =
transaction do
q' <- liftEffect $ asQuery q

View File

@@ -0,0 +1,32 @@
module Data.Postgres.Unresult where
import Prelude
import Control.Monad.Error.Class (class MonadThrow, liftMaybe)
import Control.Monad.Morph (hoist)
import Control.Monad.State (StateT(..), runStateT, state)
import Control.Monad.Trans.Class (lift)
import Data.Array as Array
import Data.Maybe (fromMaybe, maybe)
import Data.Postgres (class Deserialize, class Rep, RepT, deserialize, smash)
import Data.Postgres.Raw (Raw)
import Data.Postgres.Result (fromRow)
import Data.Tuple (fst)
import Data.Tuple.Nested ((/\))
import Effect.Aff (error)
import Effect.Class (class MonadEffect, liftEffect)
import Effect.Exception (Error)
-- | Monad used to incrementally deserialize columns from a row
type UnresultT m a = StateT {ix :: Int, row :: Array Raw} m a
-- | Run an `UnresultT`
unresult :: forall m a. Monad m => Array Raw -> UnresultT m a -> m a
unresult row m = fst <$> runStateT m {ix: 0, row}
-- | Take the next column from the row, unmarshalling into `a`
take :: forall m a. MonadThrow Error m => Deserialize a => MonadEffect m => UnresultT m a
take = do
raw <- state (\r -> Array.index r.row r.ix /\ r {ix = r.ix + 1})
raw' <- liftMaybe (error "Ran out of columns!") raw
liftEffect $ smash $ deserialize raw'

View File

@@ -41,7 +41,7 @@ derive newtype instance ReadForeign a => ReadForeign (JSON a)
foreign import modifyPgTypes :: Effect Unit
-- | The serialization & deserialization monad.
type RepT a = ExceptT (NonEmptyList ForeignError) Effect a
type RepT = ExceptT (NonEmptyList ForeignError) Effect
-- | Flatten to an Effect, `show`ing errors
smash :: forall a. RepT a -> Effect a