class Dexter::Client

Attributes

arguments[R]
options[R]

Public Class Methods

new(args) click to toggle source
# File lib/dexter/client.rb, line 14
def initialize(args)
  @arguments, @options = parse_args(args)
end
start() click to toggle source
# File lib/dexter/client.rb, line 8
def self.start
  Dexter::Client.new(ARGV).perform
rescue Dexter::Abort, PG::UndefinedFile => e
  abort colorize(e.message.strip, :red)
end

Public Instance Methods

parse_args(args) click to toggle source
# File lib/dexter/client.rb, line 38
def parse_args(args)
  opts = Slop.parse(args) do |o|
    o.banner = %(Usage:
dexter [options])
    o.separator ""
    o.separator "Options:"
    o.boolean "--analyze", "analyze tables that haven't been analyzed in the past hour", default: false
    o.boolean "--create", "create indexes", default: false
    o.array "--exclude", "prevent specific tables from being indexed"
    o.string "--include", "only include specific tables"
    o.string "--input-format", "input format", default: "stderr"
    o.integer "--interval", "time to wait between processing queries, in seconds", default: 60
    o.boolean "--log-explain", "log explain", default: false, help: false
    o.string "--log-level", "log level", default: "info"
    o.boolean "--log-sql", "log sql", default: false
    o.float "--min-calls", "only process queries that have been called a certain number of times", default: 0
    o.float "--min-time", "only process queries that have consumed a certain amount of DB time, in minutes", default: 0
    o.integer "--min-cost-savings-pct", default: 50, help: false
    o.boolean "--pg-stat-activity", "use pg_stat_activity", default: false, help: false
    o.boolean "--pg-stat-statements", "use pg_stat_statements", default: false, help: false
    o.string "-s", "--statement", "process a single statement"
    o.string "--tablespace", "tablespace to create indexes"
    o.on "-v", "--version", "print the version" do
      log Dexter::VERSION
      exit
    end
    o.on "--help", "prints help" do
      log o
      exit
    end
    o.separator ""
    o.separator "Connection options:"
    o.string "-d", "--dbname", "database name"
    o.string "-h", "--host", "database host"
    o.integer "-p", "--port", "database port"
    o.string "-U", "--username", "database user"
  end

  arguments = opts.arguments
  options = opts.to_hash

  options[:dbname] = arguments.shift unless options[:dbname]

  # TODO don't use global var
  $log_level = options[:log_level].to_s.downcase
  raise Dexter::Abort, "Unknown log level" unless ["error", "info", "debug", "debug2", "debug3"].include?($log_level)

  [arguments, options]
rescue Slop::Error => e
  raise Dexter::Abort, e.message
end
perform() click to toggle source
# File lib/dexter/client.rb, line 18
def perform
  STDOUT.sync = true
  STDERR.sync = true

  if options[:statement]
    query = Query.new(options[:statement])
    Indexer.new(options).process_queries([query])
  elsif options[:pg_stat_statements]
    # TODO support streaming option
    Indexer.new(options).process_stat_statements
  elsif options[:pg_stat_activity]
    Processor.new(:pg_stat_activity, options).perform
  elsif arguments.any?
    ARGV.replace(arguments)
    Processor.new(ARGF, options).perform
  else
    Processor.new(STDIN, options).perform
  end
end