Source code for codegen_database.ext.cron.base

from __future__ import annotations

from dataclasses import dataclass, field
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from sqlalchemy import MetaData


[docs] @dataclass(frozen=True) class CronJob: name: str schedule: str command: str database: str | None = None def to_sql_schedule(self) -> str: name = self.name.replace("'", "''") schedule = self.schedule.replace("'", "''") command = self.command db = self.database.replace("'", "''") if self.database else None db_clause = f", database := '{db}'" if db is not None else "" return ( f"SELECT cron.schedule(" f"'{name}', " f"'{schedule}', " f"$${command}$${db_clause}" f")" ) def to_sql_unschedule(self) -> str: name = self.name.replace("'", "''") return f"SELECT cron.unschedule('{name}')"
[docs] @dataclass class CronJobs: jobs: list[CronJob] = field(default_factory=list) @classmethod def extract(cls, metadata: MetaData) -> CronJobs: jobs = metadata.info.get("cron_jobs", CronJobs()) metadata.info["cron_jobs"] = jobs return jobs
def register_cron_job( metadata: MetaData, job: CronJob, ) -> None: CronJobs.extract(metadata).jobs.append(job)