packages feed

hasql-1.9: threads-test/Main.hs

module Main where

import Hasql.Connection qualified
import Hasql.Connection.Setting qualified
import Hasql.Connection.Setting.Connection qualified
import Hasql.Connection.Setting.Connection.Param qualified
import Hasql.Session qualified
import Main.Statements qualified as Statements
import Prelude

main :: IO ()
main =
  acquire >>= use
  where
    acquire =
      (,) <$> acquire <*> acquire
      where
        acquire =
          join
            $ fmap (either (fail . show) return)
            $ Hasql.Connection.acquire connectionSettings
          where
            connectionSettings =
              [ Hasql.Connection.Setting.connection
                  ( Hasql.Connection.Setting.Connection.params
                      [ Hasql.Connection.Setting.Connection.Param.host "localhost",
                        Hasql.Connection.Setting.Connection.Param.port 5432,
                        Hasql.Connection.Setting.Connection.Param.user "postgres",
                        Hasql.Connection.Setting.Connection.Param.password "postgres",
                        Hasql.Connection.Setting.Connection.Param.dbname "postgres"
                      ]
                  )
              ]
    use (connection1, connection2) =
      do
        beginVar <- newEmptyMVar
        finishVar <- newEmptyMVar
        forkIO $ do
          traceM "1: in"
          putMVar beginVar ()
          session connection1 (Hasql.Session.statement 0.2 Statements.selectSleep)
          traceM "1: out"
          void (tryPutMVar finishVar False)
        forkIO $ do
          takeMVar beginVar
          traceM "2: in"
          session connection2 (Hasql.Session.statement 0.1 Statements.selectSleep)
          traceM "2: out"
          void (tryPutMVar finishVar True)
        bool exitFailure exitSuccess . traceShowId =<< takeMVar finishVar
      where
        session connection session =
          Hasql.Session.run session connection
            >>= either (fail . show) return