50 lines
2.9 KiB
PL/PgSQL
50 lines
2.9 KiB
PL/PgSQL
-- 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;
|