Class: TyrantClient

Inherits:
Object
  • Object
show all
Defined in:
lib/tyrant_client.rb

Overview

Tyrant Client

Manages many tyrant clients and exposes basic get/set/delete functionality for them.

Direct Known Subclasses

TyrantNode

Constant Summary collapse

@@connections =
{}

Instance Method Summary collapse

Constructor Details

#initialize(servers) ⇒ TyrantClient

Initializes a TyrantClient. servers is expected to be an array of servers in form of “host:port”



24
25
26
27
28
29
# File 'lib/tyrant_client.rb', line 24

def initialize(servers)
  @servers = servers.collect do |server|
    parts = server.split(':')
    [parts[0], parts[1].to_i]
  end
end

Instance Method Details

#delete(key) ⇒ Object



47
48
49
50
51
52
53
54
55
56
# File 'lib/tyrant_client.rb', line 47

def delete(key)
  db = self.get_db(key)

  begin
    db.delete(key)
    return true
  rescue
    return false
  end
end

#get(key) ⇒ Object

– Get/Set/Delete ++



34
35
36
37
38
# File 'lib/tyrant_client.rb', line 34

def get(key)
  db = self.get_db(key)

  db[key]
end

#get_connection(host, port) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/tyrant_client.rb', line 80

def get_connection(host, port)
  key = "#{host}#{port}"

  return @@connections[key] unless @@connections[key].nil?

  @@connections[key] = Rufus::Tokyo::Tyrant.new(host, port)
  return @@connections[key]
end

#get_db(key) ⇒ Object

– Helpers ++



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/tyrant_client.rb', line 61

def get_db(key)
  index = self.hash(key) % @servers.length
  first_host, first_port = @servers[index]
  
  begin
    return self.get_connection(first_host, first_port)
  rescue
    # Didn't work, try out other servers
    @servers.each do |server|
      host, port = server

      # The python code "continues" on error code 61. Not sure
      # what that is so I'll ignore it here but TODO to go back
      # and look at it
      return self.get_connection(host, port)
    end
  end
end

#hash(key) ⇒ Object



89
90
91
92
93
94
95
96
97
98
# File 'lib/tyrant_client.rb', line 89

def hash(key)
  m = Digest::MD5.new
  m.update(key)
  b_key = m.digest

  return ((b_key[7] << 24) | 
          (b_key[6] << 16) | 
          (b_key[5] << 8) | 
          (b_key[4])) 
end

#set(key, value) ⇒ Object



40
41
42
43
44
45
# File 'lib/tyrant_client.rb', line 40

def set(key, value)
  db = self.get_db(key)

  db[key] = value
  self
end