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
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
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
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
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
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