56 lines
1.8 KiB
SQL
56 lines
1.8 KiB
SQL
-- Migration: Add Predefined Task Support to scheduled_jobs
|
|
-- Date: 2025-12-11
|
|
-- Purpose: Transition from dynamic code execution to predefined task system
|
|
|
|
-- 1. Create job_type ENUM type
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'jobtype') THEN
|
|
CREATE TYPE jobtype AS ENUM ('predefined', 'custom_code');
|
|
END IF;
|
|
END $$;
|
|
|
|
-- 2. Add new columns
|
|
ALTER TABLE scheduled_jobs
|
|
ADD COLUMN IF NOT EXISTS job_type jobtype DEFAULT 'custom_code',
|
|
ADD COLUMN IF NOT EXISTS predefined_function VARCHAR(100),
|
|
ADD COLUMN IF NOT EXISTS function_params JSONB DEFAULT '{}'::jsonb;
|
|
|
|
-- 3. Update existing rows to custom_code type (preserve backward compatibility)
|
|
UPDATE scheduled_jobs
|
|
SET job_type = 'custom_code'
|
|
WHERE job_type IS NULL;
|
|
|
|
-- 4. Make job_type NOT NULL after setting defaults
|
|
ALTER TABLE scheduled_jobs
|
|
ALTER COLUMN job_type SET NOT NULL;
|
|
|
|
-- 5. Set default for job_type to 'predefined' for new records
|
|
ALTER TABLE scheduled_jobs
|
|
ALTER COLUMN job_type SET DEFAULT 'predefined';
|
|
|
|
-- 6. Add check constraint
|
|
ALTER TABLE scheduled_jobs
|
|
ADD CONSTRAINT chk_job_type_fields
|
|
CHECK (
|
|
(job_type = 'predefined' AND predefined_function IS NOT NULL)
|
|
OR
|
|
(job_type = 'custom_code' AND python_code IS NOT NULL)
|
|
);
|
|
|
|
-- 7. Add comment on columns
|
|
COMMENT ON COLUMN scheduled_jobs.job_type IS 'Job type: predefined or custom_code';
|
|
COMMENT ON COLUMN scheduled_jobs.predefined_function IS 'Predefined function name (required if job_type=predefined)';
|
|
COMMENT ON COLUMN scheduled_jobs.function_params IS 'JSON parameters for predefined function';
|
|
COMMENT ON COLUMN scheduled_jobs.python_code IS 'Dynamic Python code (only for custom_code type)';
|
|
|
|
-- 8. Verify the changes
|
|
SELECT
|
|
column_name,
|
|
data_type,
|
|
is_nullable,
|
|
column_default
|
|
FROM information_schema.columns
|
|
WHERE table_name = 'scheduled_jobs'
|
|
ORDER BY ordinal_position;
|