Sha256: ef07547ad5bf9d9149a974b2de50ddeffc9c5a0872feaddd5d060b49bb4d3200

Contents?: true

Size: 1.32 KB

Versions: 1

Compression:

Stored size: 1.32 KB

Contents

require 'digest/sha1'

module Wolverine
  class LuaError < StandardError ; end
  class LuaCompilationError < LuaError ; end
  class LuaRuntimeError < LuaError ; end

  class Script
    attr_reader :content, :digest, :file
    def initialize file
      @file = file
      @content = load_lua file
      @digest = Digest::SHA1.hexdigest @content
    end

    def call redis, *args
      begin
        run_evalsha redis, *args
      rescue => e
        e.message =~ /NOSCRIPT/ ? run_eval(redis, *args) : raise
      end
    rescue => e
      if e.message =~ /ERR Error (compiling|running) script \(.*?\): \[.*?\]:(\d+): (.*)/
        stage, line_number, message = $1, $2, $3
        klass = (stage == "compiling") ? LuaCompilationError : LuaRuntimeError
        begin
          raise klass.new(message)
        rescue => e
          raise correct_lua_backtrace(e, file, line_number)
        end
      else
        raise
      end
    end

    private

    def correct_lua_backtrace(error, file, line_number)
      4.times { error.backtrace.shift }
      error.backtrace.unshift("#{file}:#{line_number}")
      error
    end

    def run_evalsha redis, *args
      redis.evalsha digest, args.size, *args
    end

    def run_eval redis, *args
      redis.eval content, args.size, *args
    end

    def load_lua file
      File.read file
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
wolverine-0.2.1 lib/wolverine/script.rb