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.6'
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.



51
52
53
54
55
56
57
58
# File 'lib/kyototycoon.rb', line 51

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

.configure_reset!Object



40
41
42
# File 'lib/kyototycoon.rb', line 40

def self.configure_reset!
  @configure = {}
end

.configuresObject



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

def self.configures
  @configure
end

.create(name) ⇒ Object



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

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



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

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



103
104
105
# File 'lib/kyototycoon.rb', line 103

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



107
108
109
110
111
112
113
114
115
# File 'lib/kyototycoon.rb', line 107

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



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

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

#clientObject



241
242
243
244
245
246
# File 'lib/kyototycoon.rb', line 241

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



123
124
125
# File 'lib/kyototycoon.rb', line 123

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

#echo(value) ⇒ Object



182
183
184
185
# File 'lib/kyototycoon.rb', line 182

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

#finishObject



252
253
254
# File 'lib/kyototycoon.rb', line 252

def finish
  client.finish
end

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



76
77
78
79
# File 'lib/kyototycoon.rb', line 76

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

#get_bulk(keys) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/kyototycoon.rb', line 143

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 = {}
  bulk = Tsvrpc.parse(res[:body], res[:colenc])
  bulk = bulk.find_all{|k,v| k.match(/^_/)}.inject({}){|r,kv| r[kv.first] = kv.last; r}
  ret = bulk.reduce({}) do |hash, (k,v)|
    key = k.match(/^_/) ? k[1..-1] : k
    hash[key] = @serializer.decode(v)
    hash
  end
  ret
end

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



117
118
119
120
# File 'lib/kyototycoon.rb', line 117

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



128
129
130
131
# File 'lib/kyototycoon.rb', line 128

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



222
223
224
# File 'lib/kyototycoon.rb', line 222

def keys
  match_prefix("")
end

#match_prefix(prefix) ⇒ Object



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

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



208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/kyototycoon.rb', line 208

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



82
83
84
# File 'lib/kyototycoon.rb', line 82

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

#remove_bulk(keys) ⇒ Object



160
161
162
163
164
165
166
167
# File 'lib/kyototycoon.rb', line 160

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



98
99
100
101
# File 'lib/kyototycoon.rb', line 98

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



187
188
189
190
# File 'lib/kyototycoon.rb', line 187

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

#request(path, params = nil) ⇒ Object



226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/kyototycoon.rb', line 226

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: []=



87
88
89
90
# File 'lib/kyototycoon.rb', line 87

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



133
134
135
136
137
138
139
140
141
# File 'lib/kyototycoon.rb', line 133

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

#startObject



248
249
250
# File 'lib/kyototycoon.rb', line 248

def start
  client.start
end

#statusObject



192
193
194
195
# File 'lib/kyototycoon.rb', line 192

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

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



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

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

#vacuumObject



173
174
175
# File 'lib/kyototycoon.rb', line 173

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