arbiter-simple-0.1.0.0
arbiter-simple
Safe HaskellNone
LanguageGHC2024

Arbiter.Simple.SimpleDb

Description

The postgresql-simple database monad with a built-in MonadArbiter instance:

import Arbiter.Core qualified as Arb
import Arbiter.Simple qualified as ArbS
import Control.Monad (void)

myFunction :: ArbS.SimpleDb MyRegistry IO ()
myFunction = void $ Arb.insertJob (Arb.defaultJob myPayload)
Synopsis

Database monad

newtype SimpleDb (registry :: JobPayloadRegistry) (m :: Type -> Type) aSource #

The postgresql-simple database monad.

Constructors

SimpleDb 

Fields

Instances

Instances details
Monad m => HasPoolState Connection (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

MonadTrans (SimpleDb registry) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

lift :: Monad m => m a -> SimpleDb registry m a#

Monad m => MonadReader (SimpleEnv registry) (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

ask :: SimpleDb registry m (SimpleEnv registry)#

local :: (SimpleEnv registry -> SimpleEnv registry) -> SimpleDb registry m a -> SimpleDb registry m a#

reader :: (SimpleEnv registry -> a) -> SimpleDb registry m a#

MonadUnliftIO m => MonadArbiter (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Associated Types

type RegistryOf (SimpleDb registry m) 
Instance details

Defined in Arbiter.Simple.SimpleDb

type RegistryOf (SimpleDb registry m) = registry

Methods

getSchema :: SimpleDb registry m SchemaName#

executeQuery :: Query a -> SimpleDb registry m [a]#

executeQueryPrepared :: Query a -> SimpleDb registry m [a]#

executeStatement :: Query a -> SimpleDb registry m Int64#

withDbTransaction :: SimpleDb registry m a -> SimpleDb registry m a#

runHandlerWithConnection :: JobHandler (SimpleDb registry m) payload (ResultOf (SimpleDb registry m) payload) -> JobRead payload -> SimpleDb registry m (ResultOf (SimpleDb registry m) payload)#

getListener :: SimpleDb registry m (Maybe Listener)#

MonadCatch m => MonadCatch (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

catch :: (HasCallStack, Exception e) => SimpleDb registry m a -> (e -> SimpleDb registry m a) -> SimpleDb registry m a#

catchNoPropagate :: Exception e => SimpleDb registry m a -> (ExceptionWithContext e -> SimpleDb registry m a) -> SimpleDb registry m a#

MonadMask m => MonadMask (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

mask :: HasCallStack => ((forall a. SimpleDb registry m a -> SimpleDb registry m a) -> SimpleDb registry m b) -> SimpleDb registry m b#

uninterruptibleMask :: HasCallStack => ((forall a. SimpleDb registry m a -> SimpleDb registry m a) -> SimpleDb registry m b) -> SimpleDb registry m b#

generalBracket :: HasCallStack => SimpleDb registry m a -> (a -> ExitCase b -> SimpleDb registry m c) -> (a -> SimpleDb registry m b) -> SimpleDb registry m (b, c)#

MonadThrow m => MonadThrow (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

throwM :: (HasCallStack, Exception e) => e -> SimpleDb registry m a#

rethrowM :: Exception e => ExceptionWithContext e -> SimpleDb registry m a#

Applicative m => Applicative (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

pure :: a -> SimpleDb registry m a#

(<*>) :: SimpleDb registry m (a -> b) -> SimpleDb registry m a -> SimpleDb registry m b#

liftA2 :: (a -> b -> c) -> SimpleDb registry m a -> SimpleDb registry m b -> SimpleDb registry m c#

(*>) :: SimpleDb registry m a -> SimpleDb registry m b -> SimpleDb registry m b#

(<*) :: SimpleDb registry m a -> SimpleDb registry m b -> SimpleDb registry m a#

Functor m => Functor (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

fmap :: (a -> b) -> SimpleDb registry m a -> SimpleDb registry m b#

(<$) :: a -> SimpleDb registry m b -> SimpleDb registry m a#

Monad m => Monad (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

(>>=) :: SimpleDb registry m a -> (a -> SimpleDb registry m b) -> SimpleDb registry m b#

(>>) :: SimpleDb registry m a -> SimpleDb registry m b -> SimpleDb registry m b#

return :: a -> SimpleDb registry m a#

MonadFail m => MonadFail (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

fail :: HasCallStack => String -> SimpleDb registry m a#

MonadIO m => MonadIO (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

liftIO :: IO a -> SimpleDb registry m a#

MonadUnliftIO m => MonadUnliftIO (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

withRunInIO :: ((forall a. SimpleDb registry m a -> IO a) -> IO b) -> SimpleDb registry m b#

type RegistryOf (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

type RegistryOf (SimpleDb registry m) = registry
type Handler (SimpleDb registry m) job result Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

type Handler (SimpleDb registry m) job result = Connection -> job -> SimpleDb registry m result

data Db conn cfg (registry :: JobPayloadRegistry) (m :: Type -> Type) a#

A pooled backend's database monad.

Instances

Instances details
Monad m => HasPoolState conn (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

getPoolState :: Db conn cfg registry m (PoolState conn)#

localPoolState :: (PoolState conn -> PoolState conn) -> Db conn cfg registry m a -> Db conn cfg registry m a#

Monad m => MonadReader (Env conn cfg registry) (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

ask :: Db conn cfg registry m (Env conn cfg registry)#

local :: (Env conn cfg registry -> Env conn cfg registry) -> Db conn cfg registry m a -> Db conn cfg registry m a#

reader :: (Env conn cfg registry -> a) -> Db conn cfg registry m a#

MonadCatch m => MonadCatch (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

catch :: (HasCallStack, Exception e) => Db conn cfg registry m a -> (e -> Db conn cfg registry m a) -> Db conn cfg registry m a#

catchNoPropagate :: Exception e => Db conn cfg registry m a -> (ExceptionWithContext e -> Db conn cfg registry m a) -> Db conn cfg registry m a#

MonadMask m => MonadMask (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

mask :: HasCallStack => ((forall a. Db conn cfg registry m a -> Db conn cfg registry m a) -> Db conn cfg registry m b) -> Db conn cfg registry m b#

uninterruptibleMask :: HasCallStack => ((forall a. Db conn cfg registry m a -> Db conn cfg registry m a) -> Db conn cfg registry m b) -> Db conn cfg registry m b#

generalBracket :: HasCallStack => Db conn cfg registry m a -> (a -> ExitCase b -> Db conn cfg registry m c) -> (a -> Db conn cfg registry m b) -> Db conn cfg registry m (b, c)#

MonadThrow m => MonadThrow (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

throwM :: (HasCallStack, Exception e) => e -> Db conn cfg registry m a#

rethrowM :: Exception e => ExceptionWithContext e -> Db conn cfg registry m a#

Applicative m => Applicative (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

pure :: a -> Db conn cfg registry m a#

(<*>) :: Db conn cfg registry m (a -> b) -> Db conn cfg registry m a -> Db conn cfg registry m b#

liftA2 :: (a -> b -> c) -> Db conn cfg registry m a -> Db conn cfg registry m b -> Db conn cfg registry m c#

(*>) :: Db conn cfg registry m a -> Db conn cfg registry m b -> Db conn cfg registry m b#

(<*) :: Db conn cfg registry m a -> Db conn cfg registry m b -> Db conn cfg registry m a#

Functor m => Functor (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

fmap :: (a -> b) -> Db conn cfg registry m a -> Db conn cfg registry m b#

(<$) :: a -> Db conn cfg registry m b -> Db conn cfg registry m a#

Monad m => Monad (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

(>>=) :: Db conn cfg registry m a -> (a -> Db conn cfg registry m b) -> Db conn cfg registry m b#

(>>) :: Db conn cfg registry m a -> Db conn cfg registry m b -> Db conn cfg registry m b#

return :: a -> Db conn cfg registry m a#

MonadFail m => MonadFail (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

fail :: HasCallStack => String -> Db conn cfg registry m a#

MonadIO m => MonadIO (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

liftIO :: IO a -> Db conn cfg registry m a#

MonadUnliftIO m => MonadUnliftIO (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

withRunInIO :: ((forall a. Db conn cfg registry m a -> IO a) -> IO b) -> Db conn cfg registry m b#

data Env conn cfg (registry :: JobPayloadRegistry)#

Schema name, pool state, listener, and the driver's own state.

Constructors

Env 

Fields

Instances

Instances details
Monad m => MonadReader (SimpleEnv registry) (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

ask :: SimpleDb registry m (SimpleEnv registry)#

local :: (SimpleEnv registry -> SimpleEnv registry) -> SimpleDb registry m a -> SimpleDb registry m a#

reader :: (SimpleEnv registry -> a) -> SimpleDb registry m a#

Monad m => MonadReader (Env conn cfg registry) (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

ask :: Db conn cfg registry m (Env conn cfg registry)#

local :: (Env conn cfg registry -> Env conn cfg registry) -> Db conn cfg registry m a -> Db conn cfg registry m a#

reader :: (Env conn cfg registry -> a) -> Db conn cfg registry m a#

data PoolState conn#

Pool and the pinned connection with its transaction depth.

Constructors

PoolState 

Fields

class Monad m => HasPoolState conn (m :: Type -> Type) | m -> conn where#

Ambient access to the pool state.

Methods

getPoolState :: m (PoolState conn)#

The current pool state.

localPoolState :: (PoolState conn -> PoolState conn) -> m a -> m a#

Run an action under an adjusted pool state.

Instances

Instances details
Monad m => HasPoolState Connection (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Monad m => HasPoolState conn (Db conn cfg registry m) # 
Instance details

Defined in Arbiter.Core.Backend

Methods

getPoolState :: Db conn cfg registry m (PoolState conn)#

localPoolState :: (PoolState conn -> PoolState conn) -> Db conn cfg registry m a -> Db conn cfg registry m a#

runSimpleDb :: forall (registry :: JobPayloadRegistry) m a. SimpleEnv registry -> SimpleDb registry m a -> m aSource #

Run a SimpleDb action in its env.

inTransaction :: forall (registry :: JobPayloadRegistry) m a. Connection -> SchemaName -> SimpleDb registry m a -> m aSource #

Arguments

:: forall (registry :: JobPayloadRegistry) m a. Connection

Connection with an open transaction

-> SchemaName 
-> SimpleDb registry m a 
-> m a 

Run a SimpleDb action on one connection pinned as the caller's open transaction.

import Arbiter.Core qualified as Arb
import Arbiter.Simple qualified as ArbS

PG.withTransaction conn $ do
  PG.execute conn "INSERT INTO orders ..." params
  ArbS.inTransaction @MyRegistry conn "arbiter" $
    Arb.insertJob (Arb.defaultJob (ProcessOrder orderId))

Environment creation

createSimpleEnv :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> ByteString -> SchemaName -> m (SimpleEnv registry)Source #

Arguments

:: forall (registry :: JobPayloadRegistry) m. MonadIO m 
=> Proxy registry

Type-level job payload registry

-> ByteString

PostgreSQL connection string

-> SchemaName 
-> m (SimpleEnv registry) 

Create a SimpleEnv with defaultPoolConfig. Size worker pools with createSimpleEnvWithConfig and Arbiter.Worker.poolConfigForWorkers. While anything listens, the listener holds one pool slot.

createSimpleEnvWithConfig :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> ByteString -> SchemaName -> PoolConfig -> m (SimpleEnv registry)Source #

Arguments

:: forall (registry :: JobPayloadRegistry) m. MonadIO m 
=> Proxy registry

Type-level job payload registry

-> ByteString

PostgreSQL connection string

-> SchemaName 
-> PoolConfig

Pool configuration

-> m (SimpleEnv registry) 

Create a SimpleEnv with custom pool settings. While anything listens, the listener holds one pool slot.

let config = PoolConfig
      { poolSize = 50
      , poolIdleTimeout = 120
      , poolStripes = Just 4
      }
env <- createSimpleEnvWithConfig (Proxy @MyRegistry) "host=localhost dbname=mydb" "arbiter" config

createSimpleEnvWithPool :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> Pool Connection -> SchemaName -> m (SimpleEnv registry)Source #

Arguments

:: forall (registry :: JobPayloadRegistry) m. MonadIO m 
=> Proxy registry

Type-level job payload registry

-> Pool Connection

Caller's connection pool

-> SchemaName 
-> m (SimpleEnv registry) 

Create a SimpleEnv over a caller's own connection pool. While anything listens, the listener holds one pool slot.

destroySimpleEnv :: forall m (registry :: JobPayloadRegistry). MonadIO m => SimpleEnv registry -> m ()Source #

Close the idle connections in the env's pool. Connections in use stay open and go back to the pool. The pool stays usable.

disableListener :: forall conn cfg (registry :: JobPayloadRegistry). Env conn cfg registry -> Env conn cfg registry#

Turn off the shared LISTEN listener for an env, running poll-only.

useDedicatedListener :: forall m (registry :: JobPayloadRegistry). MonadIO m => ByteString -> SimpleEnv registry -> m (SimpleEnv registry)Source #

Give the env a dedicated LISTEN connection that takes no pool slot.