internal/praefect/datastore/migrations/20201208163237_cleanup_notifiactions_payload.go (68 lines of code) (raw):

package migrations import migrate "github.com/rubenv/sql-migrate" func init() { m := &migrate.Migration{ Id: "20201208163237_cleanup_notifiactions_payload", Up: []string{ `-- +migrate StatementBegin CREATE OR REPLACE FUNCTION notify_on_change() RETURNS TRIGGER AS $$ DECLARE msg JSONB; BEGIN CASE TG_OP WHEN 'INSERT' THEN SELECT JSON_AGG(obj) INTO msg FROM ( SELECT JSONB_BUILD_OBJECT('virtual_storage', virtual_storage, 'relative_paths', ARRAY_AGG(DISTINCT relative_path)) AS obj FROM NEW GROUP BY virtual_storage ) t; WHEN 'UPDATE' THEN SELECT JSON_AGG(obj) INTO msg FROM ( SELECT JSONB_BUILD_OBJECT('virtual_storage', virtual_storage, 'relative_paths', ARRAY_AGG(DISTINCT relative_path)) AS obj FROM NEW FULL JOIN OLD USING (virtual_storage, relative_path) GROUP BY virtual_storage ) t; WHEN 'DELETE' THEN SELECT JSON_AGG(obj) INTO msg FROM ( SELECT JSONB_BUILD_OBJECT('virtual_storage', virtual_storage, 'relative_paths', ARRAY_AGG(DISTINCT relative_path)) AS obj FROM OLD GROUP BY virtual_storage ) t; END CASE; CASE WHEN JSONB_ARRAY_LENGTH(msg) > 0 THEN PERFORM PG_NOTIFY(TG_ARGV[TG_NARGS-1], msg::TEXT); ELSE END CASE; RETURN NULL; END; $$ LANGUAGE plpgsql; -- +migrate StatementEnd`, }, Down: []string{ `-- +migrate StatementBegin CREATE OR REPLACE FUNCTION notify_on_change() RETURNS TRIGGER AS $$ DECLARE old_val JSON DEFAULT NULL; new_val JSON DEFAULT NULL; BEGIN CASE TG_OP WHEN 'INSERT' THEN SELECT JSON_AGG(ROW_TO_JSON(t.*)) INTO new_val FROM NEW AS t; WHEN 'UPDATE' THEN SELECT JSON_AGG(ROW_TO_JSON(t.*)) INTO old_val FROM OLD AS t; SELECT JSON_AGG(ROW_TO_JSON(t.*)) INTO new_val FROM NEW AS t; WHEN 'DELETE' THEN SELECT JSON_AGG(ROW_TO_JSON(t.*)) INTO old_val FROM OLD AS t; END CASE; PERFORM PG_NOTIFY(TG_ARGV[TG_NARGS-1], JSON_BUILD_OBJECT('old', old_val, 'new', new_val)::TEXT); RETURN NULL; END; $$ LANGUAGE plpgsql; -- +migrate StatementEnd`, }, } allMigrations = append(allMigrations, m) }