class Hiredis::Ruby::Connection

Meta-programming hiredis for redis async extension

Public Instance Methods

query(args) click to toggle source

Do redis query @param [Array] args equal to Hiredis write args

# File lib/midori-contrib/redic.rb, line 21
def query(args)
  await(Promise.new do |resolve|
    read_flag = false
    data = pre_write(args)
    written = 0
    EventLoop.register(@sock, :rw) do |monitor|
      if read_flag && monitor.readable?
        # Reading
        _read(resolve, @sock)
      end
      if !read_flag && monitor.writable?
        # Writing
        written += @sock.write_nonblock(data[written..-1])
        read_flag = true if written == string_size(data)
      end
    end
  end)
end

Private Instance Methods

_read(resolve, sock) click to toggle source
# File lib/midori-contrib/redic.rb, line 54
def _read(resolve, sock)
  @reader.feed @sock.read_nonblock(1024)
  reply = @reader.gets
  if reply
    EventLoop.deregister(sock)
    resolve.call(reply)
  end
end
pre_write(args) click to toggle source
# File lib/midori-contrib/redic.rb, line 41
def pre_write(args)
  command = []
  command << "*#{args.size}"
  args.each do |arg|
    arg = arg.to_s
    command << "$#{string_size arg}"
    command << arg
  end
  data = command.join(COMMAND_DELIMITER) + COMMAND_DELIMITER
  data.force_encoding('binary') if data.respond_to?(:force_encoding)
  data
end