diff --git a/cabal.project.non-nix b/cabal.project.non-nix index b3aca71af..e8067cb8b 100644 --- a/cabal.project.non-nix +++ b/cabal.project.non-nix @@ -4,7 +4,12 @@ packages: . -source-repository-package - type: git - location: https://github.com/PostgREST/hasql-pool.git - tag: 4d462c4d47d762effefc7de6c85eaed55f144f1d +-- Example of depending on a forked repository (the same dependency +-- would be mentioned in nix/overlays/haskell-packages.nix and +-- stack.yaml, and should refer to a main branch commit of the +-- repository. +-- +-- source-repository-package +-- type: git +-- location: https://github.com/PostgREST/hasql-pool.git +-- tag: 4d462c4d47d762effefc7de6c85eaed55f144f1d diff --git a/nix/overlays/haskell-packages.nix b/nix/overlays/haskell-packages.nix index 14a70f200..9e700551e 100644 --- a/nix/overlays/haskell-packages.nix +++ b/nix/overlays/haskell-packages.nix @@ -32,14 +32,26 @@ let # To get the sha256: # nix-prefetch-url --unpack https://github.com///archive/.tar.gz - hasql-pool = lib.dontCheck ( - prev.callCabal2nix "hasql-pool" - (super.fetchFromGitHub { - owner = "PostgREST"; - repo = "hasql-pool"; - rev = "4d462c4d47d762effefc7de6c85eaed55f144f1d"; # master as of 2022-08-26 - sha256 = "sha256-UwX1PynimrQHm1KCs4BQXMwYYY3h4T5UAkgtEJ0EZQQ="; - }) + hasql = lib.dontCheck prev.hasql_1_6_0_1; + hasql-dynamic-statements = lib.dontCheck prev.hasql-dynamic-statements_0_3_1_2; + hasql-transaction = lib.dontCheck prev.hasql-transaction_1_0_1_2; + + hasql-notifications = lib.dontCheck + (prev.callHackageDirect + { + pkg = "hasql-notifications"; + ver = "0.2.0.3"; + sha256 = "sha256-x8EGEMVYSw4O1Kn6MxOB+/3y3ITxqESDfrYgM8B1hOw="; + } + { }); + + hasql-pool = lib.dontCheck + (prev.callHackageDirect + { + pkg = "hasql-pool"; + ver = "0.8.0.2"; + sha256 = "sha256-9GE9qyymTLXw4ZW6LbNnn4T2tCgNYVEuBIPcUA83xCg="; + } { }); } // extraOverrides final prev; in diff --git a/postgrest.cabal b/postgrest.cabal index 9525eef0f..16483bf5c 100644 --- a/postgrest.cabal +++ b/postgrest.cabal @@ -85,10 +85,10 @@ library , cookie >= 0.4.2 && < 0.5 , either >= 4.4.1 && < 5.1 , gitrev >= 1.2 && < 1.4 - , hasql >= 1.4 && < 1.6 + , hasql >= 1.6 && < 1.7 , hasql-dynamic-statements >= 0.3.1 && < 0.4 , hasql-notifications >= 0.1 && < 0.3 - , hasql-pool >= 0.7.2 && < 0.8 + , hasql-pool >= 0.8.0.2 && < 0.9 , hasql-transaction >= 1.0.1 && < 1.1 , heredoc >= 0.2 && < 0.3 , http-types >= 0.12.2 && < 0.13 @@ -226,7 +226,7 @@ test-suite spec , bytestring >= 0.10.8 && < 0.12 , case-insensitive >= 1.2 && < 1.3 , containers >= 0.5.7 && < 0.7 - , hasql-pool >= 0.7.2 && < 0.8 + , hasql-pool >= 0.8.0.2 && < 0.9 , hasql-transaction >= 1.0.1 && < 1.1 , heredoc >= 0.2 && < 0.3 , hspec >= 2.3 && < 2.9 @@ -267,9 +267,9 @@ test-suite querycost , case-insensitive >= 1.2 && < 1.3 , containers >= 0.5.7 && < 0.7 , contravariant >= 1.4 && < 1.6 - , hasql >= 1.4 && < 1.6 + , hasql >= 1.6 && < 1.7 , hasql-dynamic-statements >= 0.3.1 && < 0.4 - , hasql-pool >= 0.7.2 && < 0.8 + , hasql-pool >= 0.8.0.2 && < 0.9 , hasql-transaction >= 1.0.1 && < 1.1 , heredoc >= 0.2 && < 0.3 , hspec >= 2.3 && < 2.9 diff --git a/src/PostgREST/AppState.hs b/src/PostgREST/AppState.hs index 0770f4eea..e4cb983ea 100644 --- a/src/PostgREST/AppState.hs +++ b/src/PostgREST/AppState.hs @@ -97,7 +97,7 @@ destroy = destroyPool initPool :: AppConfig -> IO SQL.Pool initPool AppConfig{..} = - SQL.acquire configDbPoolSize $ toUtf8 configDbUri + SQL.acquire configDbPoolSize Nothing $ toUtf8 configDbUri -- | Run an action with a database connection. usePool :: AppState -> SQL.Session a -> IO (Either SQL.UsageError a) @@ -106,7 +106,7 @@ usePool AppState{..} = SQL.use statePool -- | Flush the connection pool so that any future use of the pool will -- use connections freshly established after this call. flushPool :: AppState -> IO () -flushPool AppState{..} = SQL.flush statePool +flushPool AppState{..} = SQL.release statePool -- | Destroy the pool on shutdown. destroyPool :: AppState -> IO () diff --git a/src/PostgREST/Error.hs b/src/PostgREST/Error.hs index 642824b82..27930ad22 100644 --- a/src/PostgREST/Error.hs +++ b/src/PostgREST/Error.hs @@ -231,9 +231,9 @@ instance JSON.ToJSON SQL.UsageError where "details" .= (T.decodeUtf8With T.lenientDecode $ fromMaybe "" e :: Text), "hint" .= JSON.Null] toJSON (SQL.SessionUsageError e) = JSON.toJSON e -- SQL.Error - toJSON SQL.PoolIsReleasedUsageError = JSON.object [ - "code" .= InternalErrorCode00, - "message" .= ("Use of released pool" :: Text), + toJSON SQL.AcquisitionTimeoutUsageError = JSON.object [ + "code" .= ConnectionErrorCode00, + "message" .= ("Timed out acquiring connection from connection pool." :: Text), "details" .= JSON.Null, "hint" .= JSON.Null] @@ -241,11 +241,11 @@ instance JSON.ToJSON SQL.QueryError where toJSON (SQL.QueryError _ _ e) = JSON.toJSON e instance JSON.ToJSON SQL.CommandError where - toJSON (SQL.ResultError (SQL.ServerError c m d h)) = JSON.object [ - "code" .= (T.decodeUtf8 c :: Text), - "message" .= (T.decodeUtf8 m :: Text), - "details" .= (fmap T.decodeUtf8 d :: Maybe Text), - "hint" .= (fmap T.decodeUtf8 h :: Maybe Text)] + toJSON (SQL.ResultError (SQL.ServerError c m d h _p)) = JSON.object [ + "code" .= (T.decodeUtf8 c :: Text), + "message" .= (T.decodeUtf8 m :: Text), + "details" .= (fmap T.decodeUtf8 d :: Maybe Text), + "hint" .= (fmap T.decodeUtf8 h :: Maybe Text)] toJSON (SQL.ResultError resultError) = JSON.object [ "code" .= InternalErrorCode00, @@ -259,13 +259,14 @@ instance JSON.ToJSON SQL.CommandError where "details" .= (fmap T.decodeUtf8 d :: Maybe Text), "hint" .= JSON.Null] + pgErrorStatus :: Bool -> SQL.UsageError -> HTTP.Status pgErrorStatus _ (SQL.ConnectionUsageError _) = HTTP.status503 -pgErrorStatus _ SQL.PoolIsReleasedUsageError = HTTP.status500 +pgErrorStatus _ SQL.AcquisitionTimeoutUsageError = HTTP.status504 pgErrorStatus _ (SQL.SessionUsageError (SQL.QueryError _ _ (SQL.ClientError _))) = HTTP.status503 pgErrorStatus authed (SQL.SessionUsageError (SQL.QueryError _ _ (SQL.ResultError rError))) = case rError of - (SQL.ServerError c m _ _) -> + (SQL.ServerError c m _ _ _) -> case BS.unpack c of '0':'8':_ -> HTTP.status503 -- pg connection err '0':'9':_ -> HTTP.status500 -- triggered action exception @@ -310,17 +311,17 @@ checkIsFatal (PgError _ (SQL.ConnectionUsageError e)) checkIsFatal (PgError _ (SQL.SessionUsageError (SQL.QueryError _ _ (SQL.ResultError serverError)))) = case serverError of -- Check for a syntax error (42601 is the pg code). This would mean the error is on our part somehow, so we treat it as fatal. - SQL.ServerError "42601" _ _ _ + SQL.ServerError "42601" _ _ _ _ -> Just "Hint: This is probably a bug in PostgREST, please report it at https://github.com/PostgREST/postgrest/issues" -- Check for a "prepared statement already exists" error (Code 42P05: duplicate_prepared_statement). -- This would mean that a connection pooler in transaction mode is being used -- while prepared statements are enabled in the PostgREST configuration, -- both of which are incompatible with each other. - SQL.ServerError "42P05" _ _ _ + SQL.ServerError "42P05" _ _ _ _ -> Just "Hint: If you are using connection poolers in transaction mode, try setting db-prepared-statements to false." -- Check for a "transaction blocks not allowed in statement pooling mode" error (Code 08P01: protocol_violation). -- This would mean that a connection pooler in statement mode is being used which is not supported in PostgREST. - SQL.ServerError "08P01" "transaction blocks not allowed in statement pooling mode" _ _ + SQL.ServerError "08P01" "transaction blocks not allowed in statement pooling mode" _ _ _ -> Just "Hint: Connection poolers in statement mode are not supported." _ -> Nothing checkIsFatal _ = Nothing diff --git a/stack.yaml b/stack.yaml index ff81f1c32..407f2702f 100644 --- a/stack.yaml +++ b/stack.yaml @@ -12,11 +12,13 @@ nix: extra-deps: - HTTP-4000.3.16@sha256:6042643c15a0b43e522a6693f1e322f05000d519543a84149cb80aeffee34f71,5947 - configurator-pg-0.2.6@sha256:cd9b06a458428e493a4d6def725af7ab1ab0fef678fbd871f9586fc7f9aa70be,2849 - - hasql-dynamic-statements-0.3.1.1@sha256:2cfe6e75990e690f595a87cbe553f2e90fcd738610f6c66749c81cc4396b2cc4,2675 - - hasql-implicits-0.1.0.4@sha256:0848d3cbc9d94e1e539948fa0be4d0326b26335034161bf8076785293444ca6f,1361 + - hasql-1.6.0.1@sha256:adb92e68a3741f422a3bb776a12d5cf2bb83303778f343106f9a1cc2b4fcdf73,6628 + - hasql-dynamic-statements-0.3.1.2@sha256:417aa533c84f074e2fa16bb2c4d4231326aa512097dd1025d915388e56acd1eb,2675 + - hasql-implicits-0.1.0.5@sha256:d16aacad6dc21428d72447d3ae8bcc03839a2f0aa1ec29c797ed9aca4609f9af,1361 + - hasql-notifications-0.2.0.3@sha256:aca3f7ee847a8f0b7ef6f989dc48f4a094a06c1a34e92aa3c8bb230085966ea6,2027 + - hasql-pool-0.8.0.2@sha256:15473f336c2bd1da161cd03635841f38b0c177d7b8662762c8708c239a428f04,1907 + - hasql-transaction-1.0.1.2@sha256:297b158cd1f0727f9b0e175bd7d3741c1bcb725a8094956d0ee79b41aafdb30a,2890 - lens-aeson-1.1.3@sha256:52c8eaecd2d1c2a969c0762277c4a8ee72c339a686727d5785932e72ef9c3050,1764 - optparse-applicative-0.16.1.0@sha256:418c22ed6a19124d457d96bc66bd22c93ac22fad0c7100fe4972bbb4ac989731,4982 - protolude-0.3.2@sha256:2a38b3dad40d238ab644e234b692c8911423f9d3ed0e36b62287c4a698d92cd1,2240 - ptr-0.16.8.2@sha256:708ebb95117f2872d2c5a554eb6804cf1126e86abe793b2673f913f14e5eb1ac,3959 - - git: https://github.com/PostgREST/hasql-pool.git - commit: 4d462c4d47d762effefc7de6c85eaed55f144f1d diff --git a/stack.yaml.lock b/stack.yaml.lock index cacfa1bc8..9164227a9 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -4,6 +4,13 @@ # https://docs.haskellstack.org/en/stable/lock_files packages: +- completed: + hackage: hasql-pool-0.8.0.2@sha256:15473f336c2bd1da161cd03635841f38b0c177d7b8662762c8708c239a428f04,1907 + pantry-tree: + size: 505 + sha256: 495dfdf8b7f7d910e2e8a7a7e8d71c8dbf9d439e048de5bc2a66a762011cbdc2 + original: + hackage: hasql-pool-0.8.0.2 - completed: hackage: HTTP-4000.3.16@sha256:6042643c15a0b43e522a6693f1e322f05000d519543a84149cb80aeffee34f71,5947 pantry-tree: @@ -19,19 +26,40 @@ packages: original: hackage: configurator-pg-0.2.6@sha256:cd9b06a458428e493a4d6def725af7ab1ab0fef678fbd871f9586fc7f9aa70be,2849 - completed: - hackage: hasql-dynamic-statements-0.3.1.1@sha256:2cfe6e75990e690f595a87cbe553f2e90fcd738610f6c66749c81cc4396b2cc4,2675 + hackage: hasql-1.6.0.1@sha256:adb92e68a3741f422a3bb776a12d5cf2bb83303778f343106f9a1cc2b4fcdf73,6628 + pantry-tree: + size: 2622 + sha256: c7b9df36feb75fe43c4e3804ba1eb61e37a39fa97173c5eed35245b17d10fd8e + original: + hackage: hasql-1.6.0.1@sha256:adb92e68a3741f422a3bb776a12d5cf2bb83303778f343106f9a1cc2b4fcdf73,6628 +- completed: + hackage: hasql-dynamic-statements-0.3.1.2@sha256:417aa533c84f074e2fa16bb2c4d4231326aa512097dd1025d915388e56acd1eb,2675 pantry-tree: size: 595 - sha256: b84ae10a5c776f88f546df73bc957a35e61056400b7e805dad0b254612907e97 + sha256: 91696d3f3e0ef3254772ae5a8e4e89be68285febb49b302ed83d85ac4037a417 original: - hackage: hasql-dynamic-statements-0.3.1.1@sha256:2cfe6e75990e690f595a87cbe553f2e90fcd738610f6c66749c81cc4396b2cc4,2675 + hackage: hasql-dynamic-statements-0.3.1.2@sha256:417aa533c84f074e2fa16bb2c4d4231326aa512097dd1025d915388e56acd1eb,2675 - completed: - hackage: hasql-implicits-0.1.0.4@sha256:0848d3cbc9d94e1e539948fa0be4d0326b26335034161bf8076785293444ca6f,1361 + hackage: hasql-implicits-0.1.0.5@sha256:d16aacad6dc21428d72447d3ae8bcc03839a2f0aa1ec29c797ed9aca4609f9af,1361 pantry-tree: size: 264 - sha256: d49af8f8749ab7039fa668af4b78f997f7fa2928b4aded6798f573a3d08e76a0 + sha256: 0451b99a0a1d02db673d0c40acdf60d4e769e15852eed9e8dc05bffaf43efb70 original: - hackage: hasql-implicits-0.1.0.4@sha256:0848d3cbc9d94e1e539948fa0be4d0326b26335034161bf8076785293444ca6f,1361 + hackage: hasql-implicits-0.1.0.5@sha256:d16aacad6dc21428d72447d3ae8bcc03839a2f0aa1ec29c797ed9aca4609f9af,1361 +- completed: + hackage: hasql-notifications-0.2.0.3@sha256:aca3f7ee847a8f0b7ef6f989dc48f4a094a06c1a34e92aa3c8bb230085966ea6,2027 + pantry-tree: + size: 452 + sha256: 999f0f2856a00d21f4498a8a58452bbefc4ea972fe2984fd234a68a5fe61d98b + original: + hackage: hasql-notifications-0.2.0.3@sha256:aca3f7ee847a8f0b7ef6f989dc48f4a094a06c1a34e92aa3c8bb230085966ea6,2027 +- completed: + hackage: hasql-transaction-1.0.1.2@sha256:297b158cd1f0727f9b0e175bd7d3741c1bcb725a8094956d0ee79b41aafdb30a,2890 + pantry-tree: + size: 983 + sha256: 3679e6d5c835cc17a8fa0c252b8221e282880044b7219aa1de2531bbd5c40691 + original: + hackage: hasql-transaction-1.0.1.2@sha256:297b158cd1f0727f9b0e175bd7d3741c1bcb725a8094956d0ee79b41aafdb30a,2890 - completed: hackage: lens-aeson-1.1.3@sha256:52c8eaecd2d1c2a969c0762277c4a8ee72c339a686727d5785932e72ef9c3050,1764 pantry-tree: @@ -60,17 +88,6 @@ packages: sha256: 557c438345de19f82bf01d676100da2a191ef06f624e7a4b90b09ac17cbb52a5 original: hackage: ptr-0.16.8.2@sha256:708ebb95117f2872d2c5a554eb6804cf1126e86abe793b2673f913f14e5eb1ac,3959 -- completed: - name: hasql-pool - version: 0.7.2 - git: https://github.com/PostgREST/hasql-pool.git - pantry-tree: - size: 570 - sha256: a388a9fc47252f7ba06874bc7e8fca769e6f33752320a29724801c298be00816 - commit: 4d462c4d47d762effefc7de6c85eaed55f144f1d - original: - git: https://github.com/PostgREST/hasql-pool.git - commit: 4d462c4d47d762effefc7de6c85eaed55f144f1d snapshots: - completed: size: 618951 diff --git a/test/spec/Main.hs b/test/spec/Main.hs index 82b6832fa..a011f2bb6 100644 --- a/test/spec/Main.hs +++ b/test/spec/Main.hs @@ -64,7 +64,7 @@ import qualified Feature.RpcPreRequestGucsSpec main :: IO () main = do - pool <- P.acquire 3 $ toUtf8 $ configDbUri testCfg + pool <- P.acquire 3 Nothing $ toUtf8 $ configDbUri testCfg actualPgVersion <- either (panic . show) id <$> P.use pool queryPgVersion diff --git a/test/spec/QueryCost.hs b/test/spec/QueryCost.hs index 739536b7b..9c3dcd942 100644 --- a/test/spec/QueryCost.hs +++ b/test/spec/QueryCost.hs @@ -24,7 +24,7 @@ import Test.Hspec main :: IO () main = do - pool <- P.acquire 3 "postgresql://" + pool <- P.acquire 3 Nothing "postgresql://" hspec $ describe "QueryCost" $ context "call proc query" $ do