Sha256: 76e133d4e53f604d4a2365962c2e4f65866a515fe4ea43088e220770c8070aaa
Contents?: true
Size: 1.43 KB
Versions: 1
Compression:
Stored size: 1.43 KB
Contents
require 'eventmachine' require 'swift' module Swift # Eventmachine Adapter Extensions. # # This replaces the Adapter#execute method with a non-blocking asynchronous version. class Adapter alias :blocking_execute :execute class EMHandler < EM::Connection def initialize adapter, record, defer @adapter = adapter @record = record @defer = defer end def notify_readable detach @adapter.pending.shift begin @defer.succeed(@record ? Result.new(@record, @adapter.result) : @adapter.result) rescue Exception => e @defer.fail(e) end end end # Execute a command asynchronously. # # @example # defer = Swift.db.execute(User, "select * from users where id = ?", 1) # defer.callback do |user| # p user.id # end # defer.errback do |error| # p error # end # # @see [Swift::Adapter] def execute command, *bind raise RuntimeError, 'Command already in progress' unless pending.empty? pending << command start = Time.now record, command = command, bind.shift if command.kind_of?(Class) && command < Record query(command, *bind) EM::DefaultDeferrable.new.tap do |defer| EM.watch(fileno, EMHandler, self, record, defer) {|c| c.notify_readable = true } end end def pending @pending ||= [] end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
swift-1.0.3 | lib/swift/eventmachine.rb |