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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
require 'uri'
class Redis
class Store < self
class Factory
DEFAULT_PORT = 6379
def self.create(*options)
new(options).create
end
def initialize(*options)
@addresses = []
@options = {}
extract_addresses_and_options(options)
end
def create
if @addresses.empty?
@addresses << {}
end
if @addresses.size > 1
::Redis::DistributedStore.new @addresses, @options
else
::Redis::Store.new @addresses.first.merge(@options)
end
end
def self.resolve(uri) #:api: private
if uri.is_a?(Hash)
extract_host_options_from_hash(uri)
else
extract_host_options_from_uri(uri)
end
end
def self.extract_host_options_from_hash(options)
options = normalize_key_names(options)
if host_options?(options)
options
else
nil
end
end
def self.normalize_key_names(options)
options = options.dup
if options.key?(:key_prefix) && !options.key?(:namespace)
options[:namespace] = options.delete(:key_prefix) # RailsSessionStore
end
options[:raw] = case
when options.key?(:serializer)
options[:serializer].nil?
when options.key?(:marshalling)
!options[:marshalling]
else
false
end
options
end
def self.host_options?(options)
if options.keys.any? {|n| [:host, :db, :port].include?(n) }
options
else
nil # just to be clear
end
end
def self.extract_host_options_from_uri(uri)
uri = URI.parse(uri)
_, db, namespace = if uri.path
uri.path.split(/\//)
end
options = {
:host => uri.hostname,
:port => uri.port || DEFAULT_PORT,
:password => uri.password
}
options[:db] = db.to_i if db
options[:namespace] = namespace if namespace
options
end
private
def extract_addresses_and_options(*options)
options.flatten.compact.each do |token|
resolved = self.class.resolve(token)
if resolved
@addresses << resolved
else
@options.merge!(self.class.normalize_key_names(token))
end
end
end
end
end
end
|