arbiter-core-0.1.0.0: Core types and logic for PostgreSQL-backed job queue
Safe HaskellNone
LanguageGHC2024

Arbiter.Core.CronSchedule

Description

Types and postgresql-simple operations for the cron_schedules table.

Since cron operations are administrative metadata (not part of job processing transactions), they use postgresql-simple directly via a Connection parameter -- no MonadArbiter needed.

The table stores both the code-defined defaults and user overrides separately. On worker init, only the default_* columns are upserted -- user overrides (override_*, enabled) are preserved.

Synopsis

Types

data CronScheduleRow Source #

A row from the cron_schedules table.

Instances

Instances details
FromJSON CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

ToJSON CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Generic CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Show CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Eq CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

FromRow CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Methods

fromRow :: RowParser CronScheduleRow

ToRow CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Methods

toRow :: CronScheduleRow -> [Action]

type Rep CronScheduleRow Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

data CronScheduleUpdate Source #

Patch update for a cron schedule.

Each field uses Maybe (Maybe a):

  • Nothing = don't change
  • Just Nothing = reset to default (set column to NULL)
  • Just (Just x) = set to x

Instances

Instances details
FromJSON CronScheduleUpdate Source #

Manual instance to distinguish missing keys from null values.

  • Key missing → Nothing (don't change)
  • Key present with nullJust Nothing (reset to default)
  • Key present with value → Just (Just x) (set override)
Instance details

Defined in Arbiter.Core.CronSchedule

ToJSON CronScheduleUpdate Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Generic CronScheduleUpdate Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Associated Types

type Rep CronScheduleUpdate 
Instance details

Defined in Arbiter.Core.CronSchedule

type Rep CronScheduleUpdate = D1 ('MetaData "CronScheduleUpdate" "Arbiter.Core.CronSchedule" "arbiter-core-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CronScheduleUpdate" 'PrefixI 'True) (S1 ('MetaSel ('Just "overrideExpression") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe (Maybe Text))) :*: (S1 ('MetaSel ('Just "overrideOverlap") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe (Maybe Text))) :*: S1 ('MetaSel ('Just "enabled") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe Bool)))))
Show CronScheduleUpdate Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

Eq CronScheduleUpdate Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

type Rep CronScheduleUpdate Source # 
Instance details

Defined in Arbiter.Core.CronSchedule

type Rep CronScheduleUpdate = D1 ('MetaData "CronScheduleUpdate" "Arbiter.Core.CronSchedule" "arbiter-core-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CronScheduleUpdate" 'PrefixI 'True) (S1 ('MetaSel ('Just "overrideExpression") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe (Maybe Text))) :*: (S1 ('MetaSel ('Just "overrideOverlap") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe (Maybe Text))) :*: S1 ('MetaSel ('Just "enabled") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe Bool)))))

Effective values

effectiveExpression :: CronScheduleRow -> Text Source #

Effective expression: override if set, else default.

effectiveOverlap :: CronScheduleRow -> Text Source #

Effective overlap policy: override if set, else default.

Operations

upsertCronScheduleDefault :: Connection -> Text -> Text -> Text -> Text -> IO () Source #

Upsert a cron schedule's default values.

INSERT ON CONFLICT (name) DO UPDATE SET default_expression, default_overlap, updated_at. Does NOT touch override_expression, override_overlap, or enabled.

listCronSchedules :: Connection -> Text -> IO [CronScheduleRow] Source #

List all cron schedules.

getCronScheduleByName :: Connection -> Text -> Text -> IO (Maybe CronScheduleRow) Source #

Get a single cron schedule by name.

updateCronSchedule :: Connection -> Text -> Text -> CronScheduleUpdate -> IO Int64 Source #

Update a cron schedule (patch semantics).

Returns the number of rows affected (0 = not found, 1 = updated).

touchCronScheduleLastFired :: Connection -> Text -> Text -> IO () Source #

Update last_fired_at to NOW().

deleteStaleSchedules :: Connection -> Text -> [Text] -> IO Int64 Source #

Delete schedules whose names are not in the given list.

Returns the number of rows deleted. Does nothing if the list is empty.

touchCronSchedulesChecked :: Connection -> Text -> [Text] -> IO () Source #

Update last_checked_at to NOW() for the given schedule names.

SQL helpers

cronSchedulesTable :: Text -> Text Source #

Qualified table name for the cron_schedules table.

createCronSchedulesTableSQL :: Text -> Text Source #

DDL for the cron_schedules table.