class Flare::Tools::Client

Description

Public Class Methods

defcmd(method_symbol, command_template, &default_processor) click to toggle source
# File lib/flare/tools/client.rb, line 126
def self.defcmd(method_symbol, command_template, &default_processor)
  parser = lambda {|conn,processor|
    resp = ""
    answers = [Ok, End, Stored, Deleted, NotFound].map {|x| Flare::Util::Result.string_of_result(x)}
    fails = [Exists].map {|x| Flare::Util::Result.string_of_result(x)}
    errors = [Error, ServerError, ClientError].map {|x| Flare::Util::Result.string_of_result(x)}
    while x = conn.getline
      ans = x.chomp.split(' ', 2)
      ans = if ans.empty? then '' else ans[0] end
      case ans
      when *answers
        break
      when *fails
        resp = false
        break
      when *errors
        warn "Failed command. server=[#{self}] sent=[#{conn.last_sent}] result=[#{x.chomp}]"
        resp = false
        break
      else
        resp += x
      end
    end
    return processor.call(resp) if resp 
    return false
  }
  defcmd_generic(method_symbol, command_template, parser, true, &default_processor)
end
defcmd_generic(method_symbol, command_template, parser, timeout, &default_processor) click to toggle source
# File lib/flare/tools/client.rb, line 112
def self.defcmd_generic(method_symbol, command_template, parser, timeout, &default_processor)
  @@parsers[method_symbol] = parser
  @@processors[method_symbol] = default_processor || proc { false }
  timeout_expr = if timeout then "@tout" else "nil" end
  self.class_eval %{
    def #{method_symbol.to_s}(*args, &processor)
      cmd = "#{command_template}"
      cmd = cmd % args if args.size > 0
      processor = @@processors[:#{method_symbol}] if processor.nil?
      request(cmd, @@parsers[:#{method_symbol}], processor, #{timeout_expr})
    end
  }
end
defcmd_key(method_symbol, command_template, &default_processor) click to toggle source
# File lib/flare/tools/client.rb, line 170
def self.defcmd_key(method_symbol, command_template, &default_processor)
  parser = lambda {|conn,processor|
    rets = []
    while true
      line = conn.getline
      elems = line.split(' ')
      if elems[0] == "KEY"
        unless processor.nil?
          r = processor.call(elems[1])
          rets << r if r
        end
      elsif elems[0] == "END"
        return rets
      else
        info "key parser: error \"#{line.chomp}\""
        return false
      end
    end
  }
  defcmd_generic(method_symbol, command_template, parser, false, &default_processor)
end
defcmd_listelement(method_symbol, command_template, &default_processor) click to toggle source
# File lib/flare/tools/client.rb, line 217
def self.defcmd_listelement(method_symbol, command_template, &default_processor)
  parser = lambda {|conn,processor|
    rets = []
    while true
      line = conn.getline
      elems = line.split(' ')
      if elems[0] == "LISTELEMENT"
        key, rel, abs = elems[1], elems[2].to_i, elems[3].to_i
        flag, len, version, expire = elems[4].to_i, elems[5].to_i, elems[6], elems[7]
        data = conn.read(len)
        unless processor.nil?
          r = processor.call(data, key, rel, abs, flag, len, version, expire)
          rets << r if r
        end
        conn.getline # skip
      elsif elems[0] == "END"
        return rets[0] if rets.size == 1
        return rets
      else
        info "error \"#{line.chomp}\""
        return false
      end
    end
  }
  defcmd_generic(method_symbol, command_template, parser, false, &default_processor)
end
defcmd_noreply(method_symbol, command_template, &default_processor) click to toggle source
# File lib/flare/tools/client.rb, line 155
def self.defcmd_noreply(method_symbol, command_template, &default_processor)
  parser = lambda {|conn,processor|
    return processor.call()
  }
  defcmd_generic(method_symbol, command_template, parser, true, &default_processor)
end
defcmd_oneline(method_symbol, command_template, &default_processor) click to toggle source
# File lib/flare/tools/client.rb, line 162
def self.defcmd_oneline(method_symbol, command_template, &default_processor)
  parser = lambda {|conn,processor|
    line = conn.getline
    processor.call(line)
  }
  defcmd_generic(method_symbol, command_template, parser, true, &default_processor)
end
defcmd_value(method_symbol, command_template, &default_processor) click to toggle source
# File lib/flare/tools/client.rb, line 192
def self.defcmd_value(method_symbol, command_template, &default_processor)
  parser = lambda {|conn,processor|
    rets = []
    while true
      line = conn.getline
      elems = line.split(' ')
      if elems[0] == "VALUE"
        key, flag, len, version, expire = elems[1], elems[2].to_i, elems[3].to_i, elems[4].to_i, elems[5].to_i
        data = conn.read(len)
        unless processor.nil?
          r = processor.call(data, key, flag, len, version, expire)
          rets << r if r
        end
        conn.getline # skip
      elsif elems[0] == "END"
        return rets
      else
        info "value parser: error \"#{line.chomp}\""
        return false
      end
    end
  }
  defcmd_generic(method_symbol, command_template, parser, false, &default_processor)
end
new(host, port, tout = DefaultTimeout, uplink_limit = DefalutBwlimit, downlink_limit = DefalutBwlimit) click to toggle source
# File lib/flare/tools/client.rb, line 36
def initialize(host, port, tout = DefaultTimeout, uplink_limit = DefalutBwlimit, downlink_limit = DefalutBwlimit)
  @tout = tout
  @conn = nil
  Timeout.timeout(1) do
    @conn = Flare::Net::Connection.new(host, port, uplink_limit, downlink_limit)
  end
  @server_name, @version = server_version
rescue Errno::ECONNREFUSED
  debug "Connection refused. server=[#{@conn}]"
  raise
rescue TimeoutError
  debug "Connection timeout. server=[#{@conn}]"
  raise
rescue SocketError
  debug "Connection error. server=[#{host}:#{port}]"
  raise
end
open(host, port, tout = DefaultTimeout, uplink_limit = DefalutBwlimit, downlink_limit = DefalutBwlimit, &block) click to toggle source
# File lib/flare/tools/client.rb, line 23
def self.open(host, port, tout = DefaultTimeout, uplink_limit = DefalutBwlimit, downlink_limit = DefalutBwlimit, &block)
  session = nil
  session = self.new(host, port, tout, uplink_limit, downlink_limit)
  return session if block.nil?
  return block.call(session)
ensure
  if session.nil?
    error "failed to open #{host}:#{port}."
  else
    session.close # this might raise IOError
  end
end

Public Instance Methods

close() click to toggle source
# File lib/flare/tools/client.rb, line 101
def close()
  begin
    Timeout.timeout(1) { quit }
  rescue Timeout::Error => e
  end
  @conn.close
end
host() click to toggle source
# File lib/flare/tools/client.rb, line 63
def host
  @conn.host
end
hostname() click to toggle source
# File lib/flare/tools/client.rb, line 67
def hostname
  @conn.host
end
port() click to toggle source
# File lib/flare/tools/client.rb, line 71
def port
  @conn.port
end
received_size() click to toggle source
# File lib/flare/tools/client.rb, line 97
def received_size
  @conn.received_size
end
request(cmd, parser, processor, tout = @tout) click to toggle source
# File lib/flare/tools/client.rb, line 75
def request(cmd, parser, processor, tout = @tout)
  # info "request(#{cmd}, #{noreply})"
  @conn.reconnect if @conn.closed?
  debug "Enter the command server. server=[#{@conn}] command=[#{cmd}}]"
  response = nil
  cmd.chomp!
  cmd += "\r\n"
  Timeout.timeout(tout) do
    @conn.send(cmd)
    response = parser.call(@conn, processor)
  end
  response
rescue TimeoutError => e
  error "Connection timeout. server=[#{@conn}] command=[#{cmd}}]"
  @conn.close
  raise e
end
required_version?(required_version, version = @version) click to toggle source
# File lib/flare/tools/client.rb, line 54
def required_version?(required_version, version = @version)
  (0...required_version.size).each do |i|
    n = if i < version.size then version[i] else 0 end
    return true if n > required_version[i]
    return false if n < required_version[i]
  end
  true
end
sent_size() click to toggle source
# File lib/flare/tools/client.rb, line 93
def sent_size
  @conn.sent_size
end
server_version() click to toggle source
# File lib/flare/tools/client.rb, line 244
def server_version
  verstrings = version.split('-')
  server = "flare"
  server = verstrings.shift if verstrings.size > 1
  version = verstrings[0].split('.').map {|v| v.to_i}
  [server, version]
end
version() click to toggle source

we have two types of VERSION formats. VERSION flare-1.0.14 VERSION 1.0.9

# File lib/flare/tools/client.rb, line 255
def version
  version_
end