Class: CanvasSync::JobBatches::RedisScript
- Inherits:
-
Object
- Object
- CanvasSync::JobBatches::RedisScript
- Defined in:
- lib/canvas_sync/job_batches/redis_script.rb
Overview
RedisScript represents a lua script in the filesystem. It loads the script from disk and handles talking to redis to execute it. Error handling is handled by LuaError.
Defined Under Namespace
Classes: LuaError, TemplateContext
Instance Method Summary collapse
-
#call(redis, *args) ⇒ Object
Passes the script and supplied arguments to redis for evaulation.
- #content ⇒ Object
- #digest ⇒ Object
-
#initialize(file) ⇒ RedisScript
constructor
Loads the script file from disk and calculates its
SHA1
sum.
Constructor Details
#initialize(file) ⇒ RedisScript
Loads the script file from disk and calculates its SHA1
sum.
16 17 18 |
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 16 def initialize(file) @file = Pathname.new(file) end |
Instance Method Details
#call(redis, *args) ⇒ Object
Passes the script and supplied arguments to redis for evaulation. It first attempts to use a script redis has already cached by using the EVALSHA
command, but falls back to providing the full script text via EVAL
if redis has not seen this script before. Future invocations will then use EVALSHA
without erroring.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 31 def call(redis, *args) t = Time.now begin redis.evalsha(digest, *args) rescue => e e. =~ /NOSCRIPT/ ? redis.eval(content, *args) : raise end rescue => e if LuaError.intercepts?(e) raise LuaError.new(e, @file, content) else raise end end |
#content ⇒ Object
46 47 48 |
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 46 def content @content ||= load_lua(@file) end |
#digest ⇒ Object
50 51 52 |
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 50 def digest @digest ||= Digest::SHA1.hexdigest content end |