| Safe Haskell | None |
|---|---|
| Language | GHC2024 |
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
- newtype SimpleDb (registry :: k) (m :: Type -> Type) a = SimpleDb {
- unSimpleDb :: ReaderT (SimpleEnv registry) m a
- data SimpleEnv (registry :: k) = SimpleEnv {}
- runSimpleDb :: forall {k} (registry :: k) m a. SimpleEnv registry -> SimpleDb registry m a -> m a
- inTransaction :: forall {k} (registry :: k) m a. Connection -> Text -> SimpleDb registry m a -> m a
- createSimpleEnv :: forall (registry :: JobPayloadRegistry) m. (AllQueuesUnique registry, MonadIO m) => Proxy registry -> ByteString -> Text -> m (SimpleEnv registry)
- createSimpleEnvWithConfig :: forall (registry :: JobPayloadRegistry) m. (AllQueuesUnique registry, MonadIO m) => Proxy registry -> ByteString -> Text -> PoolConfig -> m (SimpleEnv registry)
- createSimpleEnvWithPool :: forall (registry :: JobPayloadRegistry). AllQueuesUnique registry => Proxy registry -> Pool Connection -> Text -> SimpleEnv registry
Database Monad
newtype SimpleDb (registry :: k) (m :: Type -> Type) a Source #
Simple database monad using postgresql-simple.
Constructors
| SimpleDb | |
Fields
| |
Instances
| Monad m => MonadReader (SimpleEnv registry) (SimpleDb registry m) Source # | |
| (Monad m, MonadIO m, MonadUnliftIO m) => MonadArbiter (SimpleDb registry m) Source # | |
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 # | |
Defined in Arbiter.Simple.SimpleDb Methods getSimplePool :: SimpleDb registry m SimpleConnectionPool Source # localSimplePool :: (SimpleConnectionPool -> SimpleConnectionPool) -> SimpleDb registry m a -> SimpleDb registry m a Source # | |
| MonadIO m => MonadIO (SimpleDb registry m) Source # | |
Defined in Arbiter.Simple.SimpleDb | |
| MonadCatch m => MonadCatch (SimpleDb registry m) Source # | |
Defined in Arbiter.Simple.SimpleDb | |
| MonadMask m => MonadMask (SimpleDb registry m) Source # | |
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 # | |
Defined in Arbiter.Simple.SimpleDb Methods throwM :: (HasCallStack, Exception e) => e -> SimpleDb registry m a # | |
| Applicative m => Applicative (SimpleDb registry m) Source # | |
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 # | |
| Monad m => Monad (SimpleDb registry m) Source # | |
| MonadFail m => MonadFail (SimpleDb registry m) Source # | |
Defined in Arbiter.Simple.SimpleDb | |
| MonadUnliftIO m => MonadUnliftIO (SimpleDb registry m) Source # | |
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 # | |
Defined in Arbiter.Simple.SimpleDb | |
| type Handler (SimpleDb registry m) jobs result Source # | |
Defined in Arbiter.Simple.SimpleDb | |
data SimpleEnv (registry :: k) Source #
Environment for SimpleDb operations
Contains both the schema name and the connection pool.
Constructors
| SimpleEnv | |
Fields
| |
runSimpleDb :: forall {k} (registry :: k) m a. SimpleEnv registry -> SimpleDb registry m a -> m a Source #
Run a SimpleDb action with a SimpleEnv.
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
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