text: CREATE OR REPLACE FUNCTION set_updated_at() RETURNS trigger AS $$
  BEGIN
      IF (
          NEW IS DISTINCT FROM OLD AND
          NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
      ) THEN
          NEW.updated_at = CURRENT_TIMESTAMP;
      END IF;
      RETURN NEW;
  END
  $$ LANGUAGE plpgsql;
  
  CREATE OR REPLACE FUNCTION set_updated_at_ignore_downloads() RETURNS trigger AS $$
  DECLARE
      new_downloads integer;
  BEGIN
      new_downloads := NEW.downloads;
      OLD.downloads := NEW.downloads;
      IF (
          NEW IS DISTINCT FROM OLD AND
          NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
      ) THEN
          NEW.updated_at = CURRENT_TIMESTAMP;
      END IF;
      NEW.downloads := new_downloads;
      RETURN NEW;
  END
  $$ LANGUAGE plpgsql;
  