class KyotoTycoon

$ cat foo.rb require “rubygems” require “kyototycoon”

KyotoTycoon::Stream.run($stdin) do |line|

... do some stuff ..

end

$ ktremotemgr slave -uw | ruby foo.rb

Constants

DEFAULT_HOST
DEFAULT_PORT
VERSION

Attributes

colenc[RW]
connect_timeout[RW]
db[R]
logger[R]
serializer[R]
servers[RW]

Public Class Methods

configure(name, host=DEFAULT_HOST, port=DEFAULT_PORT, &block) click to toggle source
# File lib/kyototycoon.rb, line 25
def self.configure(name, host=DEFAULT_HOST, port=DEFAULT_PORT, &block)
  @configure ||= {}
  if @configure[name]
    raise "'#{name}' is registered"
  end
  @configure[name] = lambda{
    kt = KyotoTycoon.new(host, port)
    block.call(kt)
    kt
  }
end
configure_reset!() click to toggle source
# File lib/kyototycoon.rb, line 41
def self.configure_reset!
  @configure = {}
end
configures() click to toggle source
# File lib/kyototycoon.rb, line 37
def self.configures
  @configure
end
create(name) click to toggle source
# File lib/kyototycoon.rb, line 45
def self.create(name)
  if @configure[name].nil?
    raise "undefined configure: '#{name}'"
  end
  @configure[name].call
end
new(host=DEFAULT_HOST, port=DEFAULT_PORT) click to toggle source
# File lib/kyototycoon.rb, line 52
def initialize(host=DEFAULT_HOST, port=DEFAULT_PORT)
  @servers = [[host, port]]
  @checked_servers = nil
  @serializer = KyotoTycoon::Serializer::Default
  @logger = Logger.new(nil)
  @colenc = :B
  @connect_timeout = 0.5
  @cursor = 1
end

Public Instance Methods

[](key)
Alias for: get
[]=(key, value, xt=nil)
Alias for: set
add(key, value, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 95
def add(key, value, xt=nil)
  res = request('/rpc/add', {:key => key, :value => @serializer.encode(value), :xt => xt})
  Tsvrpc.parse(res[:body], res[:colenc])
end
append(key, value, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 105
def append(key, value, xt=nil)
  request('/rpc/append', {:key => key, :value => @serializer.encode(value), :xt => xt})
end
cas(key, oldval, newval, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 109
def cas(key, oldval, newval, xt=nil)
  res = request('/rpc/cas', {:key => key, :oval=> @serializer.encode(oldval), :nval => @serializer.encode(newval), :xt => xt})
  case res[:status].to_i
    when 200
      true
    when 450
      false
  end
end
clear() click to toggle source
# File lib/kyototycoon.rb, line 171
def clear
  request('/rpc/clear')
end
client() click to toggle source
# File lib/kyototycoon.rb, line 243
def client
  host, port = *choice_server
  @client ||= begin
    Tsvrpc::Skinny.new(host, port)
  end
end
cursor(cur_id=nil) click to toggle source
# File lib/kyototycoon.rb, line 167
def cursor(cur_id=nil)
  Cursor.new(self, cur_id || @cursor += 1)
end
db=(db) click to toggle source
# File lib/kyototycoon.rb, line 67
def db= (db)
  @db = db
end
decr(key, num=1, xt=nil)
Alias for: decrement
decrement(key, num=1, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 125
def decrement(key, num=1, xt=nil)
  increment(key, num * -1, xt)
end
Also aliased as: decr
delete(*keys)
Alias for: remove
echo(value) click to toggle source
# File lib/kyototycoon.rb, line 184
def echo(value)
  res = request('/rpc/echo', value)
  Tsvrpc.parse(res[:body], res[:colenc])
end
finish() click to toggle source
# File lib/kyototycoon.rb, line 254
def finish
  client.finish
end
get(key) click to toggle source
# File lib/kyototycoon.rb, line 78
def get(key)
  res = request('/rpc/get', {:key => key})
  @serializer.decode(Tsvrpc.parse(res[:body], res[:colenc])['value'])
end
Also aliased as: []
get_bulk(keys) click to toggle source
# File lib/kyototycoon.rb, line 145
def get_bulk(keys)
  params = keys.inject({}){|params, k|
    params[k.to_s.match(/^_/) ? k.to_s : "_#{k}"] = ''
    params
  }
  res = request('/rpc/get_bulk', params)
  bulk = Tsvrpc.parse(res[:body], res[:colenc])
  bulk.delete_if{|k,v| k.match(/^[^_]/)}.inject({}){|r, (k,v)|
    r[k[1..-1]] = @serializer.decode(v)
    r
  }
end
incr(key, num=1, xt=nil)
Alias for: increment
increment(key, num=1, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 119
def increment(key, num=1, xt=nil)
  res = request('/rpc/increment', {:key => key, :num => num, :xt => xt})
  Tsvrpc.parse(res[:body], res[:colenc])['num'].to_i
end
Also aliased as: incr
increment_double(key, num, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 130
def increment_double(key, num, xt=nil)
  res = request('/rpc/increment_double', {:key => key, :num => num, :xt => xt})
  Tsvrpc.parse(res[:body], res[:colenc])['num'].to_f
end
keys() click to toggle source
# File lib/kyototycoon.rb, line 224
def keys
  match_prefix("")
end
logger=(logger) click to toggle source
# File lib/kyototycoon.rb, line 71
def logger= (logger)
  if logger.class != Logger
    logger = Logger.new(logger)
  end
  @logger = logger
end
match_prefix(prefix) click to toggle source
# File lib/kyototycoon.rb, line 199
def match_prefix(prefix)
  res = request('/rpc/match_prefix', {:prefix => prefix})
  keys = []
  Tsvrpc.parse(res[:body], res[:colenc]).each{|k,v|
    if k != 'num'
      keys << k[1, k.length]
    end
  }
  keys
end
match_regex(re) click to toggle source
# File lib/kyototycoon.rb, line 210
def match_regex(re)
  if re.class == Regexp
    re = re.source
  end
  res = request('/rpc/match_regex', {:regex => re})
  keys = []
  Tsvrpc.parse(res[:body], res[:colenc]).each{|k,v|
    if k != 'num'
      keys << k[1, k.length]
    end
  }
  keys
end
remove(*keys) click to toggle source
# File lib/kyototycoon.rb, line 84
def remove(*keys)
  remove_bulk(keys.flatten)
end
Also aliased as: delete
remove_bulk(keys) click to toggle source
# File lib/kyototycoon.rb, line 158
def remove_bulk(keys)
  params = keys.inject({}){|params, k|
    params[k.to_s.match(/^_/) ? k.to_s : "_#{k}"] = ''
    params
  }
  res = request('/rpc/remove_bulk', params)
  Tsvrpc.parse(res[:body], res[:colenc])
end
replace(key, value, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 100
def replace(key, value, xt=nil)
  res = request('/rpc/replace', {:key => key, :value => @serializer.encode(value), :xt => xt})
  Tsvrpc.parse(res[:body], res[:colenc])
end
report() click to toggle source
# File lib/kyototycoon.rb, line 189
def report
  res = request('/rpc/report')
  Tsvrpc.parse(res[:body], res[:colenc])
end
request(path, params=nil) click to toggle source
# File lib/kyototycoon.rb, line 228
def request(path, params=nil)
  if @db
    params ||= {}
    params[:DB] = @db
  end

  status,body,colenc = client.request(path, params, @colenc)
  if ![200, 450].include?(status.to_i)
    raise body
  end
  res = {:status => status, :body => body, :colenc => colenc}
  @logger.info("#{path}: #{res[:status]} with query parameters #{params.inspect}")
  res
end
serializer=(adaptor=:default) click to toggle source
# File lib/kyototycoon.rb, line 62
def serializer= (adaptor=:default)
  klass = KyotoTycoon::Serializer.get(adaptor)
  @serializer = klass
end
set(key, value, xt=nil) click to toggle source
# File lib/kyototycoon.rb, line 89
def set(key, value, xt=nil)
  res = request('/rpc/set', {:key => key, :value => @serializer.encode(value), :xt => xt})
  Tsvrpc.parse(res[:body], res[:colenc])
end
Also aliased as: []=
set_bulk(records) click to toggle source
# File lib/kyototycoon.rb, line 135
def set_bulk(records)
  # records={'a' => 'aa', 'b' => 'bb'}
  values = {}
  records.each{|k,v|
    values[k.to_s.match(/^_/) ? k.to_s : "_#{k}"] = @serializer.encode(v)
  }
  res = request('/rpc/set_bulk', values)
  Tsvrpc.parse(res[:body], res[:colenc])
end
start() click to toggle source
# File lib/kyototycoon.rb, line 250
def start
  client.start
end
status() click to toggle source
# File lib/kyototycoon.rb, line 194
def status
  res = request('/rpc/status')
  Tsvrpc.parse(res[:body], res[:colenc])
end
sync(params={}) click to toggle source
# File lib/kyototycoon.rb, line 179
def sync(params={})
  request('/rpc/synchronize', params)
end
Also aliased as: syncronize
syncronize(params={})
Alias for: sync
vacuum() click to toggle source
# File lib/kyototycoon.rb, line 175
def vacuum
  request('/rpc/vacuum')
end

Private Instance Methods

choice_server() click to toggle source
# File lib/kyototycoon.rb, line 285
def choice_server
  if @checked_servers
    return @checked_servers
  end

  @servers.each{|s|
    host,port = *s
    if ping(host, port)
      @checked_servers = [host, port]
      break
    end
  }
  if @checked_servers.nil?
    msg = "alived server not exists"
    @logger.fatal(msg)
    raise msg
  end
  @checked_servers
end
ping(host, port) click to toggle source
# File lib/kyototycoon.rb, line 260
def ping(host, port)
  begin
    rpc = Tsvrpc::Skinny.new(host, port)
    Timeout.timeout(@connect_timeout){
      @logger.debug("connect check #{host}:#{port}")
      res = rpc.request('/rpc/echo', {'0' => '0'}, :U)
      @logger.debug(res)
    }
    true
  rescue Timeout::Error => ex
    # Ruby 1.8.7 compatible
    @logger.warn("connect failed at #{host}:#{port}")
    false
  rescue SystemCallError
    @logger.warn("connect failed at #{host}:#{port}")
    false
  rescue => ex
    @logger.warn("connect failed at #{host}:#{port}")
    false
  ensure
    # for 1.8.7
    rpc.finish
  end
end