Module: Familia

Includes:
Gibbler::Complex
Included in:
Bone, Customer, Limiter, Session
Defined in:
lib/familia.rb,
lib/familia.rb,
lib/familia.rb,
lib/familia/tools.rb,
lib/familia/object.rb,
lib/familia/helpers.rb,
lib/familia/redisobject.rb

Defined Under Namespace

Modules: ClassMethods, Collector, InstanceMethods, Stamps, Status, Tools, VERSION Classes: HashKey, List, NoIndex, NonUniqueKey, NotConnected, Problem, RedisObject, Set, SortedSet, String

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.apiversion(r = nil, &blk) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
# File 'lib/familia.rb', line 117

def apiversion(r=nil, &blk)
  if blk.nil?
    @apiversion = r if r;
  else
    tmp = @apiversion
    @apiversion = r
    blk.call
    @apiversion = tmp
  end
  @apiversion
end

.clientsObject (readonly)

Returns the value of attribute clients.



37
38
39
# File 'lib/familia.rb', line 37

def clients
  @clients
end

.debugObject

Returns the value of attribute debug.



38
39
40
# File 'lib/familia.rb', line 38

def debug
  @debug
end

.delimObject

Returns the value of attribute delim.



38
39
40
# File 'lib/familia.rb', line 38

def delim
  @delim
end

.dump_methodObject

Returns the value of attribute dump_method.



38
39
40
# File 'lib/familia.rb', line 38

def dump_method
  @dump_method
end

.load_methodObject

Returns the value of attribute load_method.



38
39
40
# File 'lib/familia.rb', line 38

def load_method
  @load_method
end

.loggerObject (readonly)

Returns the value of attribute logger.



37
38
39
# File 'lib/familia.rb', line 37

def logger
  @logger
end

.secretObject

Returns the value of attribute secret.



38
39
40
# File 'lib/familia.rb', line 38

def secret
  @secret
end

.uriObject Also known as: url

Returns the value of attribute uri.



37
38
39
# File 'lib/familia.rb', line 37

def uri
  @uri
end

Class Method Details

.classes(with_redis_objects = false) ⇒ Object



46
47
48
# File 'lib/familia.rb', line 46

def classes with_redis_objects=false
  with_redis_objects ? [@classes, RedisObject.classes].flatten : @classes
end

.connect(uri = nil) ⇒ Object



88
89
90
91
92
93
94
95
# File 'lib/familia.rb', line 88

def connect(uri=nil)
  uri &&= URI.parse uri if String === uri
  uri ||= Familia.uri
  conf = uri.conf
  redis = Redis.new conf
  Familia.trace(:CONNECT, redis, conf.inspect, caller[0..3])
  @clients[uri.serverid] = redis
end

.connected?(uri = nil) ⇒ Boolean

Returns:

  • (Boolean)


102
103
104
105
# File 'lib/familia.rb', line 102

def connected?(uri=nil)
  uri &&= URI.parse uri if String === uri
  @clients.has_key?(uri.serverid)
end

.debug?Boolean

Returns:

  • (Boolean)


42
# File 'lib/familia.rb', line 42

def debug?() @debug == true end

.default_suffix(a = nil) ⇒ Object



106
# File 'lib/familia.rb', line 106

def default_suffix(a=nil) @suffix = a if a; @suffix end

.default_suffix=(a) ⇒ Object



107
# File 'lib/familia.rb', line 107

def default_suffix=(a) @suffix = a end

.included(obj) ⇒ Object



153
154
155
156
157
158
159
# File 'lib/familia.rb', line 153

def self.included(obj)
  obj.send :include, Familia::InstanceMethods
  obj.send :include, Gibbler::Complex
  obj.extend Familia::ClassMethods
  obj.class_zset :instances, :class => obj, :reference => true
  Familia.classes << obj
end

.index(r = nil) ⇒ Object



108
# File 'lib/familia.rb', line 108

def index(r=nil)  @index = r if r; @index end

.index=(r) ⇒ Object



109
# File 'lib/familia.rb', line 109

def index=(r) @index = r; r end

.info(*msg) ⇒ Object



43
44
45
# File 'lib/familia.rb', line 43

def info *msg
  STDERR.puts *msg
end

.join(*r) ⇒ Object



110
# File 'lib/familia.rb', line 110

def join(*r) r.join(Familia.delim) end

.ld(*msg) ⇒ Object



49
50
51
# File 'lib/familia.rb', line 49

def ld *msg
  info *msg if debug?
end

.log(level, path) ⇒ Object



82
83
84
85
86
87
# File 'lib/familia.rb', line 82

def log(level, path)
  logger = Log4r::Logger.new('familia')
  logger.outputters = Log4r::FileOutputter.new 'familia', :filename => path
  logger.level = Log4r.const_get(level)
  logger
end

.now(n = Time.now) ⇒ Object



128
129
130
# File 'lib/familia.rb', line 128

def now n=Time.now
  n.utc.to_i
end

.qnow(quantum = 10.minutes, now = Familia.now) ⇒ Object

A quantized timestamp e.g. 12:32 -> 12:30



134
135
136
137
# File 'lib/familia.rb', line 134

def qnow quantum=10.minutes, now=Familia.now
  rounded = now - (now % quantum)
  Time.at(rounded).utc.to_i
end

.reconnect_all!Object



96
97
98
99
100
101
# File 'lib/familia.rb', line 96

def reconnect_all!
  Familia.classes.each do |klass|
    klass.redis.client.reconnect
    Familia.info "#{klass} ping: #{klass.redis.ping}" if debug?
  end
end

.redis(uri = nil) ⇒ Object

A convenience method for returning the appropriate Redis connection. If uri is an Integer, we’ll treat it as a database number. If it’s a String, we’ll treat it as a full URI (e.g. redis://1.2.3.4/15). Otherwise we’ll return the default connection.



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/familia.rb', line 70

def redis(uri=nil)
  if Integer === uri
    tmp = Familia.uri
    tmp.db = uri
    uri = tmp
  elsif String === uri
    uri &&= URI.parse uri
  end
  uri ||= Familia.uri
  connect(uri) unless @clients[uri.serverid]
  @clients[uri.serverid]
end

.rediskey(*args) ⇒ Object



112
113
114
115
116
# File 'lib/familia.rb', line 112

def rediskey *args
  el = args.flatten.compact
  el.unshift @apiversion unless @apiversion.nil?
  el.join(Familia.delim)
end

.split(r) ⇒ Object



111
# File 'lib/familia.rb', line 111

def split(r) r.split(Familia.delim) end

.trace(label, redis_instance, ident, context = nil) ⇒ Object



52
53
54
55
56
57
58
59
60
# File 'lib/familia.rb', line 52

def trace label, redis_instance, ident, context=nil
  return unless Familia.debug?
  codeline = if context
    context = [context].flatten
    context.reject! { |line| line =~ /lib\/familia/ }
    context.first
  end
  info "[%s] -> %s <- %s %s" % [label, codeline, redis_instance.id, ident]
end