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.
350
351
352
|
# File 'lib/redis/connection/ruby.rb', line 350
def initialize(sock)
@sock = sock
end
|
Class Method Details
.connect(config) ⇒ Object
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
# File 'lib/redis/connection/ruby.rb', line 296
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
354
355
356
|
# File 'lib/redis/connection/ruby.rb', line 354
def connected?
!!@sock
end
|
#disconnect ⇒ Object
358
359
360
361
362
363
|
# File 'lib/redis/connection/ruby.rb', line 358
def disconnect
@sock.close
rescue
ensure
@sock = nil
end
|
408
409
410
411
412
413
414
415
|
# File 'lib/redis/connection/ruby.rb', line 408
def format_bulk_reply(line)
bulklen = line.to_i
return if bulklen == -1
reply = encode(@sock.read(bulklen))
@sock.read(2) reply
end
|
396
397
398
|
# File 'lib/redis/connection/ruby.rb', line 396
def format_error_reply(line)
CommandError.new(line.strip)
end
|
404
405
406
|
# File 'lib/redis/connection/ruby.rb', line 404
def format_integer_reply(line)
line.to_i
end
|
417
418
419
420
421
422
|
# File 'lib/redis/connection/ruby.rb', line 417
def format_multi_bulk_reply(line)
n = line.to_i
return if n == -1
Array.new(n) { read }
end
|
385
386
387
388
389
390
391
392
393
394
|
# File 'lib/redis/connection/ruby.rb', line 385
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
|
400
401
402
|
# File 'lib/redis/connection/ruby.rb', line 400
def format_status_reply(line)
line.strip
end
|
#get_tcp_keepalive ⇒ Object
325
326
327
328
329
330
331
|
# File 'lib/redis/connection/ruby.rb', line 325
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
377
378
379
380
381
382
383
|
# File 'lib/redis/connection/ruby.rb', line 377
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
316
317
318
319
320
321
322
323
|
# File 'lib/redis/connection/ruby.rb', line 316
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
343
344
345
|
# File 'lib/redis/connection/ruby.rb', line 343
def set_tcp_nodelay
@sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
end
|
#timeout=(timeout) ⇒ Object
365
366
367
|
# File 'lib/redis/connection/ruby.rb', line 365
def timeout=(timeout)
@sock.timeout = timeout if @sock.respond_to?(:timeout=)
end
|
#write(command) ⇒ Object
373
374
375
|
# File 'lib/redis/connection/ruby.rb', line 373
def write(command)
@sock.write(build_command(command))
end
|
#write_timeout=(timeout) ⇒ Object
369
370
371
|
# File 'lib/redis/connection/ruby.rb', line 369
def write_timeout=(timeout)
@sock.write_timeout = timeout
end
|