Class: WorkerRoulette::Lua

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

Instance Method Summary collapse

Constructor Details

#initialize(connection_pool) ⇒ Lua

Returns a new instance of Lua.



5
6
7
# File 'lib/worker_roulette/lua.rb', line 5

def initialize(connection_pool)
  @connection_pool = connection_pool
end

Instance Method Details

#cacheObject



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

def cache
  Thread.main[:worker_roulette_lua_script_cache].dup
end

#call(lua_script, keys_accessed = [], args = [], &callback) ⇒ Object



9
10
11
12
13
# File 'lib/worker_roulette/lua.rb', line 9

def call(lua_script, keys_accessed = [], args = [], &callback)
  @connection_pool.with do |redis|
    evalsha(redis, lua_script, keys_accessed, args, &callback)
  end
end

#clear_cache!Object



23
24
25
# File 'lib/worker_roulette/lua.rb', line 23

def clear_cache!
  Thread.main[:worker_roulette_lua_script_cache] = {}
end

#eval(redis, lua_script, keys_accessed, args, &callback) ⇒ Object



27
28
29
30
31
# File 'lib/worker_roulette/lua.rb', line 27

def eval(redis, lua_script, keys_accessed, args, &callback)
  results = redis.eval(lua_script, keys_accessed.length, *keys_accessed, *args)
  results.callback(&callback) if callback
  results.errback  {|err_msg| raise EM::Hiredis::RedisError.new(err_msg)}
end

#evalsha(redis, lua_script, keys_accessed, args, &callback) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/worker_roulette/lua.rb', line 33

def evalsha(redis, lua_script, keys_accessed, args, &callback)
  if redis.class == EM::Hiredis::Client
    results = redis.evalsha(sha(lua_script), keys_accessed.length, *keys_accessed, *args)
    results.callback(&callback) if callback
    results.errback {eval(redis, lua_script, keys_accessed, args, &callback)}
  else
    begin
      results = redis.evalsha(sha(lua_script), keys_accessed, args)
    rescue Redis::CommandError
      results = redis.eval(lua_script, keys_accessed, args)
    ensure
      return callback.call results if callback
    end
  end
  results
end

#sha(lua_script) ⇒ Object



15
16
17
# File 'lib/worker_roulette/lua.rb', line 15

def sha(lua_script)
  Thread.main[:worker_roulette_lua_script_cache][lua_script] ||= Digest::SHA1.hexdigest(lua_script)
end