Class: Roma::Client::RomaClient

Inherits:
Object
  • Object
show all
Defined in:
lib/roma/client/rclient.rb

Overview

Class to access ROMA .

Constant Summary collapse

@@timeout =

ROMA server connect timeout .

5

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ini_nodes, plugin_modules = nil, start_sync_routing_proc = true) ⇒ RomaClient

ROMA client constractor .

ini_nodes

ROMA nodes array

plugin_modules

set plugin modules if you use .



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/roma/client/rclient.rb', line 26

def initialize(ini_nodes, plugin_modules = nil, start_sync_routing_proc = true)
  @retry_count_write = 10
  @retry_count_read = 5
  @default_hash_name = 'roma'

  if plugin_modules
    plugin_modules.each do |plugin|
      self.extend plugin
    end
  end

  init_sender
  update_rttable(ini_nodes.map { |n| n.sub(':', '_') })
  init_sync_routing_proc if start_sync_routing_proc
end

Instance Attribute Details

#default_hash_nameObject

Returns the value of attribute default_hash_name.



20
21
22
# File 'lib/roma/client/rclient.rb', line 20

def default_hash_name
  @default_hash_name
end

#retry_count_readObject

Returns the value of attribute retry_count_read.



19
20
21
# File 'lib/roma/client/rclient.rb', line 19

def retry_count_read
  @retry_count_read
end

#retry_count_writeObject

Returns the value of attribute retry_count_write.



18
19
20
# File 'lib/roma/client/rclient.rb', line 18

def retry_count_write
  @retry_count_write
end

#rttableObject

Returns the value of attribute rttable.



16
17
18
# File 'lib/roma/client/rclient.rb', line 16

def rttable
  @rttable
end

#sender=(value) ⇒ Object

Sets the attribute sender

Parameters:

  • value

    the value to set the attribute sender to.



17
18
19
# File 'lib/roma/client/rclient.rb', line 17

def sender=(value)
  @sender = value
end

Instance Method Details

#[](key) ⇒ Object

Get value from ROMA .

key

key for roma.

returen

value sotored roma .
If key don't exit ROMA, return nil .
If coneect error, throw Exception .


111
112
113
# File 'lib/roma/client/rclient.rb', line 111

def [](key)
  get(key)
end

#[]=(key, value) ⇒ Object

Set value to ROMA . please see set method .



101
102
103
# File 'lib/roma/client/rclient.rb', line 101

def []=(key, value)
  set(key, value)
end

#add(key, val, expt = 0, raw = false) ⇒ Object

Add value to ROMA .

If same key exists in ROMA, this method don’t overwrite value and return NOT_STORED .

key

key for store .

value

store value .

exp

expire seconds .

raw

You set this value true, value isn’t marshaled .

return

return follow set status .

  • If method is success, return STORED .

  • If same key exists in ROMA, return NOT_STORED .

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



155
156
157
158
# File 'lib/roma/client/rclient.rb', line 155

def add(key, val, expt = 0, raw = false)
  val = Marshal.dump(val) unless raw
  sender(:oneline_receiver, key, val, "add %s 0 %d %d", expt.to_i, val.length)
end

#append(key, val, expt = 0) ⇒ Object

Append value to exists string .

If same key exists in ROMA, this method append value . If same key doesn’t exist in ROMA this method don’t store value and return NOT_STORE .

key

key for append .

value

append value .

exp

expire seconds .

return

return follow set status .

  • If method is success, return STORED .

  • If same key exists in ROMA, return NOT_STORED .

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



202
203
204
# File 'lib/roma/client/rclient.rb', line 202

def append(key, val, expt = 0)
  sender(:oneline_receiver, key, val, "append %s 0 %d %d", expt.to_i, val.length)
end

#cas(key, expt = 0, raw = false) ⇒ Object

Compare And Swap value .

key

key for cas .

value

store value .

exp

expire seconds .

return

return follow set status .

  • If method is success, return STORED .

  • If method cannot update value, return EXISTS .

  • If key doesn’t exist in ROMA, this method return NOT_FOUND.

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



243
244
245
246
247
248
249
250
251
252
# File 'lib/roma/client/rclient.rb', line 243

def cas(key, expt = 0, raw = false)
  raise "A block is required" unless block_given?

  (val, casid) = gets_with_casid(key, raw)
  return "NOT_FOUND" unless val
  updated = yield val
  val = raw ? updated : Marshal.dump(updated)

  sender(:oneline_receiver, key, val, "cas %s 0 %d %d %s", expt.to_i, val.length, casid)
end

#decr(key, val = 1) ⇒ Object

decrement value .

key

key for decremental .

val

decremental value .

return

Fixnum decrementaled value .

If same key doesn’t exist in ROMA, return NOT_FOUND .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



373
374
375
376
377
# File 'lib/roma/client/rclient.rb', line 373

def decr(key, val = 1)
  ret = sender(:oneline_receiver, key, nil, "decr %s %d", val.to_i)
  return ret if ret =~ /\D/
  ret.to_i
end

#delete(key) ⇒ Object

Delete value .

key

key for delete .

return

return follow set status .

  • If method is success, return DELETED .

  • If same key doesn’t exist in ROMA, return NOT_FOUND .

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



266
267
268
# File 'lib/roma/client/rclient.rb', line 266

def delete(key)
  sender(:oneline_receiver, key, nil, "delete %s")
end

#flush_allObject

Raises:

  • (RuntimeError)


340
341
342
343
# File 'lib/roma/client/rclient.rb', line 340

def flush_all()
  raise RuntimeError.new("Unsupported yet") # TODO
  @sender.send_flush_all_command
end

#get(key, raw = false) ⇒ Object

get value

key

key for get .

raw

If you set this value true, value isn’t Marshal.load value .

return

return stored value in ROMA .

If key doesn’t exist in ROMA, this method return nil .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



301
302
303
304
305
306
# File 'lib/roma/client/rclient.rb', line 301

def get(key, raw = false)
  val = sender(:value_list_receiver, key, nil, "get %s")[0]
  return nil if val.nil?
  val = Marshal.load(val) unless raw
  val
end

#gets(keys, raw = false) ⇒ Object

get values .

keys

key array for get .

raw

If you set this value true, value isn’t Marshal.load value .

return

return key and sotored value hash .

If all key doesn’t exist in ROMA, return empty hash . If some key doesn’t exist in ROMA, return exist key and sotred value hash .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
# File 'lib/roma/client/rclient.rb', line 320

def gets(keys, raw = false)
  kn = {}
  keys.each{|key|
    nid, d = @rttable.search_node(key)
    kn[nid] ||= []
    kn[nid] << key
  }

  res = {}
  kn.each_pair{|nid,ks|
    res.merge!(gets_sender(nid, ks))
  }
  unless raw
    res.each do |key, val|
      res[key] = Marshal.load(val)
    end
  end
  res
end

#incr(key, val = 1) ⇒ Object

increment value .

key

key for incremental .

val

incremental value .

return

Fixnum incrementaled value .

If same key doesn’t exist in ROMA, return NOT_FOUND .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



356
357
358
359
360
# File 'lib/roma/client/rclient.rb', line 356

def incr(key, val = 1)
  ret = sender(:oneline_receiver, key, nil, "incr %s %d", val.to_i)
  return ret if ret =~ /\D/
  ret.to_i
end

#make_rttable(node) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/roma/client/rclient.rb', line 80

def make_rttable(node)
  mklhash = @sender.send_route_mklhash_command(node)
  return nil unless mklhash

  if @rttable && @rttable.mklhash == mklhash
    return @rttable
  end

  rd = @sender.send_routedump_command(node)
  if rd
    ret = ClientRoutingTable.new(rd)
    ret.mklhash = mklhash
    return ret
  end
  nil
rescue
  nil
end

#out(key) ⇒ Object

Delete value completely .

This method delete value completely. “completely” means Don’t set delete flag in server, but delete value in storage . Delete method set delete flag, but delete value soon .

key

key for delete .

return

return follow set status .

  • If method is success, return DELETED .

  • If same key doesn’t exist in ROMA, return NOT_FOUND .

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



286
287
288
# File 'lib/roma/client/rclient.rb', line 286

def out(key)
  sender(:oneline_receiver, key, nil, "out %s")
end

#prepend(key, val, expt = 0) ⇒ Object

Prepend value to exists string .

If same key exists in ROMA, this method prepend value . If same key doesn’t exist in ROMA this method don’t store value and return NOT_STORE .

key

key for prepend .

value

prepend value .

exp

expire seconds .

return

return follow set status .

  • If method is success, return STORED .

  • If same key exists in ROMA, return NOT_STORED .

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



224
225
226
# File 'lib/roma/client/rclient.rb', line 224

def prepend(key, val, expt = 0)
  sender(:oneline_receiver, key, val, "prepend %s 0 %d %d", expt.to_i, val.length)
end

#replace(key, val, expt = 0, raw = false) ⇒ Object

Add value to ROMA .

If same key exists in ROMA, this method overwrite value . If same key doesn’t exist in ROMA this method don’t store value and return NOT_STORE .

key

key for store .

value

store value .

exp

expire seconds .

raw

You set this value true, value isn’t marshaled .

return

return follow set status .

  • If method is success, return STORED .

  • If same key exists in ROMA, return NOT_STORED .

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



179
180
181
182
# File 'lib/roma/client/rclient.rb', line 179

def replace(key, val, expt = 0, raw = false)
  val = Marshal.dump(val) unless raw
  sender(:oneline_receiver, key, val, "replace %s 0 %d %d", expt.to_i, val.length)
end

#rttable_last_updateObject



76
77
78
# File 'lib/roma/client/rclient.rb', line 76

def rttable_last_update
  @rttable_last_update
end

#set(key, val, expt = 0, raw = false) ⇒ Object

Set value to ROMA .

Both same same key exists or not exists in ROMA, this method set value .

key

key for store .

value

store value .

exp

expire seconds .

raw

You set this value true, value isn’t marshaled .

return

return follow set status .

  • If method is success, return STORED .

  • If method is not stored, return NOT_STORED .

  • If server error, return SERVER_ERROR .

If socket error occured, throw Exception .

If socket timeout occured, throw TimeoutError .



132
133
134
135
# File 'lib/roma/client/rclient.rb', line 132

def set(key, val, expt = 0, raw = false)
  val = Marshal.dump(val) unless raw
  sender(:oneline_receiver, key, val, "set %s 0 %d %d", expt.to_i, val.length)
end

#stats(filter: "", node: @rttable.nodes.first) ⇒ Object



379
380
381
# File 'lib/roma/client/rclient.rb', line 379

def stats(filter: "", node: @rttable.nodes.first)
  @sender.send_stats_command(filter, node)
end

#update_rttable(nodes = self.rttable.nodes) ⇒ Object

Raises:

  • (RuntimeError)


61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/roma/client/rclient.rb', line 61

def update_rttable(nodes = self.rttable.nodes)
  raise RuntimeError.new("nodes must not be nil.") unless nodes

  nodes.each { |node|
    rt = make_rttable(node)
    if rt
      @rttable = rt
      @rttable_last_update = Time.now
      return
    end
  }

  raise RuntimeError.new("fatal error")
end

#verbosityObject

Raises:

  • (RuntimeError)


388
389
390
391
# File 'lib/roma/client/rclient.rb', line 388

def verbosity
  raise RuntimeError.new("Unsupported yet") # TODO
  @sender.send_verbosity_command
end

#versionObject

Raises:

  • (RuntimeError)


383
384
385
386
# File 'lib/roma/client/rclient.rb', line 383

def version
  raise RuntimeError.new("Unsupported yet") # TODO
  @sender.send_version_command
end