module PgHero
  module Methods
    module Connections
      def connections
        if server_version_num >= 90500
          select_all <<-SQL
            SELECT
              pg_stat_activity.pid,
              datname AS database,
              usename AS user,
              application_name AS source,
              client_addr AS ip,
              state,
              ssl
            FROM
              pg_stat_activity
            LEFT JOIN
              pg_stat_ssl ON pg_stat_activity.pid = pg_stat_ssl.pid
            ORDER BY
              pg_stat_activity.pid
          SQL
        else
          select_all <<-SQL
            SELECT
              pid,
              datname AS database,
              usename AS user,
              application_name AS source,
              client_addr AS ip,
              state
            FROM
              pg_stat_activity
            ORDER BY
              pid
          SQL
        end
      end

      def total_connections
        select_one("SELECT COUNT(*) FROM pg_stat_activity")
      end

      def connection_states
        states = select_all <<-SQL
          SELECT
            state,
            COUNT(*) AS connections
          FROM
            pg_stat_activity
          GROUP BY
            1
          ORDER BY
            2 DESC, 1
        SQL

        Hash[states.map { |s| [s[:state], s[:connections]] }]
      end

      def connection_sources
        select_all <<-SQL
          SELECT
            datname AS database,
            usename AS user,
            application_name AS source,
            client_addr AS ip,
            COUNT(*) AS total_connections
          FROM
            pg_stat_activity
          GROUP BY
            1, 2, 3, 4
          ORDER BY
            5 DESC, 1, 2, 3, 4
        SQL
      end
    end
  end
end
