@@ -214,21 +214,34 @@ initPool AppConfig{..} observer = do
214214-- | Run an action with a database connection.
215215usePool :: AppState -> SQL. Session a -> IO (Either SQL. UsageError a )
216216usePool AppState {stateObserver= observer, stateMainThreadId= mainThreadId, .. } sess = do
217- observer PoolRequest
217+ observer PoolRequest
218218
219- res <- SQL. use statePool sess
219+ res <- SQL. use statePool sess
220220
221- observer PoolRequestFullfilled
221+ observer PoolRequestFullfilled
222222
223- whenLeft res (\ case
224- SQL. AcquisitionTimeoutUsageError ->
225- observer $ PoolAcqTimeoutObs SQL. AcquisitionTimeoutUsageError
226- err@ (SQL. ConnectionUsageError e) ->
227- let failureMessage = BS. unpack $ fromMaybe mempty e in
228- when ((" FATAL: password authentication failed" `isInfixOf` failureMessage) || (" no password supplied" `isInfixOf` failureMessage)) $ do
229- observer $ ExitDBFatalError ServerAuthError err
230- killThread mainThreadId
231- err@ (SQL. SessionUsageError (SQL. QueryError tpl _ (SQL. ResultError resultErr))) -> do
223+ whenLeft res (\ case
224+ SQL. AcquisitionTimeoutUsageError ->
225+ observer $ PoolAcqTimeoutObs SQL. AcquisitionTimeoutUsageError
226+ err@ (SQL. ConnectionUsageError e) ->
227+ let failureMessage = BS. unpack $ fromMaybe mempty e in
228+ when ((" FATAL: password authentication failed" `isInfixOf` failureMessage) || (" no password supplied" `isInfixOf` failureMessage)) $ do
229+ observer $ ExitDBFatalError ServerAuthError err
230+ killThread mainThreadId
231+ err@ (SQL. SessionUsageError (SQL. QueryError tpl _ (SQL. ResultError resultErr))) ->
232+ handleResultError err tpl resultErr
233+ err@ (SQL. SessionUsageError (SQL. PipelineError (SQL. ResultError resultErr))) ->
234+ -- Passing the empty template will not work for schema cache queries, see TODO further below.
235+ handleResultError err mempty resultErr
236+ err@ (SQL. SessionUsageError (SQL. QueryError _ _ (SQL. ClientError _))) ->
237+ -- An error on the client-side, usually indicates problems with connection
238+ observer $ QueryErrorCodeHighObs err
239+ SQL. SessionUsageError (SQL. PipelineError (SQL. ClientError _)) -> pure ()
240+ )
241+
242+ return res
243+ where
244+ handleResultError err tpl resultErr = do
232245 case resultErr of
233246 SQL. UnexpectedResult {} -> do
234247 observer $ ExitDBFatalError ServerPgrstBug err
@@ -261,12 +274,6 @@ usePool AppState{stateObserver=observer, stateMainThreadId=mainThreadId, ..} ses
261274 SQL. ServerError {} ->
262275 when (Error. status (Error. PgError False err) >= HTTP. status500) $
263276 observer $ QueryErrorCodeHighObs err
264- err@ (SQL. SessionUsageError (SQL. QueryError _ _ (SQL. ClientError _))) ->
265- -- An error on the client-side, usually indicates problems wth connection
266- observer $ QueryErrorCodeHighObs err
267- )
268-
269- return res
270277
271278-- | Flush the connection pool so that any future use of the pool will
272279-- use connections freshly established after this call.
0 commit comments