class PgAuditLog::Entry

Constants

TABLE_NAME

Public Class Methods

delete(id) click to toggle source
# File lib/pg_audit_log/entry.rb, line 81
def delete(id)
  raise CannotDeleteError
end
delete_all() click to toggle source
# File lib/pg_audit_log/entry.rb, line 85
def delete_all
  raise CannotDeleteError
end
install() click to toggle source
# File lib/pg_audit_log/entry.rb, line 20
    def install
      sql = <<-SQL
        CREATE SEQUENCE #{self.table_name}_id_seq
            START WITH 1
            INCREMENT BY 1;

        CREATE TABLE #{self.table_name} (
            id bigint PRIMARY KEY DEFAULT nextval('#{self.table_name}_id_seq'),
            user_id integer,
            user_unique_name character varying(255),
            operation character varying(255),
            table_name character varying(255),
            field_name character varying(255),
            field_value_new text,
            field_value_old text,
            occurred_at timestamp without time zone,
            primary_key character varying(255)
        );

        ALTER SEQUENCE #{self.table_name}_id_seq OWNED BY #{self.table_name}.id;

        CREATE OR REPLACE FUNCTION audit_log_insert_trigger()
        RETURNS TRIGGER AS $$
        DECLARE
          tablename TEXT;
          insert_sql TEXT;
          create_table_sql TEXT;
          month_start DATE;
          month_end DATE;
        BEGIN
          tablename := '#{self.table_name}_' || to_char(NEW.occurred_at, 'YYYYMM');
          insert_sql := 'INSERT INTO ' || tablename || ' VALUES($1.*)';
          EXECUTE insert_sql USING NEW;
          RETURN NULL;
        EXCEPTION
          WHEN null_value_not_allowed THEN
            RETURN NULL;
          WHEN undefined_table THEN
            EXECUTE 'SELECT to_char($1, ''YYYY-MM-01'')::DATE' INTO month_start USING NEW.occurred_at;
            EXECUTE 'SELECT ($1 +  INTERVAL ''1 MONTH'')' INTO month_end USING month_start;
            create_table_sql :=  'CREATE TABLE ' || tablename || ' ( CHECK ( date(occurred_at) >= DATE ''' || month_start || ''' AND date(occurred_at) < DATE ''' ||
              month_end || ''' ) ) INHERITS (#{self.table_name})';
            EXECUTE create_table_sql;
            EXECUTE 'CREATE INDEX ' || tablename || '_occurred_at ON ' || tablename || ' (date(occurred_at))';
            EXECUTE insert_sql USING NEW;
            RETURN NULL;
        END;
        $$
        LANGUAGE plpgsql;

        CREATE TRIGGER insert_audit_log_trigger
          BEFORE INSERT ON audit_log
          FOR EACH ROW EXECUTE PROCEDURE audit_log_insert_trigger();
      SQL
      connection.execute(sql)
    end
installed?() click to toggle source
# File lib/pg_audit_log/entry.rb, line 16
def installed?
  connection.tables.include?(self.table_name)
end
uninstall() click to toggle source
# File lib/pg_audit_log/entry.rb, line 77
def uninstall
  connection.execute("DROP TABLE IF EXISTS #{self.table_name} CASCADE")
end