1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
require 'eventmachine'
require 'mysql2'
module Mysql2
module EM
class Client < ::Mysql2::Client
module Watcher
def initialize(client, deferable)
@client = client
@deferable = deferable
@is_watching = true
end
def notify_readable
detach
begin
result = @client.async_result
rescue StandardError => e
@deferable.fail(e)
else
@deferable.succeed(result)
end
end
def watching?
@is_watching
end
def unbind
@is_watching = false
end
end
def close(*args)
@watch.detach if @watch && @watch.watching?
super(*args)
end
def query(sql, opts = {})
if ::EM.reactor_running?
super(sql, opts.merge(async: true))
deferable = ::EM::DefaultDeferrable.new
@watch = ::EM.watch(socket, Watcher, self, deferable)
@watch.notify_readable = true
deferable
else
super(sql, opts)
end
end
end
end
end
|