Sha256: 47a86b130e9f9e6c2a6f3f0d70934e3c4938da97bb9bfd8fee4c8c6008cffcfb

Contents?: true

Size: 1.21 KB

Versions: 1

Compression:

Stored size: 1.21 KB

Contents

module ActiveRecord
  module Deferrable
    class Result < ActiveSupport::BasicObject
       
      # Represents a Lazy Loaded resultset.
      # Any method calls would block if the result hasn't yet been processed in a background
      # Thread. 
      #
      def initialize( &deferrable )
        defer!( deferrable )
      end

      # Calls a given procedure in a background Thread, on another
      # connection from the pool.Guarantees that said connection is checked
      # back in on completion.
      #
      def defer!( deferrable )
        @result = ::Thread.new( deferrable ) do |deferrable|
          begin
            deferrable.call 
          rescue => exception
            exception  
          ensure
            ::ActiveRecord::Base.connection_pool.release_connection            
          end
        end
        self
      end
      
      # Delegates to the background Thread.
      #
      def method_missing(*args, &block)
        @_result ||= @result.value
        validate!
        @_result.send(*args, &block)
      end 
      
      # Re-raise any Exceptions from the background Thread.
      #
      def validate!
        raise @_result if @_result.is_a?( ::Exception )
      end

    end    
  end
end  

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
methodmissing-mysqlplus_adapter-1.0.2 lib/active_record/connection_adapters/mysqlplus_adapter/deferrable/result.rb