augmenter:
  audit_columns:
    created_date_only:
      columns:
      - created_date
    default:
      columns:
      - modified_by_user
      - modified_timestamp
      triggers:
      - audit_default
    modified_only:
      columns:
      - modified_timestamp
      triggers:
      - audit_modified_only
    full:
      columns:
      - created_by_user
      - created_by_ip_address
      - created_timestamp
      - modified_by_user
      - modified_by_ip_address
      - modified_timestamp
      triggers:
      - audit_full
  columns:
    created_by_ip_address:
      not_null: true
      type: inet
    created_by_user:
      not_null: true
      type: character varying(63)
    created_date:
      default: ('now'::text)::date
      not_null: true
      type: date
    created_timestamp:
      not_null: true
      type: timestamp with time zone
    modified_by_ip_address:
      not_null: true
      type: inet
    modified_by_user:
      not_null: true
      type: character varying(63)
    modified_timestamp:
      not_null: true
      type: timestamp with time zone
  function_templates:
    functempl_audit_default: |2-

      BEGIN
        NEW.{{modified_by_user}} = SESSION_USER;
        NEW.{{modified_timestamp}} = CURRENT_TIMESTAMP;
        RETURN NEW;
      END
    functempl_audit_full: |2-

      DECLARE
        user_name name := pyrseas.get_session_variable('audit_user',
            SESSION_USER::varchar);
        ip_address inet := pyrseas.get_session_variable('audit_ip_address',
            COALESCE(pg_catalog.inet_client_addr()::varchar, '0.0.0.0'));
      BEGIN
        IF TG_OP = 'INSERT' THEN
          NEW.{{created_timestamp}} = CURRENT_TIMESTAMP;
          NEW.{{created_by_user}} = user_name;
          NEW.{{created_by_ip_address}} = ip_address;
        ELSIF TG_OP = 'UPDATE' THEN
          NEW.{{created_timestamp}} = OLD.created_timestamp;
          NEW.{{created_by_user}} = OLD.created_by_user;
          NEW.{{created_by_ip_address}} = OLD.created_by_ip_address;
        END IF;
        NEW.{{modified_timestamp}} = CURRENT_TIMESTAMP;
        NEW.{{modified_by_user}} = user_name;
        NEW.{{modified_by_ip_address}} = ip_address;
        RETURN NEW;
      END
    functempl_audit_modified: |2-

      BEGIN
        NEW.{{modified_timestamp}} = CURRENT_TIMESTAMP;
        RETURN NEW;
      END
  functions:
    audit_default():
      description: |-
        Provides modified_by_user and modified_timestamp values for audit
         columns.
      language: plpgsql
      returns: trigger
      security_definer: true
      source: '{{functempl_audit_default}}'
    audit_full():
      description: |-
        Provides created/modified values for audit columns.
      language: plpgsql
      returns: trigger
      security_definer: true
      source: '{{functempl_audit_full}}'
    audit_modified():
      description: |-
        Provides modified_timestamp values for audit columns.
      language: plpgsql
      returns: trigger
      security_definer: true
      source: '{{functempl_audit_modified}}'
  schema pyrseas:
    function get_session_variable(var_name character varying):
      language: plpgsql
      returns: character varying
      source: |2
          BEGIN
            RETURN pg_catalog.current_setting('pyrseas.' || var_name);
          END;
    function get_session_variable(var_name character varying, default_value character varying):
      language: plpgsql
      returns: character varying
      source: |2
          BEGIN
            RETURN pg_catalog.current_setting('pyrseas.' || var_name);
          EXCEPTION
            WHEN undefined_object THEN
              RETURN default_value;
          END;
    function set_session_variable(var_name character varying, var_value character varying):
      language: plpgsql
      returns: void
      source: |2
          BEGIN
            PERFORM pg_catalog.set_config('pyrseas.' || var_name, var_value, false);
          END;
  triggers:
    audit_default:
      events:
      - update
      level: row
      name: '{{table_name}}_20_audit_default'
      procedure: audit_default()
      timing: before
    audit_full:
      events:
      - insert
      - update
      level: row
      name: '{{table_name}}_20_audit_full'
      procedure: audit_full()
      timing: before
    audit_modified_only:
      events:
      - insert
      - update
      level: row
      name: '{{table_name}}_20_audit_modified_only'
      procedure: audit_modified()
      timing: before
repository:
  metadata: metadata
  data: metadata
