| Safe Haskell | None |
|---|---|
| Language | GHC2024 |
Arbiter.Hasql.HasqlDb
Description
The hasql database monad with a built-in MonadArbiter instance:
import Arbiter.Core qualified as Arb import Arbiter.Hasql qualified as ArbH import Control.Monad (void) myFunction :: ArbH.HasqlDb MyRegistry IO () myFunction = void $ Arb.insertJob (Arb.defaultJob myPayload)
Synopsis
- newtype HasqlDb (registry :: JobPayloadRegistry) (m :: Type -> Type) a = HasqlDb {
- unHasqlDb :: Db Connection HasqlConfig registry m a
- type HasqlEnv = Env Connection HasqlConfig
- data Db conn cfg (registry :: JobPayloadRegistry) (m :: Type -> Type) a
- data Env conn cfg (registry :: JobPayloadRegistry) = Env {
- schema :: SchemaName
- poolState :: PoolState conn
- listener :: Maybe Listener
- driverConfig :: cfg
- newtype HasqlConfig = HasqlConfig {}
- data PoolState conn = PoolState {}
- class Monad m => HasPoolState conn (m :: Type -> Type) | m -> conn where
- getPoolState :: m (PoolState conn)
- localPoolState :: (PoolState conn -> PoolState conn) -> m a -> m a
- runHasqlDb :: forall (registry :: JobPayloadRegistry) m a. HasqlEnv registry -> HasqlDb registry m a -> m a
- inTransaction :: forall (registry :: JobPayloadRegistry) m a. Connection -> SchemaName -> HasqlDb registry m a -> m a
- inTransactionWith :: forall (registry :: JobPayloadRegistry) m a. HasqlConfig -> Connection -> SchemaName -> HasqlDb registry m a -> m a
- data HasqlConnect
- toHasqlConnect :: Adapter -> ByteString -> HasqlConnect
- acquireConnect :: HasqlConnect -> IO (Either String Connection)
- createHasqlEnv :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> HasqlConnect -> SchemaName -> m (HasqlEnv registry)
- createHasqlEnvWithConfig :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> HasqlConnect -> SchemaName -> PoolConfig -> m (HasqlEnv registry)
- createHasqlEnvWithPool :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> Pool Connection -> SchemaName -> m (HasqlEnv registry)
- destroyHasqlEnv :: forall m (registry :: JobPayloadRegistry). MonadIO m => HasqlEnv registry -> m ()
- disableListener :: forall conn cfg (registry :: JobPayloadRegistry). Env conn cfg registry -> Env conn cfg registry
- useDedicatedListener :: forall m (registry :: JobPayloadRegistry). MonadIO m => HasqlConnect -> HasqlEnv registry -> m (HasqlEnv registry)
- setPreparedStatements :: forall (registry :: JobPayloadRegistry). Bool -> HasqlEnv registry -> HasqlEnv registry
- type HasqlSettings = Settings
- hasqlSettings :: ByteString -> HasqlSettings
- newtype HasqlConnectionError = HasqlConnectionError String
Database monad
newtype HasqlDb (registry :: JobPayloadRegistry) (m :: Type -> Type) aSource #
The hasql database monad.
Constructors
| HasqlDb | |
Fields
| |
Instances
| Monad m => HasPoolState Connection (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb Methods getPoolState :: HasqlDb registry m (PoolState Connection)# localPoolState :: (PoolState Connection -> PoolState Connection) -> HasqlDb registry m a -> HasqlDb registry m a# | |||||
| MonadTrans (HasqlDb registry) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb | |||||
| Monad m => MonadReader (HasqlEnv registry) (HasqlDb registry m) Source # | |||||
| MonadUnliftIO m => MonadArbiter (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb Associated Types
Methods getSchema :: HasqlDb registry m SchemaName# executeQuery :: Query a -> HasqlDb registry m [a]# executeQueryPrepared :: Query a -> HasqlDb registry m [a]# executeStatement :: Query a -> HasqlDb registry m Int64# withDbTransaction :: HasqlDb registry m a -> HasqlDb registry m a# runHandlerWithConnection :: JobHandler (HasqlDb registry m) payload (ResultOf (HasqlDb registry m) payload) -> JobRead payload -> HasqlDb registry m (ResultOf (HasqlDb registry m) payload)# getListener :: HasqlDb registry m (Maybe Listener)# | |||||
| MonadCatch m => MonadCatch (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb Methods catch :: (HasCallStack, Exception e) => HasqlDb registry m a -> (e -> HasqlDb registry m a) -> HasqlDb registry m a# catchNoPropagate :: Exception e => HasqlDb registry m a -> (ExceptionWithContext e -> HasqlDb registry m a) -> HasqlDb registry m a# | |||||
| MonadMask m => MonadMask (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb Methods mask :: HasCallStack => ((forall a. HasqlDb registry m a -> HasqlDb registry m a) -> HasqlDb registry m b) -> HasqlDb registry m b# uninterruptibleMask :: HasCallStack => ((forall a. HasqlDb registry m a -> HasqlDb registry m a) -> HasqlDb registry m b) -> HasqlDb registry m b# generalBracket :: HasCallStack => HasqlDb registry m a -> (a -> ExitCase b -> HasqlDb registry m c) -> (a -> HasqlDb registry m b) -> HasqlDb registry m (b, c)# | |||||
| MonadThrow m => MonadThrow (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb Methods throwM :: (HasCallStack, Exception e) => e -> HasqlDb registry m a# rethrowM :: Exception e => ExceptionWithContext e -> HasqlDb registry m a# | |||||
| Applicative m => Applicative (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb Methods pure :: a -> HasqlDb registry m a# (<*>) :: HasqlDb registry m (a -> b) -> HasqlDb registry m a -> HasqlDb registry m b# liftA2 :: (a -> b -> c) -> HasqlDb registry m a -> HasqlDb registry m b -> HasqlDb registry m c# (*>) :: HasqlDb registry m a -> HasqlDb registry m b -> HasqlDb registry m b# (<*) :: HasqlDb registry m a -> HasqlDb registry m b -> HasqlDb registry m a# | |||||
| Functor m => Functor (HasqlDb registry m) Source # | |||||
| Monad m => Monad (HasqlDb registry m) Source # | |||||
| MonadFail m => MonadFail (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb Methods fail :: HasCallStack => String -> HasqlDb registry m a# | |||||
| MonadIO m => MonadIO (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb | |||||
| MonadUnliftIO m => MonadUnliftIO (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb | |||||
| type RegistryOf (HasqlDb registry m) Source # | |||||
Defined in Arbiter.Hasql.HasqlDb | |||||
| type Handler (HasqlDb registry m) job result Source # | |||||
Defined in Arbiter.Hasql.HasqlDb | |||||
type HasqlEnv = Env Connection HasqlConfigSource #
data Db conn cfg (registry :: JobPayloadRegistry) (m :: Type -> Type) a#
A pooled backend's database monad.
Instances
| Monad m => HasPoolState conn (Db conn cfg registry m) # | |
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) # | |
| MonadCatch m => MonadCatch (Db conn cfg registry m) # | |
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) # | |
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) # | |
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) # | |
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) # | |
| Monad m => Monad (Db conn cfg registry m) # | |
| MonadFail m => MonadFail (Db conn cfg registry m) # | |
Defined in Arbiter.Core.Backend Methods fail :: HasCallStack => String -> Db conn cfg registry m a# | |
| MonadIO m => MonadIO (Db conn cfg registry m) # | |
Defined in Arbiter.Core.Backend | |
| MonadUnliftIO m => MonadUnliftIO (Db conn cfg registry m) # | |
Defined in Arbiter.Core.Backend | |
data Env conn cfg (registry :: JobPayloadRegistry)#
Schema name, pool state, listener, and the driver's own state.
Constructors
| Env | |
Fields
| |
newtype HasqlConfigSource #
Driver settings for HasqlDb.
Constructors
| HasqlConfig | |
Fields
| |
Pool and the pinned connection with its transaction depth.
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
| Monad m => HasPoolState Connection (HasqlDb registry m) Source # | |
Defined in Arbiter.Hasql.HasqlDb Methods getPoolState :: HasqlDb registry m (PoolState Connection)# localPoolState :: (PoolState Connection -> PoolState Connection) -> HasqlDb registry m a -> HasqlDb registry m a# | |
| Monad m => HasPoolState conn (Db conn cfg registry m) # | |
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# | |
runHasqlDb :: forall (registry :: JobPayloadRegistry) m a. HasqlEnv registry -> HasqlDb registry m a -> m aSource #
Run a HasqlDb action in its env.
inTransaction :: forall (registry :: JobPayloadRegistry) m a. Connection -> SchemaName -> HasqlDb registry m a -> m aSource #
Arguments
| :: forall (registry :: JobPayloadRegistry) m a. Connection | Connection with an open transaction |
| -> SchemaName | |
| -> HasqlDb registry m a | |
| -> m a |
Run a HasqlDb action on one connection pinned as the caller's open transaction.
import Arbiter.Core qualified as Arb import Arbiter.Hasql qualified as ArbH _ <- Hasql.use conn (Session.script "BEGIN") ArbH.inTransaction @MyRegistry conn "arbiter" $ do Arb.insertJob (Arb.defaultJob myPayload) _ <- Hasql.use conn (Session.script "COMMIT")
inTransactionWith :: forall (registry :: JobPayloadRegistry) m a. HasqlConfig -> Connection -> SchemaName -> HasqlDb registry m a -> m aSource #
Arguments
| :: forall (registry :: JobPayloadRegistry) m a. HasqlConfig | Driver settings |
| -> Connection | Connection with an open transaction |
| -> SchemaName | |
| -> HasqlDb registry m a | |
| -> m a |
inTransaction with explicit settings, such as prepared statements off.
Environment creation
data HasqlConnectSource #
Connection settings for hasql 2: transport adapter (for example Pqi.Ffi.adapter) and connection string.
toHasqlConnect :: Adapter -> ByteString -> HasqlConnectSource #
Connection settings from a pqi adapter and a connection string. With the hasql2
flag off, the hasql 1.x shape takes only the connection string.
acquireConnect :: HasqlConnect -> IO (Either String Connection)Source #
Open a connection. A failure comes back as its description.
createHasqlEnv :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> HasqlConnect -> SchemaName -> m (HasqlEnv registry)Source #
Arguments
| :: forall (registry :: JobPayloadRegistry) m. MonadIO m | |
| => Proxy registry | Type-level job payload registry |
| -> HasqlConnect | Connection settings |
| -> SchemaName | |
| -> m (HasqlEnv registry) |
Create a HasqlEnv with defaultPoolConfig. Size worker pools with
createHasqlEnvWithConfig and Arbiter.Worker.poolConfigForWorkers.
While anything listens, the listener holds one pool slot.
createHasqlEnvWithConfig :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> HasqlConnect -> SchemaName -> PoolConfig -> m (HasqlEnv registry)Source #
Arguments
| :: forall (registry :: JobPayloadRegistry) m. MonadIO m | |
| => Proxy registry | Type-level job payload registry |
| -> HasqlConnect | Connection settings |
| -> SchemaName | |
| -> PoolConfig | Pool configuration |
| -> m (HasqlEnv registry) |
Create a HasqlEnv with custom pool settings. While anything listens, the listener holds
one pool slot.
let config = PoolConfig
{ poolSize = 50
, poolIdleTimeout = 120
, poolStripes = Just 4
}
env <- createHasqlEnvWithConfig (Proxy @MyRegistry) (toHasqlConnect Ffi.adapter connStr) "arbiter" config
createHasqlEnvWithPool :: forall (registry :: JobPayloadRegistry) m. MonadIO m => Proxy registry -> Pool Connection -> SchemaName -> m (HasqlEnv registry)Source #
Arguments
| :: forall (registry :: JobPayloadRegistry) m. MonadIO m | |
| => Proxy registry | Type-level job payload registry |
| -> Pool Connection | Caller's connection pool |
| -> SchemaName | |
| -> m (HasqlEnv registry) |
Create a HasqlEnv over a caller's own connection pool. While anything listens, the
listener holds one pool slot.
destroyHasqlEnv :: forall m (registry :: JobPayloadRegistry). MonadIO m => HasqlEnv 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 => HasqlConnect -> HasqlEnv registry -> m (HasqlEnv registry)Source #
Give the env a dedicated LISTEN connection that takes no pool slot.
setPreparedStatements :: forall (registry :: JobPayloadRegistry). Bool -> HasqlEnv registry -> HasqlEnv registrySource #
Enable or disable prepared statements on the hot path. On by default. Needs direct connections or a pooler that supports them.
Hasql settings
type HasqlSettings = SettingsSource #
hasql connection settings.
hasqlSettings :: ByteString -> HasqlSettingsSource #
Convert a connection string ByteString to hasql settings.
Exceptions
newtype HasqlConnectionErrorSource #
Thrown when a new hasql connection cannot be opened.
Constructors
| HasqlConnectionError String |
Instances
| Exception HasqlConnectionError Source # | |
Defined in Arbiter.Hasql.HasqlDb | |
| Show HasqlConnectionError Source # | |
Defined in Arbiter.Hasql.HasqlDb Methods showsPrec :: Int -> HasqlConnectionError -> ShowS# show :: HasqlConnectionError -> String# showList :: [HasqlConnectionError] -> ShowS# | |