arbiter-simple-0.1.0.0: PostgreSQL-simple implementation of arbiter
Safe HaskellNone
LanguageGHC2024

Arbiter.Simple.SimpleDb

Description

Simple database monad for Arbiter with postgresql-simple backend.

SimpleDb has a built-in MonadArbiter instance, so you can use it directly:

import Arbiter.Core
import Arbiter.Simple

myFunction :: SimpleDb MyRegistry IO ()
myFunction = insertJob (defaultJob myPayload)
Synopsis

Database Monad

newtype SimpleDb (registry :: k) (m :: Type -> Type) a Source #

Simple database monad using postgresql-simple.

Constructors

SimpleDb 

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, MonadIO m, MonadUnliftIO m) => MonadArbiter (SimpleDb registry m) Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

Methods

executeQuery :: Text -> Params -> RowCodec a -> SimpleDb registry m [a] #

executeStatement :: Text -> Params -> SimpleDb registry m Int64 #

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

runHandlerWithConnection :: Handler (SimpleDb registry m) jobs result -> jobs -> SimpleDb registry m result #

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

Defined in Arbiter.Simple.SimpleDb

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

Defined in Arbiter.Simple.SimpleDb

Methods

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

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 #

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 #

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 :: String -> 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

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

Defined in Arbiter.Simple.SimpleDb

Methods

getSchema :: SimpleDb registry m Text #

type Handler (SimpleDb registry m) jobs result Source # 
Instance details

Defined in Arbiter.Simple.SimpleDb

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

data SimpleEnv (registry :: k) Source #

Environment for SimpleDb operations

Contains both the schema name and the connection pool.

Constructors

SimpleEnv 

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 #

runSimpleDb :: forall {k} (registry :: k) m a. SimpleEnv registry -> SimpleDb registry m a -> m a Source #

Run a SimpleDb action with a SimpleEnv.

inTransaction Source #

Arguments

:: forall {k} (registry :: k) m a. Connection 
-> Text

PostgreSQL schema name

-> SimpleDb registry m a 
-> m a 

Run a SimpleDb action using a single postgresql-simple connection.

No pool or env is needed. The connection is pinned with transactionDepth = 1, so arbiter's withDbTransaction uses savepoints instead of issuing BEGIN. The caller is responsible for transaction lifecycle on the connection.

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

Environment Creation

createSimpleEnv Source #

Arguments

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

Type-level job payload registry

-> ByteString

PostgreSQL connection string

-> Text

PostgreSQL schema name (e.g., "arbiter", "public")

-> m (SimpleEnv registry) 

Create a JobQueue environment with resource-pool connection pooling

Uses conservative defaults (10 connections, 300s idle timeout, 1 stripe).

For worker pools, consider using createSimpleEnvWithConfig with poolConfigForWorkers to size the pool based on worker count:

poolCfg <- poolConfigForWorkers 10
env <- createSimpleEnvWithConfig (Proxy @MyRegistry) connStr "arbiter" poolCfg

All job tables are created within the specified schema.

createSimpleEnvWithConfig Source #

Arguments

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

Type-level job payload registry

-> ByteString

PostgreSQL connection string

-> Text

PostgreSQL schema name

-> PoolConfig

Pool configuration

-> m (SimpleEnv registry) 

Control pool sizing, idle timeout, and striping.

Example:

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

createSimpleEnvWithPool Source #

Arguments

:: forall (registry :: JobPayloadRegistry). AllQueuesUnique registry 
=> Proxy registry

Type-level job payload registry

-> Pool Connection

User-provided connection pool

-> Text

PostgreSQL schema name

-> SimpleEnv registry 

Create a SimpleEnv with a user-provided connection pool