beam-postgres 0.5.0.0 → 0.5.1.0
raw patch · 5 files changed
+48/−9 lines, 5 filesdep +transformers-basedep ~aesonnew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: transformers-base
Dependency ranges changed: aeson
API changes (from Hackage documentation)
- Database.Beam.Postgres: PgEmptyRange :: PgRange a
+ Database.Beam.Postgres: PgEmptyRange :: PgRange (n :: *) a
- Database.Beam.Postgres: PgRange :: PgRangeBound a -> PgRangeBound a -> PgRange a
+ Database.Beam.Postgres: PgRange :: PgRangeBound a -> PgRangeBound a -> PgRange (n :: *) a
- Database.Beam.Postgres.Full: PgInsertOnConflict :: (tbl (QField QInternal) -> PgInsertOnConflictSyntax) -> PgInsertOnConflict
+ Database.Beam.Postgres.Full: PgInsertOnConflict :: (tbl (QField QInternal) -> PgInsertOnConflictSyntax) -> PgInsertOnConflict (tbl :: (* -> *) -> *)
- Database.Beam.Postgres.Full: anyConflict :: BeamHasInsertOnConflict be => SqlConflictTarget be table
+ Database.Beam.Postgres.Full: anyConflict :: forall (table :: (Type -> Type) -> Type). BeamHasInsertOnConflict be => SqlConflictTarget be table
- Database.Beam.Postgres.Full: data family SqlConflictAction be (table :: Type -> Type -> Type) :: Type;
+ Database.Beam.Postgres.Full: data family SqlConflictAction be (table :: Type -> Type -> Type);
- Database.Beam.Postgres.Full: insertOnConflict :: (BeamHasInsertOnConflict be, Beamable table) => DatabaseEntity be db (TableEntity table) -> SqlInsertValues be (table (QExpr be s)) -> SqlConflictTarget be table -> SqlConflictAction be table -> SqlInsert be table
+ Database.Beam.Postgres.Full: insertOnConflict :: forall table (db :: (Type -> Type) -> Type) s. (BeamHasInsertOnConflict be, Beamable table) => DatabaseEntity be db (TableEntity table) -> SqlInsertValues be (table (QExpr be s)) -> SqlConflictTarget be table -> SqlConflictAction be table -> SqlInsert be table
- Database.Beam.Postgres.Full: onConflictDoNothing :: BeamHasInsertOnConflict be => SqlConflictAction be table
+ Database.Beam.Postgres.Full: onConflictDoNothing :: forall (table :: (Type -> Type) -> Type). BeamHasInsertOnConflict be => SqlConflictAction be table
- Database.Beam.Postgres.Full: onConflictUpdateAll :: (BeamHasInsertOnConflict be, Beamable table) => SqlConflictAction be table
+ Database.Beam.Postgres.Full: onConflictUpdateAll :: forall be (table :: (Type -> Type) -> Type). (BeamHasInsertOnConflict be, Beamable table) => SqlConflictAction be table
Files
- ChangeLog.md +15/−0
- Database/Beam/Postgres/Connection.hs +18/−5
- Database/Beam/Postgres/PgSpecific.hs +1/−2
- beam-postgres.cabal +3/−2
- test/Database/Beam/Postgres/Test/Select.hs +11/−0
ChangeLog.md view
@@ -1,3 +1,14 @@+# 0.5.1.0++## Added features++ * `MonadBase` and `MonadBaseControl` instances for `Pg`++## Bug fixes++ * Fix possible memory corruption by copying row data+ * Remove invalid parentheses emitted by `pgUnnest`+ # 0.5.0.0 ## Interface changes@@ -25,6 +36,10 @@ * Only detect primary keys of tables in visible schemas * Fix emitting of `DECIMAL` type * Report JSON correct decoding errors instead of throwing `UnexpectedNull`++## Behavior changes++ * `runReturningOne` and `runResturningList` now fetch all rows at once instead of using cursors # 0.4.0.0
Database/Beam/Postgres/Connection.hs view
@@ -26,8 +26,10 @@ , postgresUriSyntax ) where import Control.Exception (SomeException(..), throwIO)+import Control.Monad.Base (MonadBase(..)) import Control.Monad.Free.Church import Control.Monad.IO.Class+import Control.Monad.Trans.Control (MonadBaseControl(..)) import Database.Beam hiding (runDelete, runUpdate, runInsert, insert) import Database.Beam.Backend.SQL.BeamExtensions@@ -141,7 +143,7 @@ step (ParseOneField _) curCol colCount _ | curCol >= colCount = pure (Left (BeamRowReadError (Just (fromIntegral curCol)) (ColumnNotEnoughColumns (fromIntegral colCount)))) step (ParseOneField (next' :: next -> _)) curCol colCount (field:remainingFields) =- do fieldValue <- Pg.getvalue res rowIdx (Pg.Col curCol)+ do fieldValue <- Pg.getvalue' res rowIdx (Pg.Col curCol) res' <- Pg.runConversion (Pg.fromField field fieldValue) conn case res' of Pg.Errors errs ->@@ -182,7 +184,7 @@ withPgDebug dbg conn (Pg action) = let finish x = pure (Right x) step (PgLiftIO io next) = io >>= next- step (PgLiftWithHandle withConn next) = withConn conn >>= next+ step (PgLiftWithHandle withConn next) = withConn dbg conn >>= next step (PgFetchNext next) = next Nothing step (PgRunReturning CursorBatching (PgCommandSyntax PgCommandTypeQuery syntax)@@ -232,7 +234,7 @@ stepReturningNone :: forall a. PgF (IO (Either BeamRowReadError a)) -> IO (Either BeamRowReadError a) stepReturningNone (PgLiftIO action' next) = action' >>= next- stepReturningNone (PgLiftWithHandle withConn next) = withConn conn >>= next+ stepReturningNone (PgLiftWithHandle withConn next) = withConn dbg conn >>= next stepReturningNone (PgFetchNext next) = next Nothing stepReturningNone (PgRunReturning {}) = pure (Left (BeamRowReadError Nothing (ColumnErrorInternal "Nested queries not allowed"))) @@ -286,7 +288,7 @@ PgFetchNext :: FromBackendRow Postgres x => (Maybe x -> next) -> PgF next- PgLiftWithHandle :: (Pg.Connection -> IO a) -> (a -> next) -> PgF next+ PgLiftWithHandle :: ((String -> IO ()) -> Pg.Connection -> IO a) -> (a -> next) -> PgF next deriving instance Functor PgF -- | How to fetch results.@@ -309,8 +311,19 @@ instance MonadIO Pg where liftIO x = liftF (PgLiftIO x id) +instance MonadBase IO Pg where+ liftBase = liftIO++instance MonadBaseControl IO Pg where+ type StM Pg a = a++ liftBaseWith action =+ liftF (PgLiftWithHandle (\dbg conn -> action (runBeamPostgresDebug dbg conn)) id)++ restoreM = pure+ liftIOWithHandle :: (Pg.Connection -> IO a) -> Pg a-liftIOWithHandle f = liftF (PgLiftWithHandle f id)+liftIOWithHandle f = liftF (PgLiftWithHandle (\_ -> f) id) runBeamPostgresDebug :: (String -> IO ()) -> Pg.Connection -> Pg a -> IO a runBeamPostgresDebug dbg conn action =
Database/Beam/Postgres/PgSpecific.hs view
@@ -1407,8 +1407,7 @@ . Beamable tbl => QExpr Postgres s (PgSetOf tbl) -> Q Postgres db s (QExprTable Postgres s tbl)-pgUnnest (QExpr q) =- pgUnnest' (\t -> pgParens (fromPgExpression (q t)))+pgUnnest (QExpr q) = pgUnnest' $ fromPgExpression . q data PgUnnestArrayTbl a f = PgUnnestArrayTbl (C f a) deriving Generic
beam-postgres.cabal view
@@ -1,5 +1,5 @@ name: beam-postgres-version: 0.5.0.0+version: 0.5.1.0 synopsis: Connection layer between beam and postgres description: Beam driver for <https://www.postgresql.org/ PostgreSQL>, an advanced open-source RDBMS homepage: https://haskell-beam.github.io/beam/user-guide/backends/beam-postgres@@ -50,7 +50,7 @@ monad-control >=1.0 && <1.1, mtl >=2.1 && <2.3, conduit >=1.2 && <1.4,- aeson >=0.11 && <1.5,+ aeson >=0.11 && <1.6, uuid-types >=1.0 && <1.1, case-insensitive >=1.2 && <1.3, scientific >=0.3 && <0.4,@@ -58,6 +58,7 @@ network-uri >=2.6 && <2.7, unordered-containers >= 0.2 && <0.3, tagged >=0.8 && <0.9,+ transformers-base >=0.4 && <0.5, haskell-src-exts >=1.18 && <1.24 default-language: Haskell2010
test/Database/Beam/Postgres/Test/Select.hs view
@@ -40,6 +40,7 @@ ] , testInRowValues getConn , testReturningMany getConn+ , testPgUnnest getConn ] testPgArrayToJSON :: IO ByteString -> TestTree@@ -103,3 +104,13 @@ testFunction :: IO ByteString -> String -> (Connection -> Assertion) -> TestTree testFunction getConn name mkAssertion = testCase name $ withTestPostgres name getConn mkAssertion++-- | Regression test for <https://github.com/haskell-beam/beam/issues/541 #541>+testPgUnnest :: IO ByteString -> TestTree+testPgUnnest getConn = testCase "pgUnnest works" $+ withTestPostgres "pg_unnest" getConn $ \conn -> do+ let values = [Bool True, Number 1]+ result <- runBeamPostgres conn $ runSelectReturningList $ select $+ pgUnnest $ pgJsonArrayElements $ val_ $+ PgJSONB $ Array $ V.fromList values+ assertEqual "result" (PgJSONB <$> values) $ pgJsonElement <$> result