@@ -5,6 +5,7 @@ module Database.PostgreSQL.PQTypes.Internal.Connection
55 , ConnectionData (.. )
66 , withConnectionData
77 , ConnectionStats (.. )
8+ , initialConnectionStats
89 , ConnectionSettings (.. )
910 , defaultConnectionSettings
1011 , ConnectionSourceM (.. )
@@ -42,6 +43,7 @@ import Data.Text.Encoding qualified as T
4243import Foreign.C.String
4344import Foreign.ForeignPtr
4445import Foreign.Ptr
46+ import GHC.Clock (getMonotonicTime )
4547import GHC.Conc (closeFdWith )
4648import GHC.Stack
4749
@@ -95,17 +97,20 @@ data ConnectionStats = ConnectionStats
9597 -- ^ Number of values fetched from the database.
9698 , statsParams :: ! Int
9799 -- ^ Number of parameters sent to the database.
100+ , statsTime :: Double
101+ -- ^ Time spent executing queries (in seconds).
98102 }
99103 deriving (Eq , Ord , Show )
100104
101105-- | Initial connection statistics.
102- initialStats :: ConnectionStats
103- initialStats =
106+ initialConnectionStats :: ConnectionStats
107+ initialConnectionStats =
104108 ConnectionStats
105109 { statsQueries = 0
106110 , statsRows = 0
107111 , statsValues = 0
108112 , statsParams = 0
113+ , statsTime = 0
109114 }
110115
111116-- | Representation of a connection object.
@@ -200,7 +205,7 @@ poolSource cs mkPoolConfig = do
200205
201206 clearStats conn@ (Connection mv) = do
202207 liftBase . modifyMVar_ mv $ \ mconn ->
203- pure $ (\ cd -> cd {cdStats = initialStats }) <$> mconn
208+ pure $ (\ cd -> cd {cdStats = initialConnectionStats }) <$> mconn
204209 pure conn
205210
206211----------------------------------------
@@ -230,7 +235,7 @@ connect ConnectionSettings {..} = mask $ \unmask -> do
230235 ConnectionData
231236 { cdPtr = connPtr
232237 , cdBackendPid = noBackendPid
233- , cdStats = initialStats
238+ , cdStats = initialConnectionStats
234239 , cdPreparedQueries = preparedQueries
235240 }
236241 F. forM_ csRole $ \ role -> runQueryIO conn $ " SET ROLE " <> role
@@ -380,14 +385,17 @@ runQueryImpl fname conn sql execSql = do
380385 -- are able to receive asynchronous exceptions (assuming that threaded GHC
381386 -- runtime system is used) and react appropriately.
382387 queryRunner <- async . restore $ do
388+ t1 <- getMonotonicTime
383389 (paramCount, res) <- execSql cd
390+ t2 <- getMonotonicTime
384391 affected <- withForeignPtr res $ verifyResult sql cdBackendPid cdPtr
385392 stats' <- case affected of
386393 Left _ ->
387394 pure
388395 cdStats
389396 { statsQueries = statsQueries cdStats + 1
390397 , statsParams = statsParams cdStats + paramCount
398+ , statsTime = statsTime cdStats + (t2 - t1)
391399 }
392400 Right rows -> do
393401 columns <- fromIntegral <$> withForeignPtr res c_PQnfields
@@ -397,6 +405,7 @@ runQueryImpl fname conn sql execSql = do
397405 , statsRows = statsRows cdStats + rows
398406 , statsValues = statsValues cdStats + (rows * columns)
399407 , statsParams = statsParams cdStats + paramCount
408+ , statsTime = statsTime cdStats + (t2 - t1)
400409 }
401410 pure (cd {cdStats = stats'}, (either id id affected, res))
402411 -- If we receive an exception while waiting for the execution to complete,
0 commit comments