Class: Redis::Connection::Ruby
- Inherits:
-
Object
- Object
- Redis::Connection::Ruby
show all
- Includes:
- CommandHelper
- Defined in:
- lib/redis/connection/ruby.rb
Constant Summary
collapse
- MINUS =
"-"
- PLUS =
"+"
- COLON =
":"
- DOLLAR =
"$"
- ASTERISK =
"*"
CommandHelper::COMMAND_DELIMITER
Class Method Summary
collapse
Instance Method Summary
collapse
#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
358
359
360
|
# File 'lib/redis/connection/ruby.rb', line 358
def connected?
!!@sock
end
|
#disconnect ⇒ Object
362
363
364
365
366
367
|
# File 'lib/redis/connection/ruby.rb', line 362
def disconnect
@sock.close
rescue
ensure
@sock = nil
end
|
412
413
414
415
416
417
418
419
|
# File 'lib/redis/connection/ruby.rb', line 412
def format_bulk_reply(line)
bulklen = line.to_i
return if bulklen == -1
reply = encode(@sock.read(bulklen))
@sock.read(2) reply
end
|
400
401
402
|
# File 'lib/redis/connection/ruby.rb', line 400
def format_error_reply(line)
CommandError.new(line.strip)
end
|
408
409
410
|
# File 'lib/redis/connection/ruby.rb', line 408
def format_integer_reply(line)
line.to_i
end
|
421
422
423
424
425
426
|
# File 'lib/redis/connection/ruby.rb', line 421
def format_multi_bulk_reply(line)
n = line.to_i
return if n == -1
Array.new(n) { read }
end
|
389
390
391
392
393
394
395
396
397
398
|
# File 'lib/redis/connection/ruby.rb', line 389
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
|
404
405
406
|
# File 'lib/redis/connection/ruby.rb', line 404
def format_status_reply(line)
line.strip
end
|
#get_tcp_keepalive ⇒ Object
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
|
#read ⇒ Object
381
382
383
384
385
386
387
|
# 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
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_nodelay ⇒ Object
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
|