-- Approval-time configuration identity. DDL and its marker commit atomically. BEGIN; -- Existing rows retain all fields; the new epoch invalidates old complete proofs. -- This schema addition does not activate the delayed-approval execution protocol. LOCK TABLE public.traffic_settings, public.uptime_settings, public.internet_path_settings IN ACCESS EXCLUSIVE MODE; ALTER TABLE public.traffic_settings ADD COLUMN poll_configuration_epoch uuid NOT NULL DEFAULT pg_catalog.gen_random_uuid(); ALTER TABLE public.uptime_settings ADD COLUMN poll_configuration_epoch uuid NOT NULL DEFAULT pg_catalog.gen_random_uuid(); ALTER TABLE public.internet_path_settings ADD COLUMN poll_configuration_epoch uuid NOT NULL DEFAULT pg_catalog.gen_random_uuid(); CREATE FUNCTION public.server_poll_settings_epoch_guard() RETURNS trigger LANGUAGE plpgsql SET search_path = pg_catalog AS $epoch$ BEGIN IF TG_TABLE_SCHEMA <> 'public' OR TG_TABLE_NAME NOT IN ('traffic_settings', 'uptime_settings', 'internet_path_settings') OR TG_LEVEL <> 'ROW' OR TG_WHEN <> 'BEFORE' THEN RAISE EXCEPTION 'unexpected poll settings epoch trigger target'; END IF; IF TG_OP = 'INSERT' THEN -- Never accept an epoch supplied by an importer or application caller. NEW.poll_configuration_epoch := pg_catalog.gen_random_uuid(); ELSIF TG_OP = 'UPDATE' THEN -- Every unknown/future field is configuration by default. Only these four -- current collector fields are excluded; created_at stays significant. IF (pg_catalog.to_jsonb(NEW) - ARRAY['poll_configuration_epoch', 'last_collected_at', 'last_duration_ms', 'last_error', 'updated_at']) IS DISTINCT FROM (pg_catalog.to_jsonb(OLD) - ARRAY['poll_configuration_epoch', 'last_collected_at', 'last_duration_ms', 'last_error', 'updated_at']) THEN NEW.poll_configuration_epoch := pg_catalog.gen_random_uuid(); ELSE NEW.poll_configuration_epoch := OLD.poll_configuration_epoch; END IF; ELSE RAISE EXCEPTION 'unexpected poll settings epoch trigger operation'; END IF; RETURN NEW; END; $epoch$; CREATE TRIGGER server_poll_settings_epoch BEFORE INSERT OR UPDATE ON public.traffic_settings FOR EACH ROW EXECUTE FUNCTION public.server_poll_settings_epoch_guard(); CREATE TRIGGER server_poll_settings_epoch BEFORE INSERT OR UPDATE ON public.uptime_settings FOR EACH ROW EXECUTE FUNCTION public.server_poll_settings_epoch_guard(); CREATE TRIGGER server_poll_settings_epoch BEFORE INSERT OR UPDATE ON public.internet_path_settings FOR EACH ROW EXECUTE FUNCTION public.server_poll_settings_epoch_guard(); ALTER TABLE public.traffic_settings ENABLE ALWAYS TRIGGER server_poll_settings_epoch; ALTER TABLE public.uptime_settings ENABLE ALWAYS TRIGGER server_poll_settings_epoch; ALTER TABLE public.internet_path_settings ENABLE ALWAYS TRIGGER server_poll_settings_epoch; INSERT INTO schema_migrations(id) VALUES('0042_server_poll_settings_epoch') ON CONFLICT(id) DO NOTHING; COMMIT;