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