Class: Redis::Connection::Ruby

Inherits:
Object
  • Object
show all
Includes:
CommandHelper
Defined in:
lib/redis/connection/ruby.rb

Constant Summary collapse

MINUS =
"-"
PLUS =
"+"
COLON =
":"
DOLLAR =
"$"
ASTERISK =
"*"

Constants included from CommandHelper

CommandHelper::COMMAND_DELIMITER

Class Method Summary collapse

Instance Method Summary collapse

Methods included from CommandHelper

#build_command

Constructor Details

#initialize(sock) ⇒ Ruby

Returns a new instance of Ruby.



354
355
356
# File 'lib/redis/connection/ruby.rb', line 354

def initialize(sock)
  @sock = sock
end

Class Method Details

.connect(config) ⇒ Object



300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
# File 'lib/redis/connection/ruby.rb', line 300

def self.connect(config)
  if config[:scheme] == "unix"
    raise ArgumentError, "SSL incompatible with unix sockets" if config[:ssl]

    sock = UNIXSocket.connect(config[:path], config[:connect_timeout])
  elsif config[:scheme] == "rediss" || config[:ssl]
    sock = SSLSocket.connect(config[:host], config[:port], config[:connect_timeout], config[:ssl_params])
  else
    sock = TCPSocket.connect(config[:host], config[:port], config[:connect_timeout])
  end

  instance = new(sock)
  instance.timeout = config[:read_timeout]
  instance.write_timeout = config[:write_timeout]
  instance.set_tcp_keepalive config[:tcp_keepalive]
  instance.set_tcp_nodelay if sock.is_a? TCPSocket
  instance
end

Instance Method Details

#connected?Boolean

Returns:

  • (Boolean)


358
359
360
# File 'lib/redis/connection/ruby.rb', line 358

def connected?
  !!@sock
end

#disconnectObject



362
363
364
365
366
367
# File 'lib/redis/connection/ruby.rb', line 362

def disconnect
  @sock.close
rescue
ensure
  @sock = nil
end

#format_bulk_reply(line) ⇒ Object



418
419
420
421
422
423
424
425
# File 'lib/redis/connection/ruby.rb', line 418

def format_bulk_reply(line)
  bulklen = line.to_i
  return if bulklen == -1

  reply = encode(@sock.read(bulklen))
  @sock.read(2) # Discard CRLF.
  reply
end

#format_error_reply(line) ⇒ Object



406
407
408
# File 'lib/redis/connection/ruby.rb', line 406

def format_error_reply(line)
  CommandError.new(line.strip)
end

#format_integer_reply(line) ⇒ Object



414
415
416
# File 'lib/redis/connection/ruby.rb', line 414

def format_integer_reply(line)
  line.to_i
end

#format_multi_bulk_reply(line) ⇒ Object



427
428
429
430
431
432
# File 'lib/redis/connection/ruby.rb', line 427

def format_multi_bulk_reply(line)
  n = line.to_i
  return if n == -1

  Array.new(n) { read }
end

#format_reply(reply_type, line) ⇒ Object



395
396
397
398
399
400
401
402
403
404
# File 'lib/redis/connection/ruby.rb', line 395

def format_reply(reply_type, line)
  case reply_type
  when MINUS    then format_error_reply(line)
  when PLUS     then format_status_reply(line)
  when COLON    then format_integer_reply(line)
  when DOLLAR   then format_bulk_reply(line)
  when ASTERISK then format_multi_bulk_reply(line)
  else raise ProtocolError, reply_type
  end
end

#format_status_reply(line) ⇒ Object



410
411
412
# File 'lib/redis/connection/ruby.rb', line 410

def format_status_reply(line)
  line.strip
end

#get_tcp_keepaliveObject



329
330
331
332
333
334
335
# File 'lib/redis/connection/ruby.rb', line 329

def get_tcp_keepalive
  {
    time: @sock.getsockopt(Socket::SOL_TCP, Socket::TCP_KEEPIDLE).int,
    intvl: @sock.getsockopt(Socket::SOL_TCP, Socket::TCP_KEEPINTVL).int,
    probes: @sock.getsockopt(Socket::SOL_TCP, Socket::TCP_KEEPCNT).int
  }
end

#readObject



381
382
383
384
385
386
387
388
389
390
391
392
393
# File 'lib/redis/connection/ruby.rb', line 381

def read
  line = @sock.gets
  reply_type = line.slice!(0, 1)
  format_reply(reply_type, line)
rescue Errno::EAGAIN
  raise TimeoutError
rescue OpenSSL::SSL::SSLError => ssl_error
  if ssl_error.message.match?(/SSL_read: unexpected eof while reading/i)
    raise EOFError, ssl_error.message
  else
    raise
  end
end

#set_tcp_keepalive(keepalive) ⇒ Object



320
321
322
323
324
325
326
327
# File 'lib/redis/connection/ruby.rb', line 320

def set_tcp_keepalive(keepalive)
  return unless keepalive.is_a?(Hash)

  @sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE,  true)
  @sock.setsockopt(Socket::SOL_TCP,    Socket::TCP_KEEPIDLE,  keepalive[:time])
  @sock.setsockopt(Socket::SOL_TCP,    Socket::TCP_KEEPINTVL, keepalive[:intvl])
  @sock.setsockopt(Socket::SOL_TCP,    Socket::TCP_KEEPCNT,   keepalive[:probes])
end

#set_tcp_nodelayObject



347
348
349
# File 'lib/redis/connection/ruby.rb', line 347

def set_tcp_nodelay
  @sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
end

#timeout=(timeout) ⇒ Object



369
370
371
# File 'lib/redis/connection/ruby.rb', line 369

def timeout=(timeout)
  @sock.timeout = timeout if @sock.respond_to?(:timeout=)
end

#write(command) ⇒ Object



377
378
379
# File 'lib/redis/connection/ruby.rb', line 377

def write(command)
  @sock.write(build_command(command))
end

#write_timeout=(timeout) ⇒ Object



373
374
375
# File 'lib/redis/connection/ruby.rb', line 373

def write_timeout=(timeout)
  @sock.write_timeout = timeout
end