class RR::CommandRunner

This class implements the functionality to dispatch rubyrep commands.

Public Class Methods

commands() click to toggle source

Returns a hash of all commands registered with register.

# File lib/rubyrep/command_runner.rb, line 11
def self.commands
  @commands ||= {}
end
register(commands) click to toggle source

Registers one or multiple commands. commands is a hash with

  • key: name of the command

  • value: a command hash defining the command

A command hash consists of

  • :description: short description of the command

  • :command: an object / class implementing the hash.

    Must have a method
    
    # runs a command
    # * +args+: array of command line parameters
    #           note: will not contain the command name itself.
    def run(args)
# File lib/rubyrep/command_runner.rb, line 29
def self.register(commands)
  self.commands.merge!(commands)
end
run(args) click to toggle source

Dispatches commands as per given command line parameters.

  • args: array of command line parameters

# File lib/rubyrep/command_runner.rb, line 41
    def self.run(args)
      status = 0
      options = {}

      parser = OptionParser.new do |opts|
        opts.banner = <<EOS
Usage: #{$0} [general options] command [parameters, ...]

Asynchronous master-master replication of relational databases.
EOS
        opts.separator ""
        opts.separator "Available options:"

        opts.on("--verbose", "Show errors with full stack trace") do
          options[:verbose] = true
        end

        opts.on("-v", "--version", "Show version information.") do
          show_version
          options = nil
        end

        opts.on_tail("--help", "Show this message") do
          $stderr.puts opts
          
          $stderr.puts "\nAvailable commands:"
          commands.sort.each do |command_name, command_hash|
            $stderr.puts "  #{command_name.ljust(15)} #{command_hash[:description]}"
          end

          options = nil
        end
      end

      begin

        # extract general options
        general_args = []
        until args.empty?
          if args[0] =~ /^-/
            general_args << args.shift
          else
            break
          end
        end

        # parse general options
        parser.parse!(general_args)

        # process commands
        if options # this will be +nil+ if the --help or --version are specified
          if args.empty?
            $stderr.puts "No command specified.\n\n"
            run(['--help'])
            status = 1
          else
            command = args[0]
            if command == 'help' and args.size == 1
              run(['--help'])
              status = 0
            elsif commands.include? command
              status = commands[command][:command].run(args.slice(1, 1_000_000))
            else
              $stderr.puts "Error: Unknown command specified.\n\n"
              run(['--help'])
              status = 1
            end
          end
        end
      rescue Exception => e
        $stderr.puts "Exception caught: #{e}"
        $stderr.puts e.backtrace if options && options[:verbose]
        status = 1
      end

      return status
    end
show_version() click to toggle source

Prints the version to stderr

# File lib/rubyrep/command_runner.rb, line 34
def self.show_version
  $stdout.puts "rubyrep version #{RR::VERSION}"
end