Class: KyotoTycoon

Inherits:
Object
  • Object
show all
Defined in:
lib/kyototycoon/stream.rb,
lib/kyototycoon.rb,
lib/kyototycoon/tsvrpc.rb,
lib/kyototycoon/serializer.rb,
lib/kyototycoon/tsvrpc/skinny.rb,
lib/kyototycoon/serializer/default.rb,
lib/kyototycoon/serializer/msgpack.rb

Overview

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

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

... do some stuff ..

end

$ ktremotemgr slave -uw | ruby foo.rb

Defined Under Namespace

Modules: Serializer, Stream, Tsvrpc

Constant Summary collapse

VERSION =
'0.5.3'
DEFAULT_HOST =
'0.0.0.0'
DEFAULT_PORT =
1978

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(host = DEFAULT_HOST, port = DEFAULT_PORT) ⇒ KyotoTycoon

Returns a new instance of KyotoTycoon.



43
44
45
46
47
48
49
50
# File 'lib/kyototycoon.rb', line 43

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
end

Instance Attribute Details

#colencObject

Returns the value of attribute colenc.



18
19
20
# File 'lib/kyototycoon.rb', line 18

def colenc
  @colenc
end

#connect_timeoutObject

Returns the value of attribute connect_timeout.



18
19
20
# File 'lib/kyototycoon.rb', line 18

def connect_timeout
  @connect_timeout
end

#dbObject

Returns the value of attribute db.



19
20
21
# File 'lib/kyototycoon.rb', line 19

def db
  @db
end

#loggerObject

Returns the value of attribute logger.



19
20
21
# File 'lib/kyototycoon.rb', line 19

def logger
  @logger
end

#serializerObject

Returns the value of attribute serializer.



19
20
21
# File 'lib/kyototycoon.rb', line 19

def serializer
  @serializer
end

#serversObject

Returns the value of attribute servers.



18
19
20
# File 'lib/kyototycoon.rb', line 18

def servers
  @servers
end

Class Method Details

.configure(name, host = DEFAULT_HOST, port = DEFAULT_PORT, &block) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
# File 'lib/kyototycoon.rb', line 24

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

.create(name) ⇒ Object



36
37
38
39
40
41
# File 'lib/kyototycoon.rb', line 36

def self.create(name)
  if @configure[name].nil?
    raise "undefined configure: '#{name}'"
  end
  @configure[name].call
end

Instance Method Details

#add(key, value, xt = nil) ⇒ Object



85
86
87
88
# File 'lib/kyototycoon.rb', line 85

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) ⇒ Object



95
96
97
# File 'lib/kyototycoon.rb', line 95

def append(key, value, xt=nil)
  request('/rpc/append', {:key => key, :value => @serializer.encode(value), :xt => xt})
end

#cas(key, oldval, newval, xt = nil) ⇒ Object



99
100
101
102
103
104
105
106
107
# File 'lib/kyototycoon.rb', line 99

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

#clearObject



157
158
159
# File 'lib/kyototycoon.rb', line 157

def clear
  request('/rpc/clear')
end

#clientObject



229
230
231
232
233
234
# File 'lib/kyototycoon.rb', line 229

def client
  host, port = *choice_server
  @client ||= begin
    Tsvrpc::Skinny.new(host, port)
  end
end

#decrement(key, num = 1, xt = nil) ⇒ Object Also known as: decr



115
116
117
# File 'lib/kyototycoon.rb', line 115

def decrement(key, num=1, xt=nil)
  increment(key, num * -1, xt)
end

#echo(value) ⇒ Object



170
171
172
173
# File 'lib/kyototycoon.rb', line 170

def echo(value)
  res = request('/rpc/echo', value)
  Tsvrpc.parse(res[:body], res[:colenc])
end

#finishObject



240
241
242
# File 'lib/kyototycoon.rb', line 240

def finish
  client.finish
end

#get(key) ⇒ Object Also known as: []



68
69
70
71
# File 'lib/kyototycoon.rb', line 68

def get(key)
  res = request('/rpc/get', {:key => key})
  @serializer.decode(Tsvrpc.parse(res[:body], res[:colenc])['value'])
end

#get_bulk(keys) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/kyototycoon.rb', line 135

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)
  ret = {}
  Tsvrpc.parse(res[:body], res[:colenc]).each{|k,v|
    ret[k] = k.match(/^_/) ? @serializer.decode(v) : v
  }
  ret
end

#increment(key, num = 1, xt = nil) ⇒ Object Also known as: incr



109
110
111
112
# File 'lib/kyototycoon.rb', line 109

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

#increment_double(key, num, xt = nil) ⇒ Object



120
121
122
123
# File 'lib/kyototycoon.rb', line 120

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

#keysObject



210
211
212
# File 'lib/kyototycoon.rb', line 210

def keys
  match_prefix("")
end

#match_prefix(prefix) ⇒ Object



185
186
187
188
189
190
191
192
193
194
# File 'lib/kyototycoon.rb', line 185

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) ⇒ Object



196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/kyototycoon.rb', line 196

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) ⇒ Object Also known as: delete



74
75
76
# File 'lib/kyototycoon.rb', line 74

def remove(*keys)
  remove_bulk(keys.flatten)
end

#remove_bulk(keys) ⇒ Object



148
149
150
151
152
153
154
155
# File 'lib/kyototycoon.rb', line 148

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) ⇒ Object



90
91
92
93
# File 'lib/kyototycoon.rb', line 90

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

#reportObject



175
176
177
178
# File 'lib/kyototycoon.rb', line 175

def report
  res = request('/rpc/report')
  Tsvrpc.parse(res[:body], res[:colenc])
end

#request(path, params = nil) ⇒ Object



214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/kyototycoon.rb', line 214

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

#set(key, value, xt = nil) ⇒ Object Also known as: []=



79
80
81
82
# File 'lib/kyototycoon.rb', line 79

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

#set_bulk(records) ⇒ Object



125
126
127
128
129
130
131
132
133
# File 'lib/kyototycoon.rb', line 125

def set_bulk(records)
  # records={'a' => 'aa', 'b' => 'bb'}
  values = {}
  records.each{|k,v|
    values["_#{k}"] = @serializer.encode(v)
  }
  res = request('/rpc/set_bulk', values)
  Tsvrpc.parse(res[:body], res[:colenc])
end

#startObject



236
237
238
# File 'lib/kyototycoon.rb', line 236

def start
  client.start
end

#statusObject



180
181
182
183
# File 'lib/kyototycoon.rb', line 180

def status
  res = request('/rpc/status')
  Tsvrpc.parse(res[:body], res[:colenc])
end

#sync(params = {}) ⇒ Object Also known as: syncronize



165
166
167
# File 'lib/kyototycoon.rb', line 165

def sync(params={})
  request('/rpc/synchronize', params)
end

#vacuumObject



161
162
163
# File 'lib/kyototycoon.rb', line 161

def vacuum
  request('/rpc/vacuum')
end